■IoT Core Dashboard の “Azure に接続” タブでできること
最近(この一ヶ月以内くらい)、IoT Core Dashboard で IoT Hub を作れるようになりました。
IoT Core Dashboard の“Azure に接続”タブでできることは以下の3つ。
- IoT Hub の作成
- デバイス ID の作成
- デバイスへのプロビジョニング(ドロップダウンの項目名としては“プロビジョニング対象のデバイス”)
1, 2 でできることと操作方法は、先日の勉強会の資料 を参照。
本稿では、3つ目の「デバイスへのプロビジョニング」について取り上げます。
ちなみに本稿のネタ元は Windows Developer ブログ。
■IoT Hub に接続するために必要な情報
デバイスを IoT Hub に接続するためには、
- デバイス ID
- 接続文字列(IoT Hub のエンドポイントやアクセスキーを含む文字列
が必要です。
一番お手軽な方法は、const で持ったり、config ファイルなどに定義しておくやり方。ただし、デバイスごとにビルドが必要な const は検証以外ではありえないし、configだとしても管理が面倒&平文だと情報が漏れてしまった時に問題が起こるという問題がある。
次に考えられる方法は、このブログではすっかりお馴染みに MS 太田さん作の こちらのハンズオン資料 で行っているように、IoT Hub への接続に必要な情報を返す Web サービスを立てるやり方。この方法は接続情報を返すサービスのエンドポイント自体はデバイスに平文で保持することになります。
■デバイスへのプロビジョニング
よりセキュアに IoT Hub への接続情報を保持するために、Windows 10 IoT と IoT Core Dashboard で提供しているのが、デバイスの TPM を利用する方法。
※Raspberry Pi は実際には TPM を載せていないので、エミュレーターを使います。つまり現時点では、本稿で紹介している方法はセキュアではないということ。今後 and/or 他のデバイスに期待しましょう。(ラズパイの価格を考えると TPM を載せるのは難しいかな・・・)
デバイスの TPM に接続情報を保存するのはとても簡単。
- Dashboard で IoT Hub を作成する、または既存の IoT Hub に接続する。
- デバイス ID を新規登録する、または既存の IoT Hub に登録済みのデバイス ID を選択する。ここまでは先日の勉強会でやった内容。
- Windows 10 IoT Core デバイスを動作させる。
- Dashboard の [Azure に接続] タブで、IoT Hub とデバイス ID を配置したいデバイスを [プロビジョニング対象のデバイス] で指定する。
- [プロビジョニング] ボタンをクリックする。
以上で終了。


実運用では、多数のデバイスに接続情報を保存するにも、もっと効率が良い方法を検討するほうがいいと思いますが、検証フェーズや仕組みを覚える目的には上記の手順で OK。
Device Portal でデバイスを覗いてみると、確かに指定したデバイスの TPM に登録されていることが分かります。

ただし上でも触れたとおり、Raspberry Pi 2/3 は TPM を載せていないので、現時点ではエミュレーターを使っています。残念ながらセキュアではありません(他の方法より劣っているという意味ではありません、念のため)。
■TPM に保存した情報をアプリで利用する方法
TPMに接続情報を保存できたので、次はアプリでそれらの値を参照する方法が必要です。
Microsoft.Devices.Tpm クラスが面倒を見てくれます。わかりやすい名前ですね。
- Visual Studio 2015 で UWP プロジェクト(空のプロジェクトでも OK)を作成
- IoT に最低限必要なライブラリを参照。具体的には “Windows IoT Extensions for the UWP”と “Microsoft.Azure.Devices.Client”の二つ。


- TPM を利用するためのライブラリを NuGet からダウンロード。 “Microsoft.Devices.Tpm”がそれ。

- コード中では TpmDevice クラスを利用します。デバイスには複数の TPM を持てますが、今回は 0番目。
GetHostName, GetDeviceId, GetSASToken の各メソッドで必要な情報を読み出せます。

- IoT Hub に接続するには DeviceClient クラスを使います。
上のコードで取得した値を Create メソッドに渡すと IoT Hub に接続されます。あとはデータを送るのも受けるのも、先日の勉強会やハンズオン資料の通り。
実は簡単にセキュアな情報を利用できるのでした。
(上にも書いたとおり、Raspberry Pi では現時点ではエミュレーターでの動作なのですが・・・)
■DragonBoard 410c の場合
TPM が載っている Windows 10 IoT Core 対応ボードということで、DragonBoard 410c でも試してみました。
残念ながら今のところ、プロビジョニングの操作でエラーが発生して、接続情報を配置することができていません。それこそセキュリティ上の問題だと思いますが、原因はまだ分かっていません。すいません。
これについては引き続き調査してみたいと思います。


DragonBoard 410c には確かに TPM が載っているので、この操作ができれば Raspberry Pi に対するメリットになりますね。
以上、まだ課題が残っている状態ですが、セキュアに IoT Hub に接続する方法の紹介でした。