連休後半に入って、ようやく落ち着いて作業できる時間が取れたので、かねてから気になっていた「Azure SphereをX.509でAzure IoT Centralに接続」をやってみました。
動機
Azure SphereとAzure IoT Centralに接続するのに、いままでは、Azure IoT Centralに手動でデバイスを追加してから、デバイスの接続情報を使ってdps_cstrコマンドでAzure IoT Hub接続文字列を取得して、これをAzure Sphereのコードに埋め込んでいました。
Azure Sphereから見れば、結局、Azure IoT Hubへ接続文字列で繋ぎにいくので分かりやすいわけですが、これを大規模にスケールするには問題があります。
と、もやもやしていたところ、X.509でAzure IoT Centralに接続するサンプルコードが公式githubにアップされたので、試してみました。
やり方
Azure IoT Centralアプリケーションを作成
いつものように、Sign in to Azure IoT CentralにアクセスしてAzure IoT Centralアプリケーションを作ります。Trialでも大丈夫だと思いますが、なにか引っかかるとヤなのでPay-As-You-Goにしておきます。
Azure SphereテナントとAzure IoT Centralを連携
次に、Azure SphereテナントとAzure IoT Centralを連携します。
細かく言うと、Azure Sphereテナントが証明書を発行したデバイスを、Azure IoT Centralが信頼するよう、Azure IoT Centralに設定します。
Azure SphereテナントのCA証明書を取得します。
azsphere tenant download-CA-certificate --output CAcertificate.cer
Azure IoT Centralの、Administration - Device conneciton画面にある、Certificates(X.509)のPrimaryのところのフォルダアイコンをクリックして、さきほど取得したCA証明書を選択します。このとき、拡張子でフィルタされて表示されないので*.*に切り替える必要があります。
すると、「Needs Verification」という警告が表示されているかと思います。これは、さきほど設定したCA証明書(のプライベートキー)を本当に所有しているのか?検証が必要だぞ!という警告です。
それでは、Verificationしましょう。
Primaryのところの歯車マークをクリックして、Verification Codeを生成します。
Verification CodeをAzure Sphereテナントに渡して、検証証明書を取得します。
azsphere tenant download-validation-certificate --output ValidationCertification.cer --verificationcode <Verification Code>
検証証明書をAzure IoT Centralに渡します。
Verifyをクリックして、さきほど取得した検証証明書を選択します。すると、Verifiedに切り替わります。
Azure Sphereアプリケーションに必要な情報を揃える
あとは、Visual Studioで azure-sphere-samples/AzureIoT.sln at master · Azure/azure-sphere-samples · GitHub を開いて、環境固有の情報を書き入れて実行するだけですが、、、
現在のサンプルコードでは、これだけの情報を入れる必要があります。
- Azure IoT Central Scope ID
- Azure Sphere tenant ID
- Azure DPS global endpoint URL
- Azure IoT Hub URL <- 曲者
思うところがいろいろと。
- Azure Sphere tenant IDは、Azure Sphereアプリケーションで自動的に取得できるのでは?
- Azure DPS global endpoint URLって、固定だよね??固定じゃないの??
- Azure IoT Hub URL、、、、デバイスをRegisterしてProvisioningしないと分からない。いつも一緒とは限らないのでは?となるとOTAできない??
特に最後のは、AzureIoTライブラリとPluton Subsystemを連携できるようにしないといけないんでしょうけど、、、GAまでには対処してほしぃ。
気を取り直して、それぞれの情報を取得します。
Azure IoT Central Scope IDは、Azure IoT Centralの、Administration - Device conneciton画面にあります。
Azure sphere tenant IDは、azsphereコマンドで取得します。
azsphere tenant show-selected
Azure DPS global endpoint URLはglobal.azure-devices-provisioning.net
です。
Azure IoT Hub URLは、、、
Azure IoT Centralに、ダミーのDevice Template、Real Deviceを登録して、ShowIoTCentralConfigコマンド(もしくはdps_cstrコマンド)で取得します。
Azure Sphereアプリケーションを修正
サンプルコードのAzureIoT.slnを開いて、AzureIoTのapp_manifest.jsonに、先に調べた情報を入力します。
実行
実行すると、出力ウィンドウにAZURE_SPHERE_PROV_RESULT_PROV_DEVICE_ERROR
というエラーメッセージが表示されますが、
Azure IoT Centralの、Device Explorer - Unassociated devicesにデバイスが追加されていれば正常です。
ここで自動的に追加されたデバイスの名称はAzure SphereのDevice IDを小文字にしたものです。Device IDは
azsphere device show-attached
で確認することができます。
あとは、公式ドキュメントを参考にして、Device Templateを作って、TelemetryやEventを追加(TelemertyにTemperatureとか、EventにButtonPressとか。 )して、デバイスをAssociateすればOKです。