Hướng dẫn MQTT ESP32 cho người mới bắt đầu học điện tử

MQTT là giao thức gửi tin nhắn thường dùng trong các ứng dụng IoT, có thời gian nhanh chóng. Trong đó, MQTT ESP32 là dự án phù hợp cho những người mới tìm hiểu về điện tử. Đây là dự án có chi phí khá rẻ, lượng tiêu thụ điện năng thấp và phù hợp cho các thiết bị chạy bằng pin. Trong bài viết này, IoTZone sẽ hướng dẫn bạn cách làm một dự án MQTT với ESP32 chi tiết nhé!

MQTT là gì? ESP32 là gì?

MQTT là viết tắt của Message Queuing Telemetry Transport, đây là một giao thức truyền tin nhắn (Message) để giao tiếp giữa các thiết bị này với thiết bị khác. Đây là giao thức thường thấy trong các ứng dụng Internt of Things (IoT), ví dụ như cảm biến, các thiết bị đeo trên người như đồng hồ đeo tay,… mà cần phải thường xuyên gửi nhận dữ liệu nhưng lại có nguồn tài nguyên cũng như lượng băng thông không nhiều.

MQTT ESP32 là gì?
MQTT ESP32 là gì?

Về ESP32, đây là một phiên bản nâng cấp của ESP8266, có chi phí khá rẻ và lượng tiêu thụ điện năng thấp. Chúng đã được cải tiến có thêm tính năng Bluetooth, WiFi và CPU lõi kép hoạt động ở mức 80 – 240 MHz. Do đó, đây là lựa chọn lý tưởng cho các ứng dụng IoT.

Lợi ích của MQTT ESP32

Việc sử dụng giao thức MQTT trên vi điều khiển ESP32 mang lại nhiều lợi ích:

  • MQTT là giao thức nhẹ, rất lý tưởng cho các thiết bị có băng thông và lượng điện tiêu thụ hạn chế như ESP32
  • MQTT hỗ trợ nhiều dịch vụ khác nhau với mức độ tin cậy cao, phù hợp với chip ESP32. Bạn có thể sử dụng ESP32 với các dự án MQTT ngay cả khi mạng không ổn định
  • MQTT ESP32 được dùng khá nhiều trong các dự án IoT, đây là giải pháp đơn giản hóa việc kết nối các thiết bị IoT với nhau nhằm giám sát các dữ liệu trên mạng.

Nhìn chung, các dự án MQTT trên ESP32 là lựa chọn đáng sử dụng khi cần kết nối không dây và truyền tải dữ liệu giữa các thiết bị. Mình cũng thường dùng đến giao thức này. Dưới đây, mình sẽ hướng dẫn bạn cách xây dựng dự án MQTT chi tiết cho bạn tham khảo nhé!

Chuẩn bị một MQTT Broker

Trước khi xây dựng dự án về MQTT ESP32, bạn cần chuẩn bị một MQTT Broker để có thể liên lạc và giám sát thông tin giữa các thiết bị. Mình thường sử dụng EMQX Cloud. Đây là một dịch vụ MQTT Cloud cho phép chúng ta toàn quyền quản lý, để có thể kết nối với số lượng lớn các thiết bị IoT và hỗ trợ tích hợp nhiều Database khác nhau.

Với MQTT ESP32, bạn thậm chí có thể chạy giao thức MQTT ở hơn 20 khu vực khá nhau trên Google Cloud, Amazon Web Services và Microsoft một cách nhanh chóng.

Sử dụng MQTT Broker để làm dự án MQTT ESP32

Trong bài viết này, mình sẽ sử dụng MQTT Broker public miễn phí để làm quy trình được đơn giản hơn:

  • TCP Port: 1883
  • Server: broker.emqx.io
  • SSL/TLS Port: 8883
  • WebSocket Port: 8083
  • Secure WebSocket Port: 8084

Hướng dẫn xây dựng dự án MQTT ESP32

Dưới đây là các bước chi tiết để bạn xây dựng một dự án MQTT ESP32:

Cài đặt ESP32 trong Arduino IDE

Arduino là một nền tảng mã nguồn mở, có phần cứng và phần mềm rất phổ biến và dễ sử dụng, mình nghĩ dân Makers chắc ai cũng biết về nền tảng này.

Trong dự án này, mình sẽ sử dụng Arduino IDE để kết nối ESP32 với máy tính. Chúng sẽ hỗ trợ upload code vào mạch ESP32 và đảm nhiệm công việc giao tiếp giữa ESP32 và máy tính.

Nếu Arduino IDE của bạn chưa hỗ trợ mạch ESP32, bạn hãy cài tiện ích ESP32 trong phần mềm theo hướng dẫn sau nhé: Cách lập trình ESP32 bằng Arduino IDE (Windows, Linux, Mac OS X)

Cài đặt PubSubClient

Tiếp theo, bạn hãy cái thư viện Client MQTT PubSubClient nhé! Đây là một thư viện được phát triển bởi Nick O’Leary, nhằm phục vụ cho các dự án MQTT ESP32 với một cách thức giao tiếp đơn giản và hiệu quả hơn giữa các thiết bị IoT dựa trên nền tảng Arduino.

Bạn hãy làm theo các bước sau để cài thư viện:

  1. Mở Arduino, chọn vào Project trong menu
  2. Chọn vào mục Load library >> Library Manager
  3. Gõ dòng chữ PubSubClient vào trong thanh tìm kiếm và nhấn OK
  4. Tìm kiếm thư viện do Nick O’Leary phát triển và nhấn vào nút Install để cài đặt
Cài thư viện PubSubClient cho dự án MQTT ESP32
Cài thư viện PubSubClient cho dự án MQTT ESP32

Xây dựng kết nối MQTT

