初めて IoT Hub / IoT Edge を触って、手探りで Raspberry Pi 4 + DHT22 で室温のセンサーデータをストリーミングした際に参考とした情報の箇条書きとなります。
SQL Edge のドキュメントは、Azure SQL Edge (プレビュー) のドキュメント となりますが、検証をするに際しては IoT Hub / IoT Edge についても軽くは知っておく必要がありますので、最低限、次のような情報を確認しておくと良いのではないでしょうか。
(私はこれらの情報が必要でした)
2020/5/29 時点では、IoT Edge モジュールを開発する際に環境を整備すると Threat detected: Trojan:Win32/Zpevdo.A in iotedgehubdev.exe #274 という脅威検知が行われてしまうようで、VS 2019 だけでなく、Visual Studio Code でも同様の現象が発生しました。。。。
インストール
IoT Edge デバイスとして登録する流れは、この情報を確認すれば OK
Running Azure SQL Database Edge on a Raspberry Pi
IoT Edgeデバイスとしての登録
現時点では、SQL Edge は IoT Edge デバイスのモジュールとしてインストールする必要があるため、OS のインストール後に IoT Edge デバイスとして登録を行う必要がある
Debian ベースの Linux システムに Azure IoT Edge ランタイムをインストールする
- 最初に実施する必要のある作業。
- この作業を実施することで、Raspberry Pi 4 を IoT Edge デバイスとして登録するために必要なランタイムをインストールできる
クイックスタート:初めての IoT Edge モジュールを Linux 仮想デバイスにデプロイする
- インストールした IoT Edge ランタイムを使用して、IoT Edge にデバイスを登録するための方法
- この作業を実施することで、IoT Hub に IoT Edge デバイスとして登録することができる
IoT Edge デプロイのファイアウォール規則とポート構成規則
- モジュールをでプロした際に作成される edgeHub のコンテナーで使用されている ポートの用途の説明
- 8883 : MQTT
- 5671 : AMQP
- 443 : HTTPS (プロビジョニングの通信用)
- edgeAgent (IoT Edge エージェント) / edgeHub (Iot Edge Hub)
次の情報は、SQL Edge でなく、SQL Server on Linux を使用した IoT Edge デバイスの活用方法
ARM64 では、SQL Server を展開することはできないため Linux を Edge デバイスとして登録する際に利用可能な情報であるが、SQL Server モジュール + Stream Analytics モジュールを使用すると、SQL Edge に近い環境となるため、本情報も参考となる
メッセージのルーティング
開発したモジュールで送信されているメッセージを IoT Hub / SQL Edge の Stream Anallytics に送信する際に必要となるルーティングの設定
$upstream の説明などはこのドキュメントを参照。
最初は、次のようなルートの宣言を知っていれば対応できる
- 全モジュールのメッセージを IoT Hub に送信
- FROM /messages/* INTO $upstream
- 特定のモジュールのメッセージを IoT Hub に送信
- FROM /messages/modules/SimulatedTemperatureSensor/* INTO $upstream
- 全モジュールのメッセージを SQL Edge モジュール (AzureSQLEdgePreview) の EdgeHubInput として設定した Stream Analytics の入力に送信
- FROM /messages/* INTO BrokeredEndpoint(“/modules/AzureSQLEdgePreview/inputs/EdgeHubInput”)
- 特定のモジュールのメッセージを SQL Edge モジュール (AzureSQLEdgePreview) の EdgeHubInput として設定した Stream Analytics の入力に送信
- FROM /messages/modules/SimulatedTemperatureSensor/* INTO BrokeredEndpoint(“/modules/AzureSQLEdgePreview/inputs/EdgeHubInput”)
メッセージ送信に使用している Edge Hub とは何なのか / インターネットに接続していない状態のオフラインのメッセージ処理の動作を把握する際には次のドキュメントを参照
(Edge Hub に蓄積されたメッセージの IoT Hub への送信について)
- Azure IoT Edge ランタイムとそのアーキテクチャの概要
- IoT Edge デバイス、モジュール、子デバイスの拡張オフライン機能について理解する
- IoT Hub で device-to-cloud および cloud-to-device メッセージを送信する
機能検証
IoT Hub / IoT Edge を初めて触る際に、IoT Hub にメッセージを送信するということがどのようなことを指しているのかは次の情報を確認する
- クイック スタート:デバイスから IoT ハブに利用統計情報を送信して Azure CLI で監視する
- IoT Hub にメッセージを送信するということは、どのようなことを表しているのかを確認することができる
- Portal の Cloud Shell でテストをすることができる
- シミュレートされたデバイスによる IoT Hub へのメッセージ送信と IoT Hub が受信したメッセージを確認することができる
- 次のコマンドは、自分が作成したモジュールが IoT Hub に送信しているメッセージを確認するためにも使用できるので覚えておくとよい
- az iot hub monitor-events –output table –hub-name {YourIoTHubName}
- Cloud Shell から、コマンドを実行する際に「ModuleNotFoundError: No module named ‘azure.mgmt.iothub.iot_hub_client’」が発生した場合は次の情報を参照
- ModuleNotFoundError: No module named ‘azure.mgmt.iothub.iot_hub_client’ #13093
- 次のコマンドを実行すると解決できるケースがある
- az extension remove –name azure-cli-iot-ext
- az extension add –name azure-cli-iot-ext
- IoT Hub にメッセージを送信するということは、どのようなことを表しているのかを確認することができる
SQL Edge のクイックスタートは Azure SQL Edge (プレビュー) をデプロイする となり、この手順を実行することで SQL Edge モジュールをデプロイすることが可能
以降の検証は Azure SQL Edge (プレビュー) のドキュメント のチュートリアルを実施することになるが、ストリーミングの機能を検証したいだけであれば、チュートリアル:Azure Stream Analytics を IoT Edge モジュールとしてデプロイする を実施するのがシンプルである。
Edge モジュールとして、サンプル提供されている SimulatedTemperatureSensor モジュールを展開することにより、ストリーミングの検証を実施することができる。
- SimulatedTemperatureSensor モジュールを展開し、「FROM /messages/modules/SimulatedTemperatureSensor/* INTO BrokeredEndpoint(“/modules/AzureSQLEdgePreview/inputs/<Stream Analytics 入力に指定した名称>”)」のルーティングを設定することで、SQL Edge にストリームデータを送信することができる
- SimulatedTemperatureSensor でシミュレート用のセンサーモジュールのソースは公開されている
モジュール開発
Python でモジュール開発を実施する場合 Azure IoT Device SDK を使用した開発を行う
azure-iot-device は v2 の SDK であり、azure-iothub-device-client を使用している情報は v1 の SDK を使用しているものとなるため、情報の収集を行う際にはどちらの SDK を使用しているのかは意識しておく
(ネットの公開情報の場合 v1 SDK を利用しているケースが多いが、docs の公式ドキュメントは v2 SDK となっている可能性がある v2 だとコールバック関数を使わなくてもメッセージが送信できるようである)
v1 と v2 の SDK の違いについては、IoTHub Python SDK Migration Guide を参照
メッセージ送付を行うための基本的な構文についてもこのドキュメントに記載されている
Edge Hub という Edge Hub モジュールに搭載されている Hub にメッセージを送信する場合のクラスは IoTHubModuleClient class を参照
モジュール開発について参考となる公式ドキュメント (Python を使用したモジュールを開発する際のコードの参考)
開発環境の整備についてのこ公式ドキュメントは次の情報を参照
シンプルなメッセージ送信であれば、send_message.py で確認できる
IoT Edge のモジュール開発の参考となる情報
- Azure IoT Hubを使ってみよう(デバイスデータを受け取る)
- 4GPiでPythonスクリプトを使ってAzure IoT Hubにアクセス
- Azure IoT Hubから送られたメッセージをIoTデバイスで受信する
- How to Send New Messages from Azure IoT Edge Module Python
- Armadillo-IoT G3でMicrosoft Azure IoT Edgeを動かす
- [Azure] Azure IoT Edge を使って取得した画像を Azure に送ってみる
開発したモジュール (コンテナー) から、Raspberry Pi の GPIO を使用する場合に参考にする情報
- 温度/湿度センサーDHT22をRaspberry Piで使用する方法
- DHT22 を使用して温度 / 湿度を取得する際の基本的な方法を把握できる
- DockerコンテナからRaspberryPiのGPIO・I2C・シリアル通信を使う
- Docker Access to Raspberry Pi GPIO Pins
- IoT Edge の deployment.template.json で特権を有効にする方法 (“Privileged”: true) について紹介されている
- 仕事でPythonコンテナをデプロイする人向けのDockerfile (1): オールマイティ編
- コンテナーにRPi.GPIO や Adafruit_Python_DHT をインストールする際に、gcc が不足していてエラーになる場合の対応策
- Adafruit Pyothon DHT より CircuitPython library を使用した方が良いかもしれない
- マルチステージビルドが望ましいが、イメージとして arm64v8/python:3.7-slim-buster ではなく arm64v8/python:3.7-buster をひとまず使用して、挙動を確認することも検討
- コンテナーにRPi.GPIO や Adafruit_Python_DHT をインストールする際に、gcc が不足していてエラーになる場合の対応策
- Raspberry Pi 3 and Adafruit_Python_DHT #44
- Windows の Visual Studio Code でイメージの作成を行い、Adafruit_Python_DHT を requirements.txt で pip 仕様とした際に、Raspberry Pi ではないためエラーとなった時の参考とした情報
- RUN git clone https://github.com/adafruit/Adafruit_Python_DHT.git
- RUN cd Adafruit_Python_DHT/ && python3 ./setup.py install –force-pi2
- Windows の Visual Studio Code でイメージの作成を行い、Adafruit_Python_DHT を requirements.txt で pip 仕様とした際に、Raspberry Pi ではないためエラーとなった時の参考とした情報