使用 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)向
