メインコンテンツまでスキップ

IoTデバイスをクラウドに接続する - 仮想IoTハードウェアとRaspberry Pi

このレッスンのこの部分では、仮想IoTデバイスまたはRaspberry PiをIoT Hubに接続し、テレメトリを送信し、コマンドを受信します。

デバイスをIoT Hubに接続する

次のステップは、デバイスをIoT Hubに接続することです。

タスク - IoT Hubに接続する

  1. VS Codeでsoil-moisture-sensorフォルダーを開きます。仮想IoTデバイスを使用している場合は、ターミナルで仮想環境が実行されていることを確認してください。

  2. いくつかの追加のPipパッケージをインストールします:

    pip3 install azure-iot-device

    azure-iot-deviceは、IoT Hubと通信するためのライブラリです。

  3. 既存のインポートの下に、次のインポートをapp.pyファイルの先頭に追加します:

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

    このコードは、IoT Hubと通信するための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. このコードの下に、IoT Hubと通信できるデバイスクライアントオブジェクトを作成し、接続するための次のコードを追加します:

    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ブローカーの代わりにIoT Hubにテレメトリを送信できます。

タスク - テレメトリを送信する

  1. while Trueループの中で、スリープの直前に次のコードを追加します:

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

    このコードは、土壌湿度の読み取り値をJSON文字列として含むIoT Hub Messageを作成し、これをデバイスからクラウドへのメッセージとしてIoT Hubに送信します。

コマンドを処理する

デバイスは、リレーを制御するためにサーバーコードからのコマンドを処理する必要があります。これは、直接メソッドリクエストとして送信されます。

タスク - 直接メソッドリクエストを処理する

  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()

    これは、IoT Hubによって直接メソッドが呼び出されたときに呼び出されるメソッドhandle_method_requestを定義します。各直接メソッドには名前があり、このコードはリレーをオンにするためのrelay_onというメソッドと、リレーをオフにするためのrelay_offというメソッドを期待しています。

    💁 これは、メソッドリクエストに渡すことができるペイロードでリレーの希望する状態を渡す単一の直接メソッドリクエストとしても実装できます。

  2. 直接メソッドには、呼び出し元のコードに処理されたことを伝えるための応答が必要です。handle_method_request関数の最後に次のコードを追加して、リクエストへの応答を作成します:

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

    このコードは、HTTPステータスコード200の直接メソッドリクエストへの応答を送信し、これをIoT Hubに送信します。

  3. この関数定義の下に次のコードを追加します:

    device_client.on_method_request_received = handle_method_request

    このコードは、直接メソッドが呼び出されたときにhandle_method_request関数を呼び出すようにIoT Hubクライアントに指示します。

💁 このコードは、code/piまたはcode/virtual-deviceフォルダーにあります。

😀 あなたの土壌湿度センサーのプログラムは、IoT Hubに接続されました!