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