はじめに#
2019年5月にIoTLTにてLTをさせていただきました。
その内容のフォローを記入しながら自分なりに整理していきたいと思います。
発表内容:
スタートアップIoTデバイスのセキュリティを考える
前回までのあらすじ#
セキュアなIoTデバイス通信をやってみた(Azure IoT 接続編‐DPSプロビジョニング)でAzure IoT Hubへの接続準備を行いました。
今回の記事に関連するソースコードは下記にて公開中。
ECC608-AzureIoT-Connect
Azure IoT Hubへの接続#
前回のDPS接続のコードは、多層のレイヤーになっており、ハンドルも多数で分かりづらく、シンプルに接続できるようにし、できるだけTLSレイヤーまでのリソースを削減したい。
そこで、セキュアなIoTデバイス通信をやってみた(MbedTLS移植編-MQTTS)をカスタマイズして接続させる。
接続に必要な情報はすでに前回のDPSプロビジョニングでデバイス内に格納されている。
ポーティングのポイント#
MQTT プロトコルを使用した IoT Hub との通信が参考になる。
それによると、
MQTT プロトコルの直接使用 (デバイスとして)
デバイスでデバイス SDK を使用できない場合でも、MQTT プロトコルをポート 8883 で使用して、デバイスをパブリックのデバイス エンドポイントに接続できます。 CONNECT パケットの場合、デバイスでは次の値を使用する必要があります。
ClientId フィールドには、deviceId を使用します。
[Usename] フィールドには、{iothubhostname}/{device_id}/?api-version=2018-06-30 を使用します。{iothubhostname} は IoT Hub の完全な CName です。
たとえば、IoT Hub の名前が contoso.azure-devices.net であり、デバイスの名前が MyDevice01 であるとすると、Username フィールドの内容は 次のようになります。
contoso.azure-devices.net/MyDevice01/?api-version=2018-06-30
とのこと。デバイスからのパブリッシュは
デバイスからクラウドへのメッセージの送信
接続に成功したら、デバイスから IoT Hub に >devices/{device_id}/messages/events/ または >devices/{device_id}/messages/events/{property_bag} をトピック名として使用してメッセージを送信できます。 {property_bag} 要素を使用すると、デバイスは追加のプロパティ付きのメッセージを URL エンコード形式で送信できるようになります。
サブスクライブは
クラウドからデバイスへのメッセージの受信
IoT Hub からメッセージを受信するには、デバイスで、devices/{device_id}/messages/devicebound/# をトピック フィルターとして使用してサブスクライブする必要があります。
と整理できる。これらを設定するため、main.c内で変数を設定。
char subtopic[100] = {};
char pubtopic[100] = {};
char usrname[100] = {};
char serialstr[20] = {};
char azureioturl[48] = {};
usrname はATECC608A からシリアル番号を抜き出し代入し、ClientIDとして使用。
azureioturlもATECC608Aのスロット8から読み込む。
残りはsprintfで生成することで作成した。
Azure IoTとの通信結果#
下記の通りシリアルコンソールでパブリッシュしたところ。
Azure IoT Hubからデバイスへのメッセージをテストで送ると、デバイス側でも受信ができている。
接続したBME280の温度、湿度、気圧データを視覚化してみた。
データの流れは
Azure IoT Hub → Stream Analytics → Power BI
となる。設定については下記を参考にさせていただいた。
Power BI を使用して Azure IoT Hub からのリアルタイム センサー データを視覚化する
上記はWEB版のPower BIだがうまくいかず、Windowsデスクトップアプリ版のPower BI Desktop で行った。



これで、セキュアエレメントを使ったAzure IoTへの接続ができた。