使用 IoT 中樞傳送雲端到裝置訊息 (Python)

Azure IoT 中樞是一項完全受控的服務,有助於讓數百萬個裝置和一個解決方案後端進行可靠且安全的雙向通訊。 將遙測從裝置傳送至 IoT 中樞快速入門說明如何建立 IoT 中樞、在其中佈建裝置身分識別,以及撰寫模擬裝置應用程式來傳送裝置到雲端訊息。

注意

本文中所述的功能僅適用於 IoT 中樞的標準層。 如需有關基本和標準/免費 IoT 中樞層的詳細資訊,請參閱選擇適合的 IoT 中樞層

本教學課程是以將遙測從裝置傳送至 IoT 中樞為基礎。 這會說明如何:

  • 從您的解決方案後端,透過 IoT 中樞將雲端到裝置訊息傳送給單一裝置。

  • 接收裝置上的雲端到裝置訊息。

您可在 IoT 中樞開發人員指南中,找到有關雲端到裝置訊息的詳細資訊。

在本教學課程結尾,您會執行兩個 Python 主控台應用程式:

  • SimulatedDevice.py 是在 將遙測資料從裝置傳送到 iot 中樞時所建立之應用程式的修改版本,可連線到您的 iot 中樞,並接收雲端到裝置的訊息。

  • SendCloudToDeviceMessage.py,它會透過 IoT 中樞將雲端到裝置訊息傳送至模擬裝置應用程式。

注意

IoT 中樞透過 Azure IoT 裝置 SDK 為許多裝置平台和語言 (包括 C、Java 及 Python) 提供 SDK 支援。 如需如何使用 Python 將裝置連線至本教學課程的程式碼 (通常是連線到 Azure IoT 中樞) 指示,請參閱 Azure IoT Python SDK

必要條件

  • 請確定您的防火牆已開啟連接埠 8883。 本文中的裝置範例會使用 MQTT 通訊協定,其會透過連接埠 8883 進行通訊。 某些公司和教育網路環境可能會封鎖此連接埠。 如需此問題的詳細資訊和解決方法,請參閱連線至 IoT 中樞 (MQTT)

在模擬的裝置應用程式中接收訊息

在本節中,您會建立一個 Python 主控台應用程式,來模擬裝置並接收來自 IoT 中樞的雲端到裝置訊息。

  1. 從工作目錄中的命令提示字元,安裝 適用于 Python 的 Azure IoT 中樞裝置 SDK

    pip install azure-iot-device
    
  2. 使用文字編輯器,建立名為 SimulatedDevice.py 的檔案。

  3. SimulatedDevice.py 檔案開頭新增下列 import 陳述式和變數:

    import threading
    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. 將下列程式碼新增至 SimulatedDevice.py 檔案。 將 {deviceConnectionString} 預留位置值取代為您在「將 遙測從裝置傳送至 IoT 中樞 」快速入門中所建立裝置的裝置連接字串:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. 新增下列函式,將接收的訊息列印至主控台:

    def message_listener(client):
        global RECEIVED_MESSAGES
        while True:
            message = client.receive_message()
            RECEIVED_MESSAGES += 1
            print("\nMessage received:")
    
            #print data and both system and application (custom) properties
            for property in vars(message).items():
                print ("    {0}".format(property))
    
            print( "Total calls received: {}".format(RECEIVED_MESSAGES))
            print()
    
  6. 新增下列程式碼,將用戶端初始化,並等候以接收雲端到裝置訊息:

    def iothub_client_sample_run():
        try:
            client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
            message_listener_thread = threading.Thread(target=message_listener, args=(client,))
            message_listener_thread.daemon = True
            message_listener_thread.start()
    
            while True:
                time.sleep(1000)
    
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging device sample stopped" )
    
  7. 新增下列 main 函式:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging device sample..." )
        print ( "Waiting for C2D messages, press Ctrl-C to exit" )
    
        iothub_client_sample_run()
    
  8. 儲存並關閉 SimulatedDevice.py 檔案。

取得 IoT 中樞連接字串

