🪶

Azure IoT Hubの動かし方を学んだお話

2024/08/19に公開

IoT機器をAzureのIoT Hubにつなげたい!けどどうやってつなぐのかさっぱり。
そんなレベルから、Azure IoT Hubとはなんなのか、から実際にIoT Hubに向けてHTTPSで送信まで行い、Azure上にデータを保存させるところまでやってみた。そんな記事。

Azure IoT Hubとは

Azure LearnのAzure IoT Hubによると、大まかにこんなことができるらしい。

  1. IoT機器から受信したデータを記録、別のサービスに送信、連携します。
  2. 1台から数百万台ものデバイスの接続を管理できます。しかも毎秒数百万台のイベントをスケーリングできるとか
  3. 管理している各デバイスそれぞれを識別し、それぞれに対してアクセス権やセキュリティを設定できます。
  4. IoT機器からの通信をセキュリティで保護できます。
  5. IoT機器と双方向通信することにより、データ受信だけでなくコマンドの送信も行うことができます。

数百万台と言われても、桁が多すぎてすごいなぁくらいしか言えない。数百万台もの機器をいろんなサービス(例えばAzure Functionとか)に簡単につなげてしまおうというわけですね。

数字の具体例を出すと、気象庁のアメダス(降水量の観測所)は、全国に1300か所あるらしいですよ。各基地に1000台の測定機器を置いておいても余裕で動かせるわけです。つまり、国全体とかそういう規模でも対応できそうなサービスってことですね。
そんな大量の機器を管理し、数百万機器/秒の単位で即座にスケーリングでオンオフすることで、大規模なライフサイクルを組めるということが強みらしいです。すげー(値が大きすぎて実感がわいていないタイプの"すげー")

Azure IoT Hubの設定

Azure IoT HubはIoT機器を管理するためのものだとわかった。
そしたらば、実際にトレーニングを通して、体験してみよう。そんな章。

Azure公式のトレーニングを使って、サンドボックス用の環境でIoT Hubを作っていきます。

リソースの追加から、IoTハブを指定。サブスクリプションとリソースグループはトレーニング用に払い出されたものを使っていきます。

1日当たりの受信メッセージ数を制限する機能もあるのだけど、その項目内で、最大おいくらドルかかりますよってかいてあるのすっごく親切ですね。

IoT Hubを作った後、IoT Hubにデバイスを追加していきます。
チュートリアルではsensor-v-3000という名前にしてくださいと書いてあるけど、new-sensorに変えてみる。

デバイスを作成できたので、さっそくデバイスの詳細を見ていこう。
シークレットキーの類は見られないようにされており、コピーボタンを押してとってくることになる。

このキーやら接続文字列を使ってデバイスからの通信を認証するわけですね。

さて、ここまでではIoT Hub上のデバイスまで作成ができました。
そしたら、そのデバイスと通信した時の動作を作っていこう。

IoTハブのメッセージルーティングからルートを追加します。

今回は単純にストレージに保存するべく、エンドポイントの種類をストレージに変更。この再、ストレージstorage-from-iotを新規で作成しておきました。Azureストレージコンテナを指定する箇所で、作成したストレージコンテナを保存先として指定してあげます。
別のサービスに繋げたい時は、ここをAzure functionとかにしてあげるといいのだろうね。

これでAzureがデータを受け取る口から、保存する動作までが実装できました。

実際にデータを送信してみる

さて、Azure IoT HubではMQTT、AMQPの他にも、HTTPSで送ることができるようです。

チュートリアルではC言語のコードを使って通信するコードを書いているのだけれど、めんどうなのでお手軽に試せるようにPostmanでHTTPSで送ってしまおうと思う。

HTTPSでPOST送信するためには、エンドポイントとsasトークンが必要になります。

エンドポイントについては、IoT Hubで設定したIoT Hub名とデバイス名を使って以下のように生成します。
https://<IoTハブ名>.azure-devices.net/devices/<デバイス名>/messages/events?api-version=2018-06-30

今回試すために、IoTハブ名にThisIsIoTHubと、デバイス名にnew-sensorをいれてあげた具体的な例はこんな感じ。
https://ThisIsIoTHub.azure-devices.net/devices/new-sensor/messages/events?api-version=2018-06-30

もう一つ、認証用のsasトークンについては、Azureのシェルを使って生成していきます。
ここで取得したトークンをAuthorizationヘッダーで送信することで認証します。

Azureにログインしているブラウザから、Azure Cloud Shellを開いて、az iot hub generate-sas-token --hub-name <IoTハブ名>のコマンドで生成します。

ちなみに、--du <秒数>をオプションとしてあげると、有効期限を設定できるみたいです。
例のごとく、IoTハブ名にThisIsIoTHubを入れて24時間の有効期限とした具体例はこう
az iot hub generate-sas-token --hub-name ThisIsIoTHub --du 86400

実行すると、IoT Hub用の拡張機能が必要なので、ダウンロードしますか?と聞かれるので、ダウンロードしてもらうことにします。
ダウンロードが完了すると続けてコマンドを実行してくれるので、暫し待つ。

しばらくすると、SharedAccessSignatureから始まるsasトークンを取得できます。やったね。

取得できたsasトークンをAuthorizationヘッダーにつけて、IoT HubのエンドポイントにPOST通信をぶんなげてあげます。

データは適当に。{sensorId: "hogera", value: "valura"}

Postmanで送信後、Azureが処理するまでの時間を待ってあげた後、Azureストレージのコンテナを覗くと送信時刻のファイルが生成されています。
これをダウンロードして、解析してみよう。

Azure上で保存されたデータを解析しよう

Azureのストレージから釣ってきたjsonの中身を見てみると、デバイスID、認証方法の他に、データが送信された時刻までの情報がプロパティとして入っています。
肝心のデータはというと、bodyとしてBase64エンコードされて入っているようです。


そんなわけで、Bodyの内容をbase64 -dコマンドを使ってデコードしてあげると、センサーIDとvalueがPostmanで送信した通りの辞書配列が取得できました。やったね。

ここまでで、AzureのIoT Hubでは、IoT Hubを作成し、Hubごとに動作を割り当てていることがわかった。
そして、そのHubにアクセスするためのエンドポイントとしてデバイスを作成して、デバイスごとに認証し、今回の場合はストレージアカウント上に保存することまでができました。というところでこの記事はこれでおしまい。

Discussion