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

Azure IoT 中樞是一項完全受控的服務,有助於讓數百萬個裝置和一個解決方案後端進行可靠且安全的雙向通訊。

本文示範如何:

  • 透過IoT 中樞將雲端到裝置 (C2D) 訊息從解決方案後端傳送至單一裝置

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

注意

本文中所述的功能僅適用於 IoT 中樞的標準層。 如需基本和標準/免費IoT 中樞層的詳細資訊,請參閱為您的解決方案選擇正確的IoT 中樞層

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

  • SimulatedDevice.py:模擬連線到 IoT 中樞並接收雲端到裝置訊息的裝置。

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

若要深入了解雲端到裝置訊息,請參閱從 IoT 中樞傳送雲端到裝置訊息

注意

IoT 中樞會透過 Azure IoT 裝置 SDK 為許多裝置平台和語言 (C、Java、Python 及 JavaScript) 提供 SDK 支援。

必要條件

  • 使用中的 Azure 帳戶。 (如果您沒有帳戶,只需要幾分鐘的時間就可以建立免費帳戶。)

  • IoT 中樞。 使用 CLIAzure 入口網站建立一個。

  • 已註冊的裝置。 在 Azure 入口網站中註冊一個。

  • 建議使用 Python 3.7 版或更新版本。 請務必使用安裝程式所需的 32 位元或 64 位元安裝。 在安裝期間出現系統提示時,務必將 Python 新增至平台特有的環境變數。

  • 請確定您的防火牆已開啟連接埠 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 time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. 將下列程式碼新增至 SimulatedDevice.py 檔案。 在必要條件中,將 {deviceConnectionString} 預留位置值取代為已註冊裝置的連接字串:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. 定義下列函式,用來將接收的訊息列印到主控台:

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

    def main():
        print ("Starting the Python IoT Hub C2D Messaging device sample...")
    
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for C2D messages, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_message_received = message_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoT Hub C2D Messaging device sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
  7. 新增下列 main 函式:

    if __name__ == '__main__':
        main()
    
  8. 儲存並關閉 SimulatedDevice.py 檔案。

如需雲端到裝置訊息生命週期及 IoT 中樞如何處理雲端到裝置訊息的詳細資訊,請參閱從 IoT 中樞傳送雲端到裝置訊息

取得 IoT 中樞連接字串

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

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

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

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

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

  4. 複製 [主要連接字串] 並儲存該值。

顯示如何從您在 Azure 入口網站中的 IoT 中樞擷取連接字串的螢幕擷取畫面。

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

傳送雲端到裝置訊息

在本節中,您會建立一個 Python 主控台應用程式,將雲端到裝置訊息傳送到模擬裝置應用程式。 您需要來自裝置的裝置識別碼和 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. 請注意裝置所接收的訊息。

    已接收的訊息

後續步驟

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