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

Azure IoT Hub は、何百万ものデバイスとソリューション バックエンドの間に信頼性のある保護された双方向通信を確立するのに役立つ、フル マネージドのサービスです。

この記事で取り上げるテクニック:

  • ソリューション バックエンドから IoT Hub 経由で単一のデバイスに cloud-to-device (C2D) メッセージを送信する

  • cloud-to-device メッセージをデバイスで受信する

注意

この記事で説明されている機能は、Standard レベルの IoT Hub でのみ使用できます。 Basic および Standard または Free レベルの IoT Hub の詳細については、「ソリューションに適した IoT Hub のレベルを選択する」を参照してください。

この記事の最後に、次の 2 つの Python コンソール アプリを実行します。

  • SimulatedDevice.py: IoT ハブに接続し、cloud-to-device メッセージを受信するデバイスをシミュレートします。

  • SendCloudToDeviceMessage.py: cloud-to-device メッセージを IoT Hub 経由でシミュレートされたデバイス アプリに送信します。

cloud-to-device メッセージの詳細については、「IoT ハブから cloud-to-device メッセージを送信する」を参照してください。

Note

IoT Hub には、Azure IoT device SDK を介して、多数のデバイス プラットフォームと言語 (C、Java、Python、JavaScript) に対する SDK サポートがあります。

前提条件

  • アクティブな Azure アカウントアカウントがない場合、Azure 試用版にサインアップして、最大 10 件の無料 Mobile Apps を入手できます。 (アカウントがない場合は、無料アカウント を数分で作成できます)。

  • IoT Hub。 CLI または Azure portal を使って作成します。

  • 登録済みのデバイス。 Azure portal に登録してください。

  • Python バージョン 3.7 以降をお勧めします。 必ず、セットアップに必要な 32 ビットまたは 64 ビットのインストールを使用してください。 インストール中に求められた場合は、プラットフォーム固有の環境変数に Python を追加します。

  • ポート 8883 がファイアウォールで開放されていることを確認してください。 この記事のデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。 この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。

シミュレートされたデバイス アプリでメッセージを受信する

このセクションでは、デバイスをシミュレートして、cloud-to-device メッセージを IoT ハブから受信する、Python コンソール アプリを作成します。

  1. 作業ディレクトリのコマンド プロンプトから、Azure IoT Hub Device SDK for Python をインストールします。

    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 ファイルを保存し、閉じます。

cloud-to-device メッセージのライフサイクルと、IoT Hub が cloud-to-device メッセージを処理する方法の詳細については、「IoT ハブから cloud-to-device メッセージを送信する」を参照してください。

IoT ハブ接続文字列を取得する

この記事では、IoT Hub を介して cloud-to-device メッセージを送信するバックエンド サービスを作成します。 cloud-to-device メッセージを送信するサービスには、サービス接続のアクセス許可が必要となります。 既定では、どの IoT Hub も、このアクセス許可を付与する service という名前の共有アクセス ポリシーがある状態で作成されます。

サービス ポリシーの IoT Hub 接続文字列を取得するには、次の手順を実行します。

  1. Azure portal で、 [リソース グループ] を選択します。 ハブが配置されているリソース グループを選択し、リソースの一覧からハブを選択します。

  2. IoT ハブの左側のウィンドウで、 [共有アクセス ポリシー] を選択します。

  3. ポリシーの一覧から、サービス ポリシーを選択します。

  4. [プライマリ接続文字列] をコピーし、値を保存します。

Azure portal で IoT ハブから接続文字列を取得する方法を示すスクリーンショット。

IoT Hub の共有アクセス ポリシーとアクセス許可の詳細については、「アクセス制御とアクセス許可」を参照してください。

C2D メッセージを送信する

このセクションでは、クラウドからデバイスへのメッセージをシミュレートされたデバイスのアプリに送信する Python コンソール アプリを作成します。 デバイスからのデバイス ID と IoT ハブの接続文字列が必要です。

  1. 作業ディレクトリでコマンド プロンプトを開き、Azure IoT Hub Service SDK for Python をインストールします。

    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 ハブ接続文字列とデバイス ID に置き換えます。

    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. デバイスによって受信されたメッセージを確認します。

    受信したメッセージ

次の手順

この記事では、クラウドからデバイスへのメッセージを送受信する方法を学習しました。