はじめに
これは、最近AzureのIoT Hubを触ってなかったので、触ってみる個人的な備忘録です。
何回かに分けてツラツラ触ってみたいと思います。
忙しくなったら途中で終わるかもです。
今回は前回の続きです。
前回はこちら
デバイス側をメインにやってます。
メッセージにプロパティを付与する
前回、デバイスツインをやりました。これはデバイスそのもののプロパティのやりとりでした。
デバイスそのもののプロパティをやりとりすることで、結果的にクラウド上にデバイスの複製を作る(デバイスツイン)という機能でした。
ここでは、メッセージそのものに属性を付与します。
デバイスからメッセージを送信する際、そもそもメッセージの内容や処理方法、仕向けが異なる場合があります。
たとえば普段はセンサーの温度や湿度を送信するためにメッセージを利用しているとします。
でも時々、デバッグ用のメッセージなど普段利用しない、また顧客向けサービス上は不要な情報を送信したい場合があります。
このようなときは、メッセージそのものに"デバッグ用"みたいな属性を付与します。
前回d2cメッセージ作成の際に参考にした
https://github.com/Azure-Samples/azure-iot-samples-csharp/blob/main/iot-hub/Quickstarts/SimulatedDevice/Program.cs
こちらにも実は記載がありました。
こちらです。
30℃よりも高くなったら温度アラートをTrueにするといったサンプルだと思います。
これをヒントに作成します。
ゼロベースから作成
今回もC#で作ってみます。
.NETは6.0.202が入った環境です。VSCodeで作成します。
もう1度ゼロベースから作成します。
とはいえ、面倒なので今回もdevice1をコピペしてdevice3として作成していきます。
先ほど同様にdevice3フォルダを作成して
dotnet new console --framework net6.0
して、中にdevice1で作成したコードをコピペしました。
dotnet add package Microsoft.Azure.Devices.Client
もお忘れなく。
ここで扱うサンプルではカウントしか送付していませんので、カウントが3の倍数になったときはメッセージ種別を"保守(maintenance)"として送ります。
コードはこちら、最小限に絞ってます。今回は1行追加しただけです。
https://github.com/matakaha/iotsample2022/blob/main/device3/Program.cs
プロパティによってメッセージを振り分ける
IoT Hubには、"メッセージルーティング"という機能があります。
詳細は本家のドキュメントを参照ください。
本家:IoT Hub メッセージ ルーティングを使用して device-to-cloud メッセージを別のエンドポイントに送信する
とりあえず覚えておくべき情報を記載します。
メッセージルーティングは、IoT Hubが取得したメッセージやデバイスツインイベントを、他のAzureサービスにルーティングする機能です。
例えば取得したメッセージを全部Blob Storageに保管したり、条件に応じてEvent Hubsに流し込んだりします。
どの条件にも合致しなかった情報は、フォールバックルートというところに流れてきます。
今までAzureCLIで見ていたテレメトリーメッセージは、ここに飛んできた情報です。
(なぜならメッセージルーティングを使用していなかったから、情報収集の最後の砦となるフォールバックルートに飛んでいたから。)
ここでは、これをします。
- デバイスからc2dメッセージが送信される
- メッセージプロパティで"messageType : maintenance"が付与されているデータをBlob Storageへ送る
- その他メッセージはCLIセッションでモニターする
該当データをBlobに保存する(事前準備)
こちらの情報を見ながら設定します。
チュートリアル:Azure CLI と Azure portal を使用して IoT Hub のメッセージ ルーティングを構成する - ストレージ アカウントへのルーティング
まずはルーティング先のBlob Storageおよび中にコンテナ(実際のデータが入る箱)を作成します。
ここではIoT HubからBlob Storageの作成を実施しますが、先にBlob Storageを作成しておいて設定することもできます。
IoT Hubの左側のメニューから"メッセージルーティング"を選択、右側の画面内"ルート"が選択された状態で、"+追加"ボタンを押下します。
適当な名前を入れて、"+エンドポイントの追加"→"ストレージ"の順に押下します。
また適当な名前を入れて、"コンテナーを選択します"を押下します。
"+ストレージアカウント"を押下、適当な名前を入れ、その他設定を行い"OK"ボタンを押下します。
Storageの種類は今後を見越して"汎用v2"を、場所はIoT Hubと同じリージョンをお勧めします。
パフォーマンスとレプリケーションは今回はお試しなのでデフォルトのままとしました。
本番前に要件確認やパフォーマンステストを実施して、ここら辺は決めると良いかと思います。(が、個人的には本当に本番でここにセンシティブなデータをバンバン飛ばすことなんてあるか?ほかのルーティング先がよくない?と思います。)
作成中は待ちましょう。
できたら作成したBlobを選択し、"+コンテナー"を押下します。
適当な名前を入れてコンテナーを作成します。
作成したコンテナーを選び、"選択"ボタンを押下します。
元の"ストレージ エンドポイントの追加"画面まで戻ってきます。
とりあえず人間が見やすい状態にしたいので、"エンコード"を"JSON"にして、"作成"ボタンを押下します。
該当データをBlobに保存する(ルーティング作成)
詳細は本家のドキュメントを参照ください。
本家:IoT Hub メッセージ ルーティングのクエリ構文
いまから扱うのは"アプリケーションプロパティ"です。ルーティング条件を指定するクエリを記載します。
"ルーティングクエリ"に以下を指定します。
messageType = "maintenance"
入力したら"保存"ボタンを押下します。
動作確認
まず、通常のメッセージを受け取るモニターを起動します。
ドキュメントを参考に以下のコマンドをAzureポータルのCloud Shell(CLIセッション)に入れます。
参照:クイック スタート:デバイスから IoT ハブに利用統計情報を送信して Azure CLI で監視する
az iot hub monitor-events --output table --hub-name {YourIoTHubName}
起動を確認したら、先ほど作成したデバイスアプリ(device3)を動かします。
CloudShell上にデータが流れてくると思いますが、3の倍数の時(正確には3で割ってあまりがゼロの時)だけデータがモニターに表示されません。
ルーティングにヒットしたデータは、フォールバックルートには流入しないことがわかります。
ではルーティングされたデータを確認します。
ポータルで先ほど作成したBlob Storageの中を確認すると、ファイルができていることがわかります。
ファイルを選択して"編集"で中を確認すると、ファイルにデータが書き込まれていることがわかります。
ルーティングされたデータは、こちらに書き込まれました。
まとめ
今日は、c2dメッセージにプロパティを付与してみました。
また、プロパティを使って、IoT Hubでメッセージルーティングを実施してみました。
これを使って、たとえばデバッグログはBlobへ、アラートはEventHubsに投げ込んでその先でメールやTeamsに通知、残った通常のメッセージは通常のルート(フォールバックルート)を通過してデータベースへ登録、といった動きが実現できます。
IoT Hubの背後に構えるプログラムの中で、このような振り分け処理を作成しても良いですが、この機能を活用すればプログラムを分割しやすくなります。
以上
本日はここまでです。
次回はファイルアップロードをしたいと思います。