跳至主要内容

通過互聯網控制你的夜燈 - 虛擬物聯網硬件和樹莓派

在本課的這一部分,你將訂閱從 MQTT broker 發送到你的樹莓派或虛擬物聯網設備的命令。

訂閱命令

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

任務

訂閱命令。

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

  2. 如果你使用的是虛擬物聯網設備,請確保終端正在運行虛擬環境。如果你使用的是樹莓派,則不需要使用虛擬環境。

  3. client_telemetry_topic 定義之後添加以下代碼:

    server_command_topic = id + '/commands'

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

  4. 在主循環上方,mqtt_client.loop_start() 行之後添加以下代碼:

    def handle_command(client, userdata, message):
    payload = json.loads(message.payload.decode())
    print("Message received:", payload)

    if payload['led_on']:
    led.on()
    else:
    led.off()

    mqtt_client.subscribe(server_command_topic)
    mqtt_client.on_message = handle_command

    此代碼定義了一個函數 handle_command,該函數將消息作為 JSON 文檔讀取,並查找 led_on 屬性的值。如果設置為 True,則打開 LED,否則關閉 LED。

    MQTT 客戶端訂閱服務器將發送消息的主題,並設置在接收到消息時調用的 handle_command 函數。

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

  5. 以與運行上一部分作業代碼相同的方式運行代碼。如果你使用的是虛擬物聯網設備,請確保 CounterFit 應用正在運行,並且光傳感器和 LED 已在正確的引腳上創建。

  6. 調整你的物理或虛擬設備檢測到的光線水平。接收到的消息和發送的命令將寫入終端。根據光線水平,LED 也會打開和關閉。

💁 你可以在 code-commands/virtual-device 文件夾或 code-commands/pi 文件夾中找到此代碼。

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