使用 ArduinoJson 將裝置狀態格式化為 JSON 並通過 MQTT 廣播
在這節課中,我們將學習如何使用 ESP32 和 ArduinoJson 函數庫將裝置的狀態數據格式化為 JSON,並通過 MQTT 協議將這些數據回傳給伺服器或其他設備。這種技術對於物聯網(IoT)應用中特別有用,因為它允許設備之間以標準化的格式交換狀態信息。
步驟 1:設置 JSON 對象並準備廣播的數據
我們將使用 ArduinoJson 函數庫來創建一個 JSON 對象,並將裝置的狀態數據添加到該對象中。接著,將這些數據序列化為 JSON 字符串,並通過 MQTT 進行廣播。
void updatedata() {
// 定義一個字符數組來存儲序列化後的 JSON 字符串
char json_output[100];
// 創建一個靜態 JSON 文檔對象,大小為 200 字節
StaticJsonDocument<200> json_doc;
// 將裝置的相關狀態數據添加到 JSON 文檔中
json_doc["device_id"] = "1"; // 設置裝置 ID
json_doc["status"] = led_flag; // 設置 LED 的狀態(1 為開,0 為關)
// 將 JSON 文檔序列化為 JSON 字符串並存儲到 json_output 中
serializeJson(json_doc, json_output);
// 通過 MQTT 將 JSON 數據廣播到指定的主題
mclient.publish(pubtopic.c_str(), json_output);
}
解釋:
StaticJsonDocument<200> json_doc;創建了一個靜態 JSON 文檔對象,200表示 JSON 文檔的最大大小。json_doc["device_id"] = "1";和json_doc["status"] = led_flag;用於將裝置 ID 和 LED 的狀態添加到 JSON 對象中。serializeJson(json_doc, json_output);將 JSON 對象序列化為字符串,並存儲在json_output字符數組中。mclient.publish(pubtopic.c_str(), json_output);使用 MQTT 客戶端將序列化後的 JSON 數據發布到指定的主題,這樣其他設備或伺服器可以接收到裝置的狀態信息。
步驟 2:整合代碼並運行項目
確保在您的代碼中已經設置了 MQTT 連接和訂閱的部分,並在適當的地方整合 updatedata() 函數。當設備的狀態發生變化時(例如 LED 的狀態改變),可以調用 updatedata() 函數來廣播最新的裝置狀態。
void setup() {
Serial.begin(115200); // 初始化串行通信
pinMode(13, OUTPUT); // 設置 GPIO 13 為輸出模式(控制 LED)
wifiini(); // 初始化 Wi-Fi
connect_mqtt(); // 連接 MQTT 伺服器
}
void loop() {
// 檢查並維持 Wi-Fi 和 MQTT 連接狀態
if (!mclient.connected()) {
connect_mqtt();
}
mclient.loop(); // 維持 MQTT 連接
// 根據您的項目需求更新裝置狀態並廣播
updatedata();
}
解釋:
setup()函數初始化硬件配置和連接。loop()函數維持 Wi-Fi 和 MQTT 的連接,並定期更新裝置狀態。
步驟 3:上傳代碼並測試項目
- 上傳代碼:
- 將完整的代碼上傳到 ESP32 開發板,並打開串行監視器以查看調試信息。
- 測試 JSON 數據廣播:
- 使用 MQTT 客戶端工具(如 MQTTX 或 MQTT Explorer)訂閱
YuanDevice/HK/respone/1主題,並觀察接收到的消息。 - 當設備的狀態改變時,應該會看到設備將最新的狀態信息以 JSON 格式廣播到指定的 MQTT 主題。
- 使用 MQTT 客戶端工具(如 MQTTX 或 MQTT Explorer)訂閱
