ESP8266 MQTT

Trong hướng dẫn này, chúng ta sẽ khám phá cách sử dụng ESP8266 để gửi và nhận dữ liệu với một broker MQTT sử dụng giao thức MQTT. Cụ thể, chúng ta sẽ đề cập đến những nội dung sau:

ESP8266 NodeMCU mqtt

Chúng ta sẽ đi sâu vào hai tình huống riêng biệt:

Phần cứng cần chuẩn bị

1×ESP8266 NodeMCU ESP-12E
1×Recommended: ESP8266 NodeMCU ESP-12E (Uno-form)
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 ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

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

Về ESP8266 và MQTT

Nếu bạn chưa quen với giao thức MQTT, bạn có thể tìm thông tin về nó trên mạng. Bài hướng dẫn này tập trung vào việc sử dụng ESP8266 để gửi và nhận dữ liệu thông qua MQTT.

Dưới đây là một số cách ESP8266 có thể được sử dụng với MQTT:

  • Bạn có thể kết nối ESP8266 với một broker MQTT trực tuyến như Mosquitto hoặc AWS IoT.
  • Ngoài ra, bạn có thể kết nối ESP8266 với một broker MQTT được cài đặt trên máy tính của bạn, như Mosquitto hoặc HiveMQ.
  • Nếu bạn có Raspberry Pi, ESP8266 có thể kết nối với một broker MQTT đang chạy trên thiết bị đó, ví dụ Mosquitto.
  • Ngoài ra, ESP8266 có thể kết nối với một broker MQTT dựa trên đám mây, chẳng hạn như Mosquitto hoặc HiveMQ trên AWS EC2.

Trong bài hướng dẫn này, chúng ta sẽ bắt đầu bằng cách kiểm tra xem ESP8266 có thể kết nối với một broker Mosquitto trực tuyến hay không. Chúng ta sẽ chứng minh khả năng của ESP8266 trong việc gửi và nhận dữ liệu thông qua broker này trên Internet.

Tiếp theo, chúng tôi sẽ hướng dẫn bạn cách thiết lập máy chủ Mosquitto trên máy tính của bạn. ESP8266 sau đó sẽ kết nối với máy chủ này, cho phép bạn tiếp tục gửi và nhận dữ liệu.

Sau khi bạn hoàn thành hướng dẫn này, bạn có thể đào sâu hơn bằng cách khám phá các bài hướng dẫn bổ sung này:

Những nguồn tài nguyên này sẽ cung cấp thêm cái nhìn sâu sắc về các chủ đề liên quan.

Kết nối ESP8266 với một máy chủ MQTT trực tuyến

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

Mã ESP8266

Đoạn mã ESP8266 dưới đây thực hiện những gì:

  • Kết nối tới broker MQTT
  • Đăng ký một chủ đề
  • Định kỳ phát tin nhắn tới cùng một chủ đề mà nó đã đăng ký
/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-mqtt */ #include <ESP8266WiFi.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-esp8266-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 ESP8266 should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-esp8266-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp8266-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); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); 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("ESP8266 - 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("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - 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("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Hướng dẫn từng bước

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

  • Xem hướng dẫn ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
  • Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, chẳng hạn như (ví dụ NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
  • Mở Trình quản lý thư viện bằng cách nhấp vào biểu tượng ở thanh điều hướng bên trái của Arduino IDE.
  • Nhập MQTT vào hộp tìm kiếm, sau đó tìm thư viện MQTT do Joel Gaehwiler phát hành.
  • Nhấp nút Cài đặt để cài đặt thư viện MQTT.
thư viện mqtt cho ESP8266 NodeMCU
  • ArduinoJson vào ô tìm kiếm, sau đó tìm thư viện ArduinoJson của Benoit Blanchon.
  • Nhấn nút Cài đặt để cài đặt thư viện ArduinoJson.
thư viện json cho ESP8266 NodeMCU
  • Sao chép đoạn mã ở trên và mở bằng Arduino IDE.
  • Thay thế thông tin WiFi (SSID và mật khẩu) trong mã bằng của bạn.
  • Trong mã sẽ có từ 'YOUR-NAME' xuất hiện ba lần. Thay chữ này bằng tên của bạn hoặc ký tự ngẫu nhiên (chỉ chữ cái, không có khoảng trắng). Điều này là cần thiết vì nếu bạn không thực hiện thay đổi, có thể có nhiều người cùng chạy mã này một lúc, điều này có thể gây xung đột vì ID client MQTT và các chủ đề (topics) sẽ giống nhau cho mọi người.
  • Nhấn nút Tải lên trên Arduino IDE để tải mã lên ESP8266.
  • Mở Serial Monitor.
  • Xem kết quả trên Serial Monitor.
COM6
Send
ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: YOUR-NAME-esp8266-001/loopback ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":11757,"data":255} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":11757,"data":255} ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":16896,"data":259} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Như bạn có thể thấy, ESP8266 gửi tin nhắn tới broker MQTT, rồi nhận lại đúng tin nhắn đó. Đó là vì mã ở trên đăng ký nhận (subscribe) cùng một chủ đề mà nó phát dữ liệu tới (publish). Nếu bạn không muốn ESP8266 nhận được tin nhắn mà nó phát, chỉ cần làm cho chủ đề SUBSCRIBE khác với chủ đề PUBLISH.

