跳至主要内容

通過互聯網控制你的夜燈 - Wio Terminal

在本課的這一部分,你將訂閱從 MQTT broker 發送到你的 Wio Terminal 的命令。

訂閱命令

下一步是訂閱從 MQTT broker 發送的命令,並對其作出回應。

任務

訂閱命令。

  1. 在 VS Code 中打開夜燈項目。

  2. config.h 文件的底部添加以下代碼,以定義命令的主題名稱:

    const string SERVER_COMMAND_TOPIC = ID + "/commands";

    SERVER_COMMAND_TOPIC 是設備將訂閱以接收 LED 命令的主題。

  3. reconnectMQTTClient 函數的末尾添加以下行,以便在 MQTT 客戶端重新連接時訂閱命令主題:

    client.subscribe(SERVER_COMMAND_TOPIC.c_str());
  4. reconnectMQTTClient 函數下方添加以下代碼。

    void clientCallback(char *topic, uint8_t *payload, unsigned int length)
    {
    char buff[length + 1];
    for (int i = 0; i < length; i++)
    {
    buff[i] = (char)payload[i];
    }
    buff[length] = '\0';

    Serial.print("Message received:");
    Serial.println(buff);

    DynamicJsonDocument doc(1024);
    deserializeJson(doc, buff);
    JsonObject obj = doc.as<JsonObject>();

    bool led_on = obj["led_on"];

    if (led_on)
    digitalWrite(D0, HIGH);
    else
    digitalWrite(D0, LOW);
    }

    此函數將是當 MQTT 客戶端從服務器接收到消息時調用的回調函數。

    消息以無符號 8 位整數數組的形式接收,因此需要轉換為字符數組以作為文本處理。

    消息包含一個 JSON 文檔,並使用 ArduinoJson 庫進行解碼。讀取 JSON 文檔的 led_on 屬性,並根據其值打開或關閉 LED。

  5. createMQTTClient 函數中添加以下代碼:

    client.setCallback(clientCallback);

    此代碼將 clientCallback 設置為當從 MQTT broker 接收到消息時調用的回調函數。

    💁 clientCallback 處理程序會為所有訂閱的主題調用。如果你以後編寫代碼來監聽多個主題,你可以從傳遞給回調函數的 topic 參數中獲取消息發送到的主題。

  6. 將代碼上傳到你的 Wio Terminal,並使用串行監視器查看發送到 MQTT broker 的光線水平。

  7. 調整你的物理或虛擬設備檢測到的光線水平。你將看到消息被接收和命令在終端中發送。你還將看到根據光線水平打開和關閉 LED。

💁 你可以在 code-commands/wio-terminal 文件夾中找到此代碼。

😀 你已成功編寫代碼,使你的設備能夠響應來自 MQTT broker 的命令。