在本文中,您會建立後端服務以透過在將遙測從裝置傳送至 IoT 中樞內建立的 IoT 中樞來傳送雲端到裝置訊息。 若要傳送雲端到裝置訊息,則服務需要 服務連線 權限。 根據預設,每個 IoT 中樞都是透過授與此權限且名為 服務 的共用存取原則所建立。

若要取得 服務 原則的 IoT 中樞連接字串,請遵循下列步驟:

  1. Azure 入口網站中選取 [資源群組]。 選取中樞所在的資源群組,然後從資源清單選取中樞。

  2. 在 IoT 中樞的左側窗格中,選取 [共用存取原則]。

  3. 從原則清單中,選取 服務 原則。

  4. 在 [共用存取金鑰] 下,選取 連接字串 -- 主要金鑰 的複製圖示,然後儲存值。

    顯示如何擷取連接字串

如需 IoT 中樞共用存取原則和權限的詳細資訊,請參閱存取控制及權限

傳送雲端到裝置訊息

在本節中,您會建立一個 Python 主控台應用程式,將雲端到裝置訊息傳送到模擬裝置應用程式。 您需要在將遙測從裝置傳送至中樞快速入門內所新增裝置的裝置識別碼。 您也需要先前在取得 IoT 中樞連接字串內複製的 IoT 中樞連接字串。

  1. 在您的工作目錄中,開啟命令提示字元,並安裝 適用于 Python 的 Azure IoT 中樞服務 SDK

    pip install azure-iot-hub
    
  2. 使用文字編輯器,建立名為 SendCloudToDeviceMessage.py 的檔案。

  3. SendCloudToDeviceMessage.py 檔案開頭新增下列 import 陳述式和變數:

    import random
    import sys
    from azure.iot.hub import IoTHubRegistryManager
    
    MESSAGE_COUNT = 2
    AVG_WIND_SPEED = 10.0
    MSG_TXT = "{\"service client sent a message\": %.2f}"
    
  4. 將下列程式碼新增至 SendCloudToDeviceMessage.py 檔案。 將 {iot hub connection string}{device id} 預留位置值取代為您先前記下的 IoT 中樞連接字串和裝置識別碼:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. 新增下列程式碼,以將訊息傳送至您的裝置:

    def iothub_messaging_sample_run():
        try:
            # Create IoTHubRegistryManager
            registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
            for i in range(0, MESSAGE_COUNT):
                print ( 'Sending message: {0}'.format(i) )
                data = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2))
    
                props={}
                # optional: assign system properties
                props.update(messageId = "message_%d" % i)
                props.update(correlationId = "correlation_%d" % i)
                props.update(contentType = "application/json")
    
                # optional: assign application properties
                prop_text = "PropMsg_%d" % i
                props.update(testProperty = prop_text)
    
                registry_manager.send_c2d_message(DEVICE_ID, data, properties=props)
    
            try:
                # Try Python 2.xx first
                raw_input("Press Enter to continue...\n")
            except:
                pass
                # Use Python 3.xx in the case of exception
                input("Press Enter to continue...\n")
    
        except Exception as ex:
            print ( "Unexpected error {0}" % ex )
            return
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging service sample stopped" )
    
  6. 新增下列 main 函式:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. 儲存並關閉 SendCloudToDeviceMessage.py 檔案。

執行應用程式

現在您已經準備好執行應用程式。

  1. 在工作目錄的命令提示字元中,執行下列命令以接聽雲端到裝置的訊息:

    python SimulatedDevice.py
    

    執行模擬裝置應用程式

  2. 在您的工作目錄中開啟新的命令提示字元,然後執行下列命令來傳送雲端到裝置訊息:

    python SendCloudToDeviceMessage.py
    

    執行應用程式以傳送雲端到裝置命令

  3. 請注意裝置所接收的訊息。

    已接收的訊息

後續步驟

在本教學課程中,您已了解如何傳送和接收雲端到裝置的訊息。

若要查看使用 IoT 中樞的完整端對端解決方案範例,請參閱 Azure IoT 遠端監視解決方案加速器

若要深入了解如何使用 IoT 中樞開發解決方案,請參閱 IoT 中樞開發人員指南