Phần 3: Gửi dữ liệu lên Cloud qua MQTT
1. Giới thiệu về MQTT và cách thức hoạt động, 2. Cài đặt thư viện MQTT cho ESP32, 3. Thiết lập kết nối với MQTT broker, 4. Viết mã để gửi dữ liệu cảm biến lên Cloud, 5. Kiểm tra dữ liệu trên broker và xử lý lỗi.
Phần 3: Gửi dữ liệu lên Cloud qua MQTT
Trong phần này, chúng ta sẽ tìm hiểu cách gửi dữ liệu từ trạm thời tiết IoT lên Cloud thông qua giao thức MQTT. MQTT (Message Queuing Telemetry Transport) là một giao thức nhẹ, được thiết kế cho các ứng dụng IoT, cho phép các thiết bị trao đổi dữ liệu một cách hiệu quả.
1. Giới thiệu về MQTT và cách thức hoạt động
MQTT là một giao thức nhắn tin dựa trên mô hình khách hàng - máy chủ, hoạt động trên giao thức TCP/IP. Nó được thiết kế để truyền tải thông tin giữa các thiết bị với băng thông hạn chế và độ tin cậy cao. Các thành phần chính của MQTT bao gồm:
- MQTT Broker: Là máy chủ nhận và phân phối thông điệp đến các khách hàng.
- MQTT Client: Là thiết bị hoặc ứng dụng kết nối đến broker để gửi và nhận thông điệp.
- Topics: Là các kênh mà thông điệp được gửi đến và nhận từ. Mỗi thông điệp sẽ được gửi đến một topic cụ thể.
Cách thức hoạt động của MQTT có thể được tóm tắt như sau:
- Client kết nối đến broker.
- Client đăng ký (subscribe) vào các topics mà nó quan tâm.
- Khi có thông điệp mới được gửi đến topic đó, broker sẽ chuyển tiếp thông điệp đến các client đã đăng ký.
2. Cài đặt thư viện MQTT cho ESP32
Để sử dụng MQTT trên ESP32, bạn cần cài đặt thư viện PubSubClient. Thực hiện theo các bước sau:
- Mở Arduino IDE.
- Đi đến Sketch > Include Library > Manage Libraries...
- Tìm kiếm PubSubClient trong hộp tìm kiếm.
- Nhấp vào Install để cài đặt thư viện.
3. Thiết lập kết nối với MQTT broker
Để kết nối với MQTT broker, bạn cần có thông tin về địa chỉ IP hoặc hostname của broker, cổng kết nối (thường là 1883 cho MQTT không bảo mật) và thông tin xác thực (nếu cần). Dưới đây là một ví dụ mã để thiết lập kết nối:
#include <WiFi.h>
#include <PubSubClient.h>
// Thông tin mạng WiFi
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
// Thông tin MQTT broker
const char* mqtt_server = "broker.hivemq.com"; // Thay đổi theo broker của bạn
const int mqtt_port = 1883;
// Khởi tạo đối tượng WiFi và MQTT
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
setup_wifi(); // Kết nối WiFi
client.setServer(mqtt_server, mqtt_port); // Thiết lập server
}
void setup_wifi() {
delay(10);
Serial.println("Kết nối đến mạng WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Kết nối thành công!");
}
4. Viết mã để gửi dữ liệu cảm biến lên Cloud
Giả sử bạn đã có mã để lấy dữ liệu từ các cảm biến như nhiệt độ, độ ẩm, độ ẩm đất, ánh sáng và lượng mưa. Bây giờ, chúng ta sẽ viết mã để gửi dữ liệu này lên Cloud thông qua MQTT:
void loop() {
if (!client.connected()) {
reconnect(); // Đảm bảo kết nối
}
client.loop();
// Giả định rằng bạn đã có mã để đọc dữ liệu cảm biến
float temperature = readTemperature();
float humidity = readHumidity();
float soilMoisture = readSoilMoisture();
float lightIntensity = readLightIntensity();
float rainAmount = readRainAmount();
// Chuyển đổi dữ liệu thành chuỗi JSON
String jsonData = "{\"temperature\":" + String(temperature) + ",\"humidity\":" + String(humidity) +
",\"soilMoisture\":" + String(soilMoisture) + ",\"lightIntensity\":" + String(lightIntensity) +
",\"rainAmount\":" + String(rainAmount) + "}";
// Gửi dữ liệu lên MQTT
client.publish("farm/weather", jsonData.c_str());
Serial.println("Dữ liệu đã được gửi: " + jsonData);
delay(60000); // Gửi dữ liệu mỗi phút
}
void reconnect() {
// Vòng lặp cho đến khi kết nối lại thành công
while (!client.connected()) {
Serial.print("Kết nối đến MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("Kết nối thành công!");
} else {
Serial.print("Kết nối thất bại, mã lỗi: ");
Serial.print(client.state());
delay(2000);
}
}
}
5. Kiểm tra dữ liệu trên broker và xử lý lỗi
Sau khi gửi dữ liệu, bạn có thể kiểm tra thông điệp trên broker bằng cách sử dụng một client MQTT khác như MQTT.fx hoặc một ứng dụng di động như MQTT Explorer. Bạn chỉ cần đăng ký vào topic farm/weather để xem dữ liệu được gửi từ ESP32.
Lưu ý: Đảm bảo rằng bạn đã khởi động broker trước khi chạy mã trên ESP32. Nếu bạn gặp phải lỗi kết nối, hãy kiểm tra lại thông tin mạng và địa chỉ broker.
Nếu bạn gặp lỗi trong quá trình gửi dữ liệu, bạn có thể sử dụng client.state() để xác định mã lỗi và xử lý phù hợp. Một số mã lỗi thông dụng bao gồm:
- -1: Không có kết nối.
- -2: Không thể kết nối đến broker.
- -4: Đăng ký không thành công.
Với các bước trên, bạn đã hoàn thành việc gửi dữ liệu từ trạm thời tiết IoT lên Cloud qua MQTT. Trong phần tiếp theo, chúng ta sẽ tìm hiểu cách xử lý dữ liệu này trên Cloud để phân tích và cảnh báo khi có bất thường.