Kết nối ESP8266 với broker MQTT được cài đặt trên máy tính của bạn

Cài đặt máy chủ MQTT Mosquitto

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

Chạy máy chủ MQTT Mosquitto

Bây giờ, hãy kiểm tra xem broker MQTT có hoạt động đúng hay 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:\mqtt\mosquitto>
  • Tạo một tệp tin mới có tên test.conf, sao chép nội dung dưới đây và lưu nó vào thư mục đó:
listener 1883 allow_anonymous true
  • Chạy Command Prompt với quyền quản trị trên máy tính của bạn. Hãy gọi nó là Broker Window. Không đóng nó cho đến khi kết thúc bài hướng dẫn
quản trị viên dòng lệnh windows
  • Chạy các lệnh dưới đây lần lượt:
cd /d D:\mqtt\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:\mqtt\mosquitto D:\mqtt\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 ở chế độ Quản trị viên trên máy tính của bạn.
  • Tìm địa chỉ IP của máy tính của bạn 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 để dùng sau. Trong ví dụ ở trên: 192.168.0.26

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

  • Mở một Command Prompt khác trên máy tính của bạn với quyền quản trị. Gọi nó là Cửa sổ người đăng ký
  • Đăng ký một chủ đề bằng cách chạy các lệnh dưới đây lần lượt (thay bằng địa chỉ IP của bạn):
cd /d D:\mqtt\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
  • Mở một cửa sổ Command Prompt khác với quyền quản trị trên máy tính của bạn. Gọi nó là Cửa sổ Nhà phát hành
  • Đăng một thông điệp lên cùng một chủ đề bằng cách lần lượt chạy các lệnh dưới đây (thay thế bằng địa chỉ IP của bạn):
cd /d D:\mqtt\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-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:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!" D:\mqtt\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:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send Hello, MQTT!

Bây giờ, bạn đã cài đặt thành công broker MQTT Mosquitto trên máy tính của bạn. Vui lòng KHÔNG đóng ba cửa sổ: Cửa sổ Broker, Cửa sổ Người đăng ký, và Cửa sổ Người xuất bản. Chúng ta sẽ sử dụng chúng ở phần tiếp theo.

Mã ESP8266

Mã ESP8266 dưới đây thực hiện những gì:

  • Kết nối với máy chủ MQTT
  • Đăng ký nhận một chủ đề
  • Định kỳ phát tin nhắn đến một chủ đề khác
/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-mqtt */ #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP8266-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 "esp8266-001/send" #define SUBSCRIBE_TOPIC "esp8266-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); 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("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - 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("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - 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"]; */ }

Hướng dẫn từng bước

  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Thay thế thông tin WiFi (SSID và mật khẩu) trong mã bằng của bạn.
  • Thay thế địa chỉ broker MQTT trong mã (tên miền hoặc địa chỉ IP).
  • Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên ESP8266

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

Mã ESP8266 phát dữ liệu tới chủ đề MQTT esp8266-001/send, Cửa sổ người nhận trên PC đăng ký nhận chủ đề đó để nhận dữ liệu.

  • Mở Serial Monitor, bạn sẽ thấy ESP8266 định kỳ phát một tin nhắn lên một chủ đề.
COM6
Send
ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266-001/receive ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":10708,"data":311} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":15837,"data":298} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":20965,"data":291} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Kiểm tra Cửa sổ người đăng ký, bạn sẽ thấy nó nhận được tin nhắn do ESP8266 phát hành 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:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-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 ESP8266 qua MQTT

ESP8266 đăng ký nhận chủ đề esp8266-001/receive, Cửa sổ Người phát hành trên PC, gửi một tin nhắn tới chủ đề đó để gửi nó tới ESP8266.

  • Phát một thông điệp tới chủ đề mà ESP8266 đã đăng ký bằng cách chạy lệnh sau trên Cửa sổ Người phát hành:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/receive -m "Hello, ESP8266!"
  • Bạn sẽ thấy thông điệp này được ESP8266 nhận trên Serial Monitor như dưới đây:
COM6
Send
ESP8266 - received from MQTT: - topic: esp8266-001/receive - payload: Hello, ESP8266!
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.