Kết nối TCP

1. Đầu tiên, mình cần nhập WiFi và PubSubClient cho thư viện, để mạch ESP32 có thể kết nối với WiFi và kết nối với MQTT Broker để gửi tin nhắn cuxngg như đăng ký chủ đề:

#include <WiFi.h>
#include <PubSubClient.h>

2. Cấu hình thông tin WiFI (gồm tên, mật khẩu) và địa chỉ, cổng của MQTT Broker tới emqx/esp32:

// WiFi
const char *ssid = "xxxxx"; // Enter your WiFi name
const char *password = "xxxxx";  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "emqx/esp32";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

3. Kết nối và hiển thị chương trình:

// Set software serial baud to 115200;
Serial.begin(115200);
// Connecting to a Wi-Fi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
}

4. Kết nối với MQTT Broker qua PubSubClient:

client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
    String client_id = "esp32-client-";
    client_id += String(WiFi.macAddress());
    Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
        Serial.println("Public EMQX MQTT broker connected");
    } else {
        Serial.print("failed with state ");
        Serial.print(client.state());
        delay(2000);
    }
}

TLS/SSL

Khi sử dụng TLS trong giao thức MQTT, chúng sẽ giúp tăng tính bảo mật cho các thông tin trong hệ thống. Dưới đây là đoạn code:

#include <WiFiClientSecure.h>

const char* ca_cert= \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" \
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" \
"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" \
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" \
"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" \
"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" \
"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" \
"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" \
"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" \
"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" \
"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" \
"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" \
"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" \
"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" \
"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" \
"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" \
"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" \
"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" \
"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=" \
"-----END CERTIFICATE-----\n";

// init wifi secure client
WiFiClientSecure espClient;

espClient.setCACert(ca_cert);

Code thô trên Github

Gửi tin nhắn & Đăng ký chủ đề

Sau khi kết nối MQTT Broker thành công, mạch ESP32 sẽ gửi một tin nhắn public và đăng ký vào chủ đề emqx/esp32:

// publish and subscribe
client.publish(topic, "Hi, I'm ESP32 ^^");
client.subscribe(topic);

Nhận tin nhắn MQTT

Bạn có thể tạo một chức năng gọi lại để in tên chủ đề lên trên cổng Serial và in ra thông báo đã nhận được từ chủ đề emqx/esp32:

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    }
    Serial.println();
    Serial.println("-----------------------");
}

Chương trình đầy đủ

Mình đã tạo sẵn full code cho chương trình MQTT ESP32 này bên dưới, bạn có thể tải về, thay đổi một số thông tin cần thiết như mạng WiFi rồi dùng thử nhé:

#include <WiFi.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = "xxxxx"; // Enter your Wi-Fi name
const char *password = "xxxxx";  // Enter Wi-Fi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "emqx/esp32";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    // Set software serial baud to 115200;
    Serial.begin(115200);
    // Connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi..");
    }
    Serial.println("Connected to the Wi-Fi network");
    //connecting to a mqtt broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp32-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Public EMQX MQTT broker connected");
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    // Publish and subscribe
    client.publish(topic, "Hi, I'm ESP32 ^^");
    client.subscribe(topic);
}

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    }
    Serial.println();
    Serial.println("-----------------------");
}

void loop() {
    client.loop();
}

Thử nghiệm chương trình & Quan sát kết quả

Dưới đây là các bước cơ bản để bạn chạy thử chương trình MQTT ESP32 này:

  1. Kết nối ESP32 với máy tính bằng USB
  2. Mở Arduino IDE và kết nối máy tính với ESP32
  3. Nạp đoạn code hoàn chỉnh bên trên vào ESP32 và đảm bảo chọn đúng cổng COM để việc upload code thành công
  4. Ngắt mạch ESP32 khỏi máy tính khi nạp code xong
  5. Bật nguồn cho ESP32

Sau đó, bạn hãy mở màn hình Serial, chọn tốc độ truyền là 115200 và kiểm tra xem ESP32 đã kết nối thành công hay chưa. Như hình bên dưới là đã thành công rồi nhé:

Kết nối MQTT ESP32 thành công

Tiếp tục, bạn hãy dùng một máy khách MQTTX để kết nối với MQTT Broker và gửi một dòng tin nhắn bất kỳ, chẳng hạn như Hi, I’m MQTTX đến ESP32 và xem kết quả nhé!

Giải thích thêm:

MQTTX là một nền tảng máy khách MQTT 5.0 có thể chạy trên macOS, Windows và Linux. Bạn có thể tạo nhiều kết nối MQTT/MQTTS và đăng ký chủ đề, gửi tin nhắn MQTT dễ dàng, với giao diện sử dụng khá trực quan.

Gửi tin nhắn thông qua MQTT ESP32
Gửi tin nhắn thông qua MQTT ESP32

Khi đó, bạn sẽ thấy một dòng tin nhắn trên màn hình Serial, được gửi từ MQTTX như sau:

Gửi tin nhắn thông qua MQTT ESP32 thành công

Lời kết

Trong bài viết trên, mình đã hướng dẫn bạn cách làm một dự án MQTT ESP32 chi tiết, với sự hỗ trợ của thư viện PubSubClient. Bạn có thể kết nối với MQTT Broker an toàn qua SSL, sau đó gửi tin nhắn hoặc đăng ký chủ đề tùy thích.

Mình biết đây chỉ là một dự án khá cơ bản trong các ứng dụng IoT. Sau này mình sẽ cập nhật thêm nhiều hướng đẫn mới nâng cao hơn với MQTT ESP32, để bạn có thể làm nhiều dự án phức tạp và cao cấp hơn. Hãy theo dõi Blog IoTZone thường xuyên để cập nhật nhé!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *