跳至主要内容

將你的物聯網設備連接到雲端 - 虛擬物聯網硬體和樹莓派

在本課程的這部分,你將把你的虛擬物聯網設備或樹莓派連接到你的物聯網中心,以發送遙測數據和接收命令。

將你的設備連接到物聯網中心

下一步是將你的設備連接到物聯網中心。

任務 - 連接到物聯網中心

  1. 在 VS Code 中打開 soil-moisture-sensor 文件夾。如果你使用的是虛擬物聯網設備,請確保虛擬環境在終端中運行。

  2. 安裝一些額外的 Pip 套件:

    pip3 install azure-iot-device

    azure-iot-device 是一個用於與你的物聯網中心通信的庫。

  3. app.py 文件的頂部,現有的導入語句下方添加以下導入語句:

    from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse

    這段代碼導入了與你的物聯網中心通信的 SDK。

  4. 刪除 import paho.mqtt.client as mqtt 行,因為不再需要這個庫。刪除所有 MQTT 代碼,包括主題名稱,所有使用 mqtt_client 的代碼和 handle_command。保留 while True: 循環,只需從這個循環中刪除 mqtt_client.publish 行。

  5. 在導入語句下方添加以下代碼:

    connection_string = "<connection string>"

    <connection string> 替換為你在本課程前面檢索到的設備連接字符串。

    💁 這不是最佳做法。連接字符串不應該存儲在源代碼中,因為這樣可能會被檢入源代碼控制並被任何人發現。我們在這裡這樣做是為了簡化操作。理想情況下,你應該使用環境變量和像 python-dotenv 這樣的工具。你將在即將到來的課程中學到更多。

  6. 在這段代碼下方,添加以下代碼以創建一個可以與物聯網中心通信的設備客戶端對象,並連接它:

    device_client = IoTHubDeviceClient.create_from_connection_string(connection_string)

    print('Connecting')
    device_client.connect()
    print('Connected')
  7. 運行這段代碼。你將看到你的設備連接。

    pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py 
    Connecting
    Connected
    Soil moisture: 379

發送遙測數據

現在你的設備已經連接,你可以將遙測數據發送到物聯網中心,而不是 MQTT 代理。

任務 - 發送遙測數據

  1. while True 循環內,睡眠之前添加以下代碼:

    message = Message(json.dumps({ 'soil_moisture': soil_moisture }))
    device_client.send_message(message)

    這段代碼創建了一個包含土壤濕度讀數的 JSON 字符串的物聯網中心 Message,然後將其作為設備到雲端消息發送到物聯網中心。

處理命令

你的設備需要處理來自服務器代碼的命令以控制繼電器。這是作為直接方法請求發送的。

任務 - 處理直接方法請求

  1. while True 循環之前添加以下代碼:

    def handle_method_request(request):
    print("Direct method received - ", request.name)

    if request.name == "relay_on":
    relay.on()
    elif request.name == "relay_off":
    relay.off()

    這定義了一個方法 handle_method_request,當物聯網中心調用直接方法時將被調用。每個直接方法都有一個名稱,這段代碼期望一個名為 relay_on 的方法來打開繼電器,relay_off 來關閉繼電器。

    💁 這也可以在一個直接方法請求中實現,將所需的繼電器狀態作為有效負載傳遞,該有效負載可以與方法請求一起傳遞並從 request 對象中獲取。

  2. 直接方法需要一個響應來告訴調用代碼它們已被處理。在 handle_method_request 函數的末尾添加以下代碼以創建對請求的響應:

    method_response = MethodResponse.create_from_method_request(request, 200)
    device_client.send_method_response(method_response)

    這段代碼發送一個 HTTP 狀態碼為 200 的直接方法請求響應,並將其發送回物聯網中心。

  3. 在這個函數定義下方添加以下代碼:

    device_client.on_method_request_received = handle_method_request

    這段代碼告訴物聯網中心客戶端在調用直接方法時調用 handle_method_request 函數。

💁 你可以在 code/picode/virtual-device 文件夾中找到這段代碼。

😀 你的土壤濕度傳感器程序已連接到你的物聯網中心!