IoTデバイスをクラウドに接続する - 仮想IoTハードウェアとRaspberry Pi
このレッスンのこの部分では、仮想IoTデバイスまたはRaspberry PiをIoT Hubに接続し、テレメトリを送信し、コマンドを受信します。
デバイスをIoT Hubに接続する
次のステップは、デバイスをIoT Hubに接続することです。
タスク - IoT Hubに接続する
-
VS Codeで
soil-moisture-sensor
フォルダーを開きます。仮想IoTデバイスを使用している場合は、ターミナルで仮想環境が実行されていることを確認してください。 -
いくつかの追加のPipパッケージをインストールします:
pip3 install azure-iot-device
azure-iot-device
は、IoT Hubと通信するためのライブラリです。 -
既存のインポートの下に、次のインポートを
app.py
ファイルの先頭に追加します:from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse
このコードは、IoT Hubと通信するためのSDKをインポートします。
-
import paho.mqtt.client as mqtt
行を削除します。このライブラリはもう必要ありません。トピック名を含むすべてのMQTTコード、mqtt_client
を使用するす べてのコード、およびhandle_command
を削除します。while True:
ループは保持し、このループからmqtt_client.publish
行を削除します。 -
インポート文の下に次のコードを追加します:
connection_string = "<connection string>"
<connection string>
を、このレッスンの前にデバイス用に取得した接続文字列に置き換えます。💁 これはベストプラクティスではありません。接続文字列はソースコードに保存されるべきではありません。ソースコード管理にチェックインされ、誰でも見つけることができるからです。ここでは簡単にするためにこれを行っています。理想的には、環境変数や
python-dotenv
のようなツールを使用するべきです。これについては、今後のレッスンで詳しく学びます。 -
このコードの下に、IoT Hubと通信できるデバイスクライアントオブジェクトを作成し、接続するための次のコードを追加します:
device_client = IoTHubDeviceClient.create_from_connection_string(connection_string)
print('Connecting')
device_client.connect()
print('Connected') -
このコードを実行します。デバイスが接続されるのがわかります。
pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py
Connecting
Connected
Soil moisture: 379
テレメトリを送信する
デバイスが接続されたので、MQTTブローカーの代わりにIoT Hubにテレメトリを送信できます。
タスク - テレメトリを送信する
-
while True
ループの中で、スリープの直前に次のコードを追加します:message = Message(json.dumps({ 'soil_moisture': soil_moisture }))
device_client.send_message(message)このコードは、土壌湿度の読み取り値をJSON文字列として含むIoT Hub
Message
を作成し、これをデバイスからクラウドへのメッセージとしてIoT Hubに送信します。
コマンドを処理する
デバイスは、リレーを制御するためにサーバーコードからのコマンドを処理する必要があります。これは、直接メソッドリクエストとして送信されます。
タスク - 直接メソッドリクエストを処理する
-
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
というメソッドを期待しています。💁 これは、メソッドリクエストに渡すことができるペイロードでリレーの希望する状態を渡す単一の直接メソッドリクエストとしても実装できます。
-
直接メソッドには、呼び出し元のコードに処理されたことを伝えるための応答が必要です。
handle_method_request
関数の最後に次のコードを追加して、リクエストへの応答を作成します:method_response = MethodResponse.create_from_method_request(request, 200)
device_client.send_method_response(method_response)このコードは、HTTPステータスコード200の直接メソッドリクエストへの応答を送信し、これをIoT Hubに送信します。
-
この関数定義の下に次のコードを追加します:
device_client.on_method_request_received = handle_method_request
このコードは、直接メソッドが呼び出されたときに
handle_method_request
関数を呼び出すようにIoT Hubクライアントに指示します。
💁 このコードは、code/piまたはcode/virtual-deviceフォルダーにあります。
😀 あなたの土壌湿度センサーのプログラムは、IoT Hubに接続されました!