3
1

More than 1 year has passed since last update.

Azure IoT Hubを久しぶりに触ってみたので個人的な備忘録 2(メッセージルーティング)

Last updated at Posted at 2022-04-23

はじめに

これは、最近AzureのIoT Hubを触ってなかったので、触ってみる個人的な備忘録です。
何回かに分けてツラツラ触ってみたいと思います。
忙しくなったら途中で終わるかもです。

今回は前回の続きです。
前回はこちら
デバイス側をメインにやってます。

メッセージにプロパティを付与する

前回、デバイスツインをやりました。これはデバイスそのもののプロパティのやりとりでした。
デバイスそのもののプロパティをやりとりすることで、結果的にクラウド上にデバイスの複製を作る(デバイスツイン)という機能でした。
ここでは、メッセージそのものに属性を付与します。
デバイスからメッセージを送信する際、そもそもメッセージの内容や処理方法、仕向けが異なる場合があります。
たとえば普段はセンサーの温度や湿度を送信するためにメッセージを利用しているとします。
でも時々、デバッグ用のメッセージなど普段利用しない、また顧客向けサービス上は不要な情報を送信したい場合があります。
このようなときは、メッセージそのものに"デバッグ用"みたいな属性を付与します。
image.png
前回d2cメッセージ作成の際に参考にした
https://github.com/Azure-Samples/azure-iot-samples-csharp/blob/main/iot-hub/Quickstarts/SimulatedDevice/Program.cs
こちらにも実は記載がありました。
image.png
こちらです。
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で見ていたテレメトリーメッセージは、ここに飛んできた情報です。
(なぜならメッセージルーティングを使用していなかったから、情報収集の最後の砦となるフォールバックルートに飛んでいたから。)
ここでは、これをします。
image.png

  • デバイスからc2dメッセージが送信される
  • メッセージプロパティで"messageType : maintenance"が付与されているデータをBlob Storageへ送る
  • その他メッセージはCLIセッションでモニターする

該当データをBlobに保存する(事前準備)

こちらの情報を見ながら設定します。
チュートリアル:Azure CLI と Azure portal を使用して IoT Hub のメッセージ ルーティングを構成する - ストレージ アカウントへのルーティング
まずはルーティング先のBlob Storageおよび中にコンテナ(実際のデータが入る箱)を作成します。
ここではIoT HubからBlob Storageの作成を実施しますが、先にBlob Storageを作成しておいて設定することもできます。

IoT Hubの左側のメニューから"メッセージルーティング"を選択、右側の画面内"ルート"が選択された状態で、"+追加"ボタンを押下します。
image.png
適当な名前を入れて、"+エンドポイントの追加"→"ストレージ"の順に押下します。
image.png
また適当な名前を入れて、"コンテナーを選択します"を押下します。
image.png
"+ストレージアカウント"を押下、適当な名前を入れ、その他設定を行い"OK"ボタンを押下します。
image.png
Storageの種類は今後を見越して"汎用v2"を、場所はIoT Hubと同じリージョンをお勧めします。
パフォーマンスとレプリケーションは今回はお試しなのでデフォルトのままとしました。
本番前に要件確認やパフォーマンステストを実施して、ここら辺は決めると良いかと思います。(が、個人的には本当に本番でここにセンシティブなデータをバンバン飛ばすことなんてあるか?ほかのルーティング先がよくない?と思います。)

作成中は待ちましょう。
image.png
できたら作成したBlobを選択し、"+コンテナー"を押下します。
image.png
適当な名前を入れてコンテナーを作成します。
image.png
作成したコンテナーを選び、"選択"ボタンを押下します。
image.png
元の"ストレージ エンドポイントの追加"画面まで戻ってきます。
とりあえず人間が見やすい状態にしたいので、"エンコード"を"JSON"にして、"作成"ボタンを押下します。
image.png

該当データを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で割ってあまりがゼロの時)だけデータがモニターに表示されません。
ルーティングにヒットしたデータは、フォールバックルートには流入しないことがわかります。
image.png
ではルーティングされたデータを確認します。
image.png

ポータルで先ほど作成したBlob Storageの中を確認すると、ファイルができていることがわかります。
ファイルを選択して"編集"で中を確認すると、ファイルにデータが書き込まれていることがわかります。
image.png
ルーティングされたデータは、こちらに書き込まれました。

まとめ

今日は、c2dメッセージにプロパティを付与してみました。
また、プロパティを使って、IoT Hubでメッセージルーティングを実施してみました。
これを使って、たとえばデバッグログはBlobへ、アラートはEventHubsに投げ込んでその先でメールやTeamsに通知、残った通常のメッセージは通常のルート(フォールバックルート)を通過してデータベースへ登録、といった動きが実現できます。
IoT Hubの背後に構えるプログラムの中で、このような振り分け処理を作成しても良いですが、この機能を活用すればプログラムを分割しやすくなります。

以上

本日はここまでです。
次回はファイルアップロードをしたいと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1