デバイスからAzure IoT Centralに接続する方法

f:id:matsujirushix:20190622123710p:plain

IoT Centralの認知度が上がってきたのか、最近、いくつか質問が来ます。 都度、答えていると回答がブレる回答に時間がかかるので、、、ちょっと取りまとめておきます。

バイスからAzure IoT Centralに接続するには?

公式には、IoT Centralのデバイス受け口にCloud Gatewayがあり、実体はIoT Hubであることが書かれています。

f:id:matsujirushix:20190622134314p:plain

しかし、デバイスの接続情報を見ると、(みんな大好き)IoT Hub接続文字列ではなくて、スコープIDやデバイスIDなんです。

f:id:matsujirushix:20190622135228p:plain

スコープIDとかで、どうやってIoT Hubに接続するの!?となりますが、、、
公式には書かれていませんが、IoT CentralのIoT Hubのデバイスに接続するには、IoT Hub DPSでプロビジョニングをするのが正しい形なのです。

図にするとこんな感じ。

f:id:matsujirushix:20190622140841p:plain

  1. IoT Hub DPSのglobal.azure-devices-provisioning.net(グローバルデバイスエンドポイントと呼ばれている)に接続して、スコープIDやデバイスID、資格情報を渡します
  2. IoT Hub DPSから、IoT Hub接続文字列が返ります
  3. 受け取ったIoT Hub接続文字列を使って、IoT Hubに接続します

Azure IoT SDKを使う(使うべき!)なら、

  • Provisioning client SDKでIoT Hub DPSと通信して、
  • Azure IoT SDKのDevice client SDKでIoT Hubと通信

します。

Provisioning client SDKをインプリせずに接続

ここでちょっと問題が。
バイスによってはAzure IoT SDKがポーティングされていないようです。

  1. Azure IoT SDKが全く用意されていない
  2. Device client SDKがある
  3. Device client SDKとProvisioning client SDKの両方ある

2が多いみたい。
そんなデバイスにオススメなのが、コマンドラインツールでプロビジョニングだけ行う方法です。

dps_cstrコマンドを使うと、デバイスのプロビジョニングを実行して、IoT Hub接続文字列を得ることができます。

C:\>dps_cstr 0ne0005C434 34f65b8f-6c9f-43ad-a7bd-XXXXXXXXXXXX 3p4z+hFUOB5kvtn2aElI14M4Fa7vmw6mXXXXXXXXXXXX
...
Registration Information received from service: iotc-bc1c5eb9-e03c-4657-b971-XXXXXXXXXXXX.azure-devices.net!
Connection String:
HostName=iotc-bc1c5eb9-e03c-4657-b971-XXXXXXXXXXXX.azure-devices.net;DeviceId=34f65b8f-6c9f-43ad-a7bd-XXXXXXXXXXXX;SharedAccessKey=3p4z+hFUOB5kvtn2aElI14M4Fa7vmw6mXXXXXXXXXXXX

C:\>

予めPCでdps_cstrコマンドでIoT Hub接続文字列を取得して、これを使ってデバイスからIoT Hubに接続する、、、なら、IoT Hubの知識だけでデバイスとIoT Centralを連携することができます。お手軽ですね。

た・だ・し!

作法としては、デバイスが接続する都度、IoT Hub DPSとやりとりするのが正しいので、この方法は開発時だけにとどめておきましょう。

まとめ

  • バイスからIoT Centralへの接続は、IoT Hub DPS -> IoT Hub
  • IoT Hub DPSをスキップしたいときは、dps_cstrコマンドで

余談

わたしがIoT Centralの動きを調べるときに使うデバイスは、、、

プロビジョニング以外の部分は、MT3620開発ボード。(Azure Sphere
プロビジョニングを含むときは、ReButton。

を使っています。

この話は、機会があればどこかで。