ESP32 MQTT

Trong hướng dẫn này, chúng ta sẽ khám phá cách sử dụng ESP32 để gửi và nhận dữ liệu từ MQTT broker bằng giao thức MQTT. Cụ thể, chúng ta sẽ tìm hiểu:

ESP32 mqtt

Chúng ta sẽ tìm hiểu hai tình huống khác nhau:

Linh Kiện Cần Thiết

1×mô-đun phát triển ESP-WROOM-32
1×Alternatively, ESP32 Uno-form board
1×Alternatively, ESP32 S3 Uno-form board
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về ESP32 và MQTT

Nếu bạn đã quen thuộc với giao thức MQTT thì tuyệt vời! Nếu chưa, bạn có thể tìm hiểu online. Hướng dẫn này tập trung vào việc sử dụng ESP32 để gửi và nhận dữ liệu bằng MQTT.

Dưới đây là một số cách ESP32 có thể hoạt động với MQTT:

  • Kết nối ESP32 với MQTT broker trực tuyến như Mosquitto hoặc AWS IoT.
  • Kết nối ESP32 với MQTT broker được cài đặt trên máy tính của bạn, như Mosquitto hoặc HiveMQ.
  • Kết nối ESP32 với MQTT broker chạy trên Raspberry Pi của bạn, ví dụ Mosquitto.
  • Kết nối ESP32 với MQTT broker dựa trên cloud, như Mosquitto hoặc HiveMQ trên AWS EC2.

Trong hướng dẫn này, chúng ta sẽ bắt đầu bằng việc xem ESP32 có thể kết nối với Mosquitto broker trực tuyến hay không. Chúng ta sẽ có ESP32 gửi và nhận dữ liệu thông qua broker này qua internet.

Sau đó, chúng ta sẽ thiết lập Mosquitto broker trên máy tính của chúng ta. Chúng ta sẽ kết nối ESP32 với broker cục bộ này và tiếp tục gửi và nhận dữ liệu.

Khi bạn đã hoàn thành hướng dẫn này, bạn có thể khám phá thêm bằng cách xem những hướng dẫn khác:

Những liên kết này sẽ cung cấp hướng dẫn thêm về các chủ đề liên quan.

Kết nối ESP32 với MQTT broker trực tuyến

Trong phần này, chúng ta sẽ học cách kết nối ESP32 với test.mosquitto.org, một MQTT broker trực tuyến được tạo bởi Mosquitto. Xin lưu ý rằng broker này chỉ nên được sử dụng cho mục đích thử nghiệm.

Code ESP32

Code ESP32 dưới đây sẽ:

  • Kết nối với MQTT broker
  • Subscribe một topic
  • Định kỳ publish tin nhắn đến cùng topic mà nó subscribe
/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-esp32-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP32 should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("ESP32 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP32 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Các Bước Thực Hiện

  • Mới sử dụng ESP32? Hãy bắt đầu với hướng dẫn ESP32 - Cài Đặt Phần Mềm để học các kiến thức cơ bản trước.
  • Thực hiện đấu nối như hình trên.
  • Kết nối bo mạch ESP32 với PC của bạn qua cáp USB
  • Mở Arduino IDE trên PC của bạn.
  • Chọn đúng bo mạch ESP32 (ví dụ: ESP32 Dev Module) và cổng COM.
  • Mở Arduino IDE trên PC của bạn
  • Mở Library Manager bằng cách click vào biểu tượng Library Manager trên thanh điều hướng bên trái của Arduino IDE
  • MQTT trong hộp tìm kiếm, sau đó tìm thư viện MQTT của Joel Gaehwiler.
  • Click nút Install để cài đặt thư viện MQTT.
ESP32 mqtt thư viện
  • ArduinoJson trong hộp tìm kiếm, sau đó tìm thư viện ArduinoJson của Benoit Blanchon.
  • Click nút Install để cài đặt thư viện ArduinoJson.
ESP32 json thư viện
  • Copy code ở trên và mở bằng Arduino IDE
  • Thay thế thông tin WiFi (SSID và password) trong code bằng thông tin của bạn.
  • Trong code, bạn sẽ thấy từ 'YOUR-NAME' ba lần. Thay thế từ này bằng tên của bạn hoặc các ký tự ngẫu nhiên (chỉ ký tự chữ cái, không có dấu cách). Điều này cần thiết vì nếu bạn không thực hiện thay đổi này, có thể nhiều người chạy code này cùng lúc, điều này có thể dẫn đến xung đột vì MQTT client ID và topic giống nhau cho mọi người.
  • Click nút Upload trên Arduino IDE để upload code lên ESP32
  • Mở Serial Monitor
  • Xem kết quả trên Serial Monitor.
COM6
Send
ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: YOUR-NAME-esp32-001/loopback ESP32 - MQTT broker Connected! ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":11757,"data":255} ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":11757,"data":255} ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":16896,"data":259} ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Như bạn có thể quan sát, ESP32 publish tin nhắn đến MQTT broker và sau đó nhận lại cùng tin nhắn đó. Điều này xảy ra vì code được cung cấp subscribe cùng topic mà nó publish dữ liệu. Nếu bạn muốn ESP32 không nhận tin nhắn mà nó publish, bạn có thể dễ dàng thực hiện điều này bằng cách làm cho SUBSCRIBE topic khác với PUBLISH topic.

