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.pyとreceive_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で以下のコマンドを実行してメッセージの到着を待ちます。{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.py
、receive_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)
Author And Source
この問題について(Azure IoT Hubとエッジデバイスの間でメッセージを送受信する), 我々は、より多くの情報をここで見つけました https://qiita.com/Yokogawa_Ishino/items/589b28e7542785a9c7f2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .