Azure IoT Hubとエッジデバイスの間でメッセージを送受信する


はじめに

AzureのIoTデバイスにエッジデバイスを登録して、Azure IoT Hubとエッジデバイスの間でメッセージを送受信する方法を紹介します。
エッジデバイスにランタイムをインストールすることなく、手軽にメッセージの送受信を行うことができます。
(エッジデバイスにIoTEdgeランタイムをインストールしてAzureと接続する方法はこちらをご覧ください。)

環境

動作確認済デバイス(OS)

  • e-RT3 Plus F3RP70-2L1(Ubuntu 18.04 32bit)
  • Raspberry Pi 4 Model B (Ubuntu Server 20.04 32bit)

これらのデバイスでは armhf アーキテクチャのパッケージが動作します。

エッジデバイスのクラウドへの登録

IoT Hubの作成

AzureにサインインしてIoT Hubを作成します。
手順はこちらの記事の「IoT Hubの作成」をご覧ください。

エッジデバイスの登録

作成したIoT Hub →「IoT デバイス」→「新規」をクリックします。

任意のデバイス登録名を入力し、「保存」をクリックします。

登録したデバイスが一覧に表示されます。クリックして接続文字列をコピーして控えておきます。

メッセージの送受信

エッジデバイスの準備

バージョン3.7以降のpythonが必要です。
python3.7のインストール方法は以前の記事の「Python3.7のインストール」をご覧ください。

venvをインストールします。

sudo apt install python3.7-venv

Note
エッジデバイスがproxy環境下にある場合はproxy設定が必要です。

仮想環境を作成します。

python3.7 -m venv venv
source venv/bin/activate

必要なパッケージをインストールします。

(venv) username@ubuntu:~$ pip install wheel
(venv) username@ubuntu:~$ pip install azure-iot-device

Azure公式のSDKのサンプルプログラムであるsimple_send_message.pyreceive_message.pyをデバイスの任意の場所に保存します(ライセンスはこちら)。

Note
本記事ではタグ「2021-6-18」のコードを使用しています。

Note
エッジデバイスがproxy環境下にある場合はコードの変更が必要です。詳しくはproxy設定をご覧ください。

エッジデバイスの環境変数に、エッジデバイスの登録で控えておいた接続文字列を設定します。

export IOTHUB_DEVICE_CONNECTION_STRING="<YOUR_DEVICE_CONNECTION_STRING>"

D2C (Device-to-Cloud)メッセージのやり取り

エッジデバイスからクラウドにメッセージを送信して、クラウド上でメッセージを確認します。

Azure Cloud Shellを開きます。

Azure Cloud Shellで以下のコマンドを実行してメッセージの到着を待ちます。{YOUR_HUB_NAME}IoT Hubの作成で作成したIoT Hub名で置き換えてください。

az iot hub monitor-events --hub-name {YOUR_HUB_NAME} --output table

Note
az iotコマンドが使用できない場合は以下のコマンドで拡張機能を追加します。

az extension add --name azure-iot

エッジデバイスでプログラムを実行してクラウドにメッセージを送信します。

(venv) username@ubuntu:~$ python3.7 simple_send_message.py
Sending message...
Message successfully sent!

エッジデバイスからメッセージを受信すると、Azure Cloud Shellに以下のようなメッセージが表示されます。

event:
  component: ''
  interface: ''
  module: ''
  origin: e-RT3-demo
  payload: This is a message that is being sent

C2D (Cloud-to-Device)メッセージのやり取り

エッジデバイスでプログラムを起動してメッセージの到着を待ちます。

(venv) username@ubuntu:~$ python3.7 receive_message.py
Press Q to quit

Azure Cloud Shellで以下のコマンドを実行して、クラウドからエッジデバイスにメッセージを送ります。{YOUR_DEVICE_NAME}エッジデバイスの登録で登録したデバイス名で、{YOUR_HUB_NAME}IoT Hubの作成で作成したIoT Hub名で置き換えてください。

az iot device c2d-message send --device-id {YOUR_DEVICE_ID} --hub-name {YOUR_HUB_NAME} --data "This is a message from Azure"

クラウドからメッセージを受信すると、エッジデバイスに以下のようなメッセージが表示されます。

the data in the message received was
b'This is a message from Azure'
custom properties are
{}

補足

proxy設定

エッジデバイスがproxy環境下にある場合はコードの変更が必要です。
環境により設定は異なりますが、一例として今回私が設定した方法を紹介します。

simple_send_message.pyreceive_message.pyともに以下の2点を変更します。

  • インポートするモジュールを追加します。プログラム上部のインポート部分に以下のコードを追加してください。
  from azure.iot.device import ProxyOptions
  import socks
  • proxy設定を追加します。以下のようにコードを変更してください。

変更前

device_client = IoTHubDeviceClient.create_from_connection_string(conn_str)

変更後

proxy_opts = ProxyOptions(
    proxy_type=socks.HTTP,
    proxy_addr="YOUR_PROXY_ADDRESS",
    proxy_port=YOUR_PROXY_PORT,
    proxy_username="YOUR_PROXY_USERNAME",
    proxy_password="YOUR_PROXY_PASSWORD"
)
device_client = IoTHubDeviceClient.create_from_connection_string(conn_str, websockets=True, proxy_options=proxy_opts)