IoT Hub を使用したクラウドからデバイスへのメッセージの送信 (Python)Send cloud-to-device messages with IoT Hub (Python)

はじめにIntroduction

Azure IoT Hub は、何百万ものデバイスとソリューション バックエンドの間に信頼性のある保護された双方向通信を確立するのに役立つ、フル マネージドのサービスです。Azure IoT Hub is a fully managed service that helps enable reliable and secure bi-directional communications between millions of devices and a solution back end. IoT Hub の概要チュートリアルには、IoT ハブの作成方法、IoT ハブでデバイス ID をプロビジョニングする方法、およびデバイスからクラウドへのメッセージを送信するシミュレートされたデバイス アプリをコード化する方法が示されています。The Get started with IoT Hub tutorial shows how to create an IoT hub, provision a device identity in it, and code a simulated device app that sends device-to-cloud messages.

注意

この記事で説明される機能は、IoT Hub の Standard レベルでのみ利用できます。The features described in this article are only available in the standard tier of IoT hub. IoT Hub の Basic レベルおよび Standard レベルについて詳しくは、適切な IoT Hub レベルの選び方に関するページを参照してください。For more information about the basic and standard IoT Hub tiers, see How to choose the right IoT Hub tier.

このチュートリアルは、IoT Hub の概要に関するページのチュートリアルに基づいて作成されており、This tutorial builds on Get started with IoT Hub. 次の方法について説明します。It shows you how to:

  • ソリューション バックエンドから IoT Hub を介して単一のデバイスにクラウドからデバイスへのメッセージを送信する。From your solution back end, send cloud-to-device messages to a single device through IoT Hub.
  • クラウドからデバイスへのメッセージをデバイスで受信する。Receive cloud-to-device messages on a device.
  • IoT Hub からデバイスに送信されたメッセージの配信確認 ("フィードバック") を、ソリューション バックエンドから要求する。From your solution back end, request delivery acknowledgement (feedback) for messages sent to a device from IoT Hub.

クラウドからデバイスへのメッセージの詳細については、IoT Hub 開発者ガイドを参照してください。You can find more information on cloud-to-device messages in the IoT Hub developer guide.

このチュートリアルの最後に、次の 2 つの Python コンソール アプリを実行します。At the end of this tutorial, you run two Python console apps:

  • SimulatedDevice.py。「IoT Hub の概要」で作成されたアプリケーションの修正バージョン。これは、IoT Hub に接続し、クラウドからデバイスへのメッセージを受け取ります。SimulatedDevice.py, a modified version of the app created in Get started with IoT Hub, which connects to your IoT hub and receives cloud-to-device messages.
  • SendCloudToDeviceMessage.py。クラウドからデバイスへのメッセージを IoT Hub を介してシミュレートされたデバイス アプリに送信し、その配信確認を受け取ります。SendCloudToDeviceMessage.py, which sends a cloud-to-device message to the simulated device app through IoT Hub, and then receives its delivery acknowledgement.

注意

IoT Hub には、Azure IoT device SDK を介した多数のデバイス プラットフォームや言語 (C、Java、Javascript など) に対する SDK サポートがあります。IoT Hub has SDK support for many device platforms and languages (including C, Java, and Javascript) through Azure IoT device SDKs. このチュートリアルのコード (一般的には Azure IoT Hub) にデバイスを接続するための詳しい手順については、 Azure IoT デベロッパー センターのページを参照してください。For step-by-step instructions on how to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the Azure IoT Developer Center.

このチュートリアルを完了するには、以下が必要です。To complete this tutorial, you need the following:

注意

azure-iothub-service-clientazure-iothub-device-clientpip パッケージは現在、Windows OS でのみ利用できます。The pip packages for azure-iothub-service-client and azure-iothub-device-client are currently available only for Windows OS. Linux/Mac OS については、[Python に必要な開発環境の準備][lnk-python-devbox]に関する記事で、Linux と Mac OS の各セクションを参照してください。For Linux/Mac OS, please refer to the Linux and Mac OS-specific sections on the [Prepare your development environment for Python][lnk-python-devbox] post.

シミュレートされたデバイス アプリでメッセージを受信するReceive messages in the simulated device app