Kết nối ESP32 với MQTT broker được cài đặt trên PC của bạn

Cài đặt Mosquitto MQTT Broker

  • Tải xuống Mosquitto MQTT Broker
  • Cài đặt nó trên ổ D: thay vì ổ C:. Tránh cài đặt Mosquitto broker trên ổ C: để tránh các vấn đề tiềm ẩn.

Chạy Mosquitto MQTT broker

Bây giờ, hãy kiểm tra xem MQTT broker có hoạt động đúng không bằng cách làm theo các bước sau:

  • Đi đến thư mục nơi Mosquitto được cài đặt. Ví dụ: D:\Draft\mosquitto>
  • Tạo một file mới có tên test.conf, copy nội dung dưới đây và lưu nó trong thư mục đó:
listener 1883 allow_anonymous true
  • Chạy Command Prompt với quyền Administrator trên PC của bạn. Gọi nó là Broker Window. Đừng đóng nó cho đến khi kết thúc hướng dẫn.
windows command prompt administrator
  • Chạy các lệnh dưới đây từng lệnh một:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • Bạn sẽ thấy:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Mở một Command Prompt khác với quyền Administrator trên PC của bạn.
  • Tìm địa chỉ IP của PC bằng cách chạy lệnh dưới đây:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.26 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Ghi lại địa chỉ IP để sử dụng sau này. Trong ví dụ trên: 192.168.0.26

Kiểm tra xem Mosquitto Broker có hoạt động không

  • Mở một Command Prompt khác với quyền Administrator trên PC của bạn. Gọi nó là Subscriber Window
  • Subscribe một topic bằng cách chạy các lệnh dưới đây từng lệnh một (thay thế bằng địa chỉ IP của bạn):
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send
  • Mở một Command Prompt khác với quyền Administrator trên PC của bạn. Gọi nó là Publisher Window
  • Publish một tin nhắn đến cùng topic bằng cách chạy các lệnh dưới đây từng lệnh một (thay thế bằng địa chỉ IP của bạn):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/send -m "Hello, MQTT!"
  • Bạn sẽ thấy:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Bạn sẽ thấy tin nhắn được chuyển tiếp đến Subscriber Window như sau:

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send Hello, MQTT!

Bây giờ, bạn đã cài đặt thành công Mosquitto MQTT broker trên PC của mình. Vui lòng KHÔNG đóng ba cửa sổ: Broker Window, Subscriber Window, và Publisher Window. Chúng ta sẽ sử dụng chúng tiếp theo.

Code ESP32

Code ESP32 dưới đây sẽ:

  • Kết nối với MQTT broker
  • Subscribe một topic
  • Định kỳ publish tin nhắn đến topic khác
/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP32-001" // CHANGE IT AS YOU DESIRE const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED // The MQTT topics that this device should publish/subscribe #define PUBLISH_TOPIC "esp32-001/send" #define SUBSCRIBE_TOPIC "esp32-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("ESP32 - Connecting to MQTT broker"); while (!mqtt.connect(CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP32 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Các Bước Thực Hiện

  • Copy code ở trên và mở bằng Arduino IDE
  • Thay thế thông tin WiFi (SSID và password) trong code bằng thông tin của bạn.
  • Thay thế địa chỉ MQTT broker trong code (tên miền hoặc địa chỉ IP).
  • Click nút Upload trên Arduino IDE để upload code lên ESP32

Gửi tin nhắn từ ESP32 đến PC qua MQTT

Code ESP32 publish dữ liệu đến MQTT topic esp32-001/send, Subscriber Window trên PC subscribe topic đó để nhận dữ liệu.

  • Mở Serial Monitor, bạn sẽ thấy ESP32 định kỳ publish tin nhắn đến một topic.
COM6
Send
ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: esp32-001/receive ESP32 - MQTT broker Connected! ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":10708,"data":311} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":15837,"data":298} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":20965,"data":291} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Kiểm tra Subscriber Window, bạn sẽ thấy nó nhận được tin nhắn được publish bởi ESP32 như dưới đây:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Gửi tin nhắn từ PC đến ESP32 qua MQTT

ESP32 subscribe topic esp32-001/receive, Publisher Window trên PC publish tin nhắn đến topic đó để gửi nó đến ESP32.

  • Publish một tin nhắn đến topic mà ESP32 đã subscribe bằng cách chạy lệnh sau trên Publisher Window:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/receive -m "Hello, ESP32!"
  • Bạn sẽ thấy tin nhắn này được nhận bởi ESP32 trên Serial Monitor như dưới đây:
COM6
Send
ESP32 - received from MQTT: - topic: esp32-001/receive - payload: Hello, ESP32!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.