使用 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)訂閱