このセクションでは、デバイスをシミュレートして、クラウドからデバイスへのメッセージを IoT Hub から受信する、Python コンソール アプリを作成します。In this section, you create a Python console app to simulate the device and receive cloud-to-device messages from the IoT hub.

  1. テキスト エディターを使って、SimulatedDevice.py ファイルを作成します。Using a text editor, create a SimulatedDevice.py file.

  2. SimulatedDevice.py ファイルの先頭に、次の import ステートメントと変数を追加します。Add the following import statements and variables at the start of the SimulatedDevice.py file:

    import time
    import sys
    import iothub_client
    from iothub_client import IoTHubClient, IoTHubClientError, IoTHubTransportProvider, IoTHubClientResult
    from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError
    
    RECEIVE_CONTEXT = 0
    WAIT_COUNT = 10
    RECEIVED_COUNT = 0
    RECEIVE_CALLBACKS = 0
    
  3. 次のコードを SimulatedDevice.py ファイルに追加します。Add the following code to SimulatedDevice.py file. "{deviceConnectionString}" プレースホルダーの値を、「IoT Hub の概要」チュートリアルで作成したデバイスのデバイス接続文字列に置き換えます。Replace the "{deviceConnectionString}" placeholder value with the device connection string for the device you created in the Get started with IoT Hub tutorial:

    # choose AMQP or AMQP_WS as transport protocol
    PROTOCOL = IoTHubTransportProvider.AMQP
    CONNECTION_STRING = "{deviceConnectionString}"
    
  4. 受信したメッセージをコンソールに出力するための次の関数を追加します。Add the following function to print received messages to the console:

    def receive_message_callback(message, counter):
        global RECEIVE_CALLBACKS
        message_buffer = message.get_bytearray()
        size = len(message_buffer)
        print ( "Received Message [%d]:" % counter )
        print ( "    Data: <<<%s>>> & Size=%d" % (message_buffer[:size].decode('utf-8'), size) )
        map_properties = message.properties()
        key_value_pair = map_properties.get_internals()
        print ( "    Properties: %s" % key_value_pair )
        counter += 1
        RECEIVE_CALLBACKS += 1
        print ( "    Total calls received: %d" % RECEIVE_CALLBACKS )
        return IoTHubMessageDispositionResult.ACCEPTED
    
    def iothub_client_init():
        client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
    
        client.set_message_callback(receive_message_callback, RECEIVE_CONTEXT)
    
        return client
    
    def print_last_message_time(client):
        try:
            last_message = client.get_last_message_receive_time()
            print ( "Last Message: %s" % time.asctime(time.localtime(last_message)) )
            print ( "Actual time : %s" % time.asctime() )
        except IoTHubClientError as iothub_client_error:
            if iothub_client_error.args[0].result == IoTHubClientResult.INDEFINITE_TIME:
                print ( "No message received" )
            else:
                print ( iothub_client_error )
    
  5. クライアントを初期化してクラウドからデバイスへのメッセージの受信を待機する次のコードを追加します。Add the following code to initialize the client and wait to recieve the cloud-to-device message:

    def iothub_client_init():
        client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
    
        client.set_message_callback(receive_message_callback, RECEIVE_CONTEXT)
    
        return client
    
    def iothub_client_sample_run():
        try:
            client = iothub_client_init()
    
            while True:
                print ( "IoTHubClient waiting for commands, press Ctrl-C to exit" )
    
                status_counter = 0
                while status_counter <= WAIT_COUNT:
                    status = client.get_send_status()
                    print ( "Send status: %s" % status )
                    time.sleep(10)
                    status_counter += 1
    
        except IoTHubError as iothub_error:
            print ( "Unexpected error %s from IoTHub" % iothub_error )
            return
        except KeyboardInterrupt:
            print ( "IoTHubClient sample stopped" )
    
        print_last_message_time(client)
    
  6. 次の main 関数を追加します。Add the following main function:

    if __name__ == '__main__':
        print ( "Starting the IoT Hub Python sample..." )
        print ( "    Protocol %s" % PROTOCOL )
        print ( "    Connection string=%s" % CONNECTION_STRING )
    
        iothub_client_sample_run()
    
  7. SimulatedDevice.py ファイルを保存して閉じます。Save and close SimulatedDevice.py file.

C2D メッセージを送信するSend a cloud-to-device message

このセクションでは、クラウドからデバイスへのメッセージをシミュレートされたデバイスのアプリに送信する Python コンソール アプリを作成します。In this section, you create a Python console app that sends cloud-to-device messages to the simulated device app. IoT Hub の概要のチュートリアルで追加したデバイスのデバイス ID が必要です。You need the device ID of the device you added in the Get started with IoT Hub tutorial. また、ハブの IoT Hub 接続文字列も必要です (Azure ポータル で確認できます)。You also need the IoT Hub connection string for your hub that you can find in the Azure portal.

  1. テキスト エディターを使って、SendCloudToDeviceMessage.py ファイルを作成します。Using a text editor, create a SendCloudToDeviceMessage.py file.

  2. SendCloudToDeviceMessage.py ファイルの先頭に、次の import ステートメントと変数を追加します。Add the following import statements and variables at the start of the SendCloudToDeviceMessage.py file:

    import random
    import sys
    import iothub_service_client
    from iothub_service_client import IoTHubMessaging, IoTHubMessage, IoTHubError
    
    OPEN_CONTEXT = 0
    FEEDBACK_CONTEXT = 1
    MESSAGE_COUNT = 1
    AVG_WIND_SPEED = 10.0
    MSG_TXT = "{\"service client sent a message\": %.2f}"
    
  3. 次のコードを SendCloudToDeviceMessage.py ファイルに追加します。Add the following code to SendCloudToDeviceMessage.py file. "{IoTHubConnectionString}" プレースホルダーの値を、「IoT Hub の概要」チュートリアルで作成したハブの IoT Hub 接続文字列に置き換えます。Replace the "{IoTHubConnectionString}" placeholder value with the IoT Hub connection string for the hub you created in the Get started with IoT Hub tutorial. "{deviceId}" プレースホルダーを、「IoT Hub の概要」チュートリアルで追加したデバイスのデバイス ID に置き換えます。Replace the "{deviceId}" placeholder with the device ID of the device you added in the Get started with IoT Hub tutorial:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  4. フィードバック メッセージをコンソールに出力するための次の関数を追加します。Add the following function to print feedback messages to the console:

    def open_complete_callback(context):
        print ( 'open_complete_callback called with context: {0}'.format(context) )
    
    def send_complete_callback(context, messaging_result):
        context = 0
        print ( 'send_complete_callback called with context : {0}'.format(context) )
        print ( 'messagingResult : {0}'.format(messaging_result) )
    
  5. デバイスにメッセージを送信し、クラウドからデバイスへのメッセージが配信されたことの確認応答がデバイスからあったときにフィードバック メッセージを処理するための次のコードを追加します。Add the following code to send a message to your device and handle the feedback message when the device acknowledges the cloud-to-device message:

    def iothub_messaging_sample_run():
        try:
            iothub_messaging = IoTHubMessaging(CONNECTION_STRING)
    
            iothub_messaging.open(open_complete_callback, OPEN_CONTEXT)
    
            for i in range(0, MESSAGE_COUNT):
                print ( 'Sending message: {0}'.format(i) )
                msg_txt_formatted = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2))
                message = IoTHubMessage(bytearray(msg_txt_formatted, 'utf8'))
    
                # optional: assign ids
                message.message_id = "message_%d" % i
                message.correlation_id = "correlation_%d" % i
                # optional: assign properties
                prop_map = message.properties()
                prop_text = "PropMsg_%d" % i
                prop_map.add("Property", prop_text)
    
                iothub_messaging.send_async(DEVICE_ID, message, send_complete_callback, i)
    
            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")
    
            iothub_messaging.close()
    
        except IoTHubError as iothub_error:
            print ( "Unexpected error {0}" % iothub_error )
            return
        except KeyboardInterrupt:
            print ( "IoTHubMessaging sample stopped" )
    
  6. 次の main 関数を追加します。Add the following main function:

    if __name__ == '__main__':
        print ( "Starting the IoT Hub Service Client Messaging Python sample..." )
        print ( "    Connection string = {0}".format(CONNECTION_STRING) )
        print ( "    Device ID         = {0}".format(DEVICE_ID) )
    
        iothub_messaging_sample_run()
    
  7. SendCloudToDeviceMessage.py ファイルを保存して閉じます。Save and close SendCloudToDeviceMessage.py file.

アプリケーションの実行Run the applications

これで、アプリケーションを実行する準備が整いました。You are now ready to run the applications.

  1. コマンド プロンプトを開き、Azure IoT Hub Device SDK for Python をインストールします。Open a command prompt and install the Azure IoT Hub Device SDK for Python.

    pip install azure-iothub-device-client
    
  2. コマンド プロンプトで次のコマンドを実行し、クラウドからデバイスへのメッセージを待機します。At the command prompt, run the following command to listen for cloud-to-device messages:

    python SimulatedDevice.py 
    

    シミュレーション済みデバイス アプリを実行する

  3. 新しいコマンド プロンプトを開き、Azure IoT Hub Service SDK for Python をインストールします。Open a new command prompt and install the Azure IoT Hub Service SDK for Python.

    pip install azure-iothub-service-client
    
  4. コマンド プロンプトで次のコマンドを実行し、クラウドからデバイスへのメッセージを送信して、メッセージのフィードバックを待機します。At a command prompt, run the following command to send a cloud-to-device message and wait for the message feedback:

    python SendCloudToDeviceMessage.py 
    

    クラウドからデバイスへのコマンドを送信するアプリを実行する

  5. デバイスで受信したメッセージを確認します。Note the message recieved by the device.

    受信したメッセージ

次の手順Next steps

このチュートリアルでは、クラウドからデバイスへのメッセージを送受信する方法を学習しました。In this tutorial, you learned how to send and receive cloud-to-device messages.

IoT Hub を使用する完全なエンド ツー エンド ソリューションの例については、Azure IoT リモート監視ソリューション アクセラレータに関するページをご覧ください。To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Remote Monitoring solution accelerator.

IoT Hub を使用したソリューションの開発に関する詳細については、IoT Hub 開発者ガイドをご覧ください。To learn more about developing solutions with IoT Hub, see the IoT Hub developer guide.