使用 ArduinoJson 函數庫處理 MQTT 訂閱的 JSON 數據
在這節課中,我們將學習如何使用 MakePico開發板和 ArduinoJson 函數庫來解析和處理 MQTT 訂閱的 JSON 數據。這是一個實用的技能,可以幫助您在物聯網項目中根據接收到的數據做出相應的動作。具體來說,我們將解析接收到的 JSON 訊息並控制一個 LED 的狀態。
步驟 1:引入 ArduinoJson 函數庫並設置必要的變量
首先,我們需要引入 ArduinoJson.h
函數庫,這個庫將幫助我們解析 JSON 數據。接著,我們設置一個標誌變量 led_flag
來跟蹤 LED 的狀態。
#include <ArduinoJson.h> // 標誌變量,用於跟蹤 LED 的狀態 byte led_flag = 0;
解釋:
ArduinoJson.h
是一個強大的函數庫,用於解析和生成 JSON 數據,非常適合用於處理 MQTT 消息中的 JSON 格式數據。led_flag
是一個標誌變量,用於儲存 LED 的當前狀態,這將幫助我們在不同的地方追蹤 LED 是否處於打開狀態。
步驟 2:在 MQTT 回調函數中解析和處理 JSON 數據
當 MQTT 客戶端接收到訂閱的主題消息時,我們將使用 ArduinoJson 函數庫來解析 JSON 數據,並根據數據中的 Command
字段來控制 LED 的狀態。
// MQTT 回調函數,處理接收到的消息 void callback(char* topic, byte* message, unsigned int length) { // 將接收到的消息轉換為字符串 String messageTemp; for (int i = 0; i < length; i++) { messageTemp += (char)message[i]; } Serial.println("Received message: " + messageTemp); // 打印接收到的消息 // 創建一個靜態 JSON 文檔對象來解析 JSON 數據 StaticJsonDocument<1000> doc; DeserializationError data = deserializeJson(doc, messageTemp); // 檢查是否解析成功 if (data) { Serial.print("JSON parsing failed: "); Serial.println(data.c_str()); return; } // 從解析的 JSON 數據中提取 Command 值 int Command = doc["Command"]; // 根據 Command 的值來控制 LED 的狀態 if (Command == 1) { digitalWrite(13, HIGH); // 打開 LED led_flag = 1; // 更新標誌變量 } else { led_flag = 0; digitalWrite(13, LOW); // 關閉 LED } // 更新其他相關數據或狀態(如有需要) updatedata(); }
解釋:
messageTemp
將接收到的消息數據轉換為字符串格式,這是解析 JSON 所必需的。StaticJsonDocument<1000> doc;
創建了一個靜態 JSON 文檔對象來存儲解析後的數據,1000
表示 JSON 文檔的最大大小。deserializeJson(doc, messageTemp);
將字符串解析為 JSON 格式數據,並存儲在doc
中。Command
是 JSON 數據中的一個字段,表示需要執行的命令。我們將根據這個值來控制 LED 的開關狀態。updatedata();
是一個自定義函數,用於在控制 LED 後執行其他更新操作(如果有的話)。
步驟 3:整合代碼並運行項目
確保在您的代碼中已經設置了 MQTT 連接和訂閱的部分,並在適當的地方整合以上回調函數。完整的項目應包括設置 Wi-Fi 連接、MQTT 客戶端、訂閱和回調函數。
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 連接 }
解釋:
setup()
函數設置了基本的硬件配置和連接初始化。loop()
函數確保 Wi-Fi 和 MQTT 始終保持連接,並處理所有傳入的 MQTT 消息。
步驟 4:上傳代碼並測試項目
- 上傳代碼:
- 將完整的代碼上傳到 MakePico 開發板,並打開串行監視器以查看調試信息。
- 測試 JSON 數據處理:
- 使用 MQTT 客戶端工具(如 MQTTX 或 MQTT Explorer)向
YuanDevice/HK/request/1
主題發布 JSON 格式的消息,例如:{ "Command": 1 }
- 檢查串行監視器,確保接收到的 JSON 數據被正確解析,並且 LED 的狀態根據指令進行了相應的改變。
- 使用 MQTT 客戶端工具(如 MQTTX 或 MQTT Explorer)向