デバイスから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。

を使っています。

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

SORACOM User Group 東海 #5 やりました

昨日、SORACOM UG東海 #5をやりました。

soracomug-tokyo.connpass.com

イベントダイジェスト

直前にキャンセルした方がいたものの、出席率は驚異の100%!!ドタキャンがゼロでした。

わたしから簡単に全体の説明の後、高野さんからオープニングの挨拶。
アットホームな雰囲気の滑り出し。

SORACOM最新アップデート

ソラコム松下さんから、前回(1月)からのアップデートを猛スピードで説明いただきました。

f:id:matsujirushix:20190616180744j:plain

わたし的には、、、
Unified Endpoint良いですよね。さっそく使っていますw
あと、SORAZINEもウォッチしています。

そうそう、忘れていけないものが、 「Wio Extension - RTCが購入可能に」なりました。わーい。
みんなポチってね。

GPSトラッカーの制作

続いて、GPSトラッカーを制作しました。

f:id:matsujirushix:20190616181206j:plain

Wio LTEでLチカした後、HarvestのサンプルスケッチでSORACOMサービスへ送れることを確認して、あらかじめ用意してあるGPSトラッカーのスケッチを書き込み。最後に、段ボールやマスキングテープでケースを(!)作りました。

Wio LTE書き込みに必要なデバイスドライバの案内が抜けていたり、時間見積が甘くて、60min予定のところを90minに延長しました。(それでも時間が足りなかった気がします申し訳ない)

フィールドテスト

わずか1.5時間で制作したブツを持って、名古屋駅近くへ移動して動作確認しました。

f:id:matsujirushix:20190616181543j:plain

ここで、

  • あれ?GPS捕捉したかどうか見る方法が無いがやー
  • スイッチをケースに入れてしまって押せねー
  • Harvestの画面をどうやって確認しよう。。。

と困惑するのを想定していたのだが、みなさん終始冷静で。。。わたしはちょっと拍子抜けでした。

思うところ

仕掛人として、

  • 意外と適当に作れば十分なことを知る。配線とかケースとか。
  • アタマでは分かっていても、実際に作って動かして気づくことがある。GPS捕捉具合とか。

あたりを体験してもらうことを狙っていたのですが、みなさん楽しんでいただけたのだろうか?

あと、今回運営に巻き込まれてガッツリとやらされた牧さん、Wio LTEのスケッチ作らされたり、githubを操作させられたりと、「運営するとスキル上がるよ!」を楽しんでいただけたようで良かったです。
次回に向けて、運営側のトレーニングみたいなことをやりたいなーなんて考え中。 (運営はコツコツと深く、参加者は短期集中といった感じか?)

最後に、場所を快く提供いただいたアイレット株式会社さん、毎度説明に来ていただいているソラコム松下さん、どうもありがとうございました。(また次回もよろしくお願いします。)

Azure Sphere 19.05がリリース

本日、Azure Sphereの19.05がリリースされました。 リリースノートを確認してみたいと思います。

docs.microsoft.com

OSとSDKがアップデート

OSとSDKの両方がアップデートしています。
OSはOTAで配信されているので、MCUWi-Fiに接続して放置しましょう。
SDKは新しいものをダウンロード、インストールで。

新機能と変更

リアルタイムコアのプレビュー

やっと!やっときました!
ベータサポートという扱いですが、MCU内蔵のCortex-M4にアプリケーションが開発できるようになりました。
アプリケーション名称はreal-time ccapable applications(RTApps)です。覚えておきましょう。
RTApps開発の詳細はこちらです。

ハードウェアプラットフォームの追加

いままでは、ハードウェアプラットフォームはSeeed MT3620開発ボードしかサポートしていませんでしたが、今回のアップデートで増えました。

  • Seeed MT3620 Mini Development Board。シングルバンドWi-Fi。サイズが小さいプロトタイプに最適。
  • AI-Link WF-M620-RSA1 Module。シングルバンドWi-Fi。安い。
  • USI Azure Sphere Combo Module。デュアルバンドWi-FiBluetoothNFCタグによるBluetoothペアリングとデバイスプロビジョニングが可能。
  • Avnet Guardian module。既存の設備をインターネットに繋ぐ用。スターバックスのやつ。
  • Avnet MT3620 Starter Kit。デュアルバンドWi-Fi。MikroE ClickとGroveをサポート。
  • Avnet Wi-Fi Module。デュアルバンドWi-Fi

アプリケーションランタイムバージョン

アプリケーションランタイムバージョン(ARV)が1から2になりました。
最新のSDKでは、 * 1 * 2 * 2+Beta1905 が選べます。

ADCプレビュー

RTAppsでADコンバーターがベータサポートされました。

API変更

RTApps関連が増えたり、ベータだったものがプロダクションになったり。
乱数生成のPOSIX APIが追加れました。

Visual Studioサポート

以下がサポートされます。

Ethernet

Wi-Fiの代わりに、有線Ethernetが使えるようになりました。

ローカルデバイス探索

mDNSとDNS-SDによる、デバイス探索ができるようになりました。

githubサンプルコード

githubにあるAzure Sphereサンプルコードは、19.05 SDK必須となりました。

気になったもの

Cortex-M4のアプリケーションが開発できるようになったこと!
やっときた!って感じです。
これで、またしばらく調査のために時間が吸い取られてしまいそうです。

次は、有線Ethernet。展示会などWi-Fiが繋がらない場でも動かすことができるようになりました。

Azure SphereをX.509でAzure IoT Centralに接続する

連休後半に入って、ようやく落ち着いて作業できる時間が取れたので、かねてから気になっていた「Azure SphereをX.509でAzure IoT Centralに接続」をやってみました。

f:id:matsujirushix:20190503200225p:plain

動機

Azure SphereとAzure IoT Centralに接続するのに、いままでは、Azure IoT Centralに手動でデバイスを追加してから、デバイスの接続情報を使ってdps_cstrコマンドでAzure IoT Hub接続文字列を取得して、これをAzure Sphereのコードに埋め込んでいました。

Azure Sphereから見れば、結局、Azure IoT Hubへ接続文字列で繋ぎにいくので分かりやすいわけですが、これを大規模にスケールするには問題があります。

  • Azure IoT Centralに手動で追加が手間
  • SASトークンなので若干不安
  • OTAで配布が困難

と、もやもやしていたところ、X.509でAzure IoT Centralに接続するサンプルコードが公式githubにアップされたので、試してみました。

github.com

やり方

Azure IoT Centralアプリケーションを作成

いつものように、Sign in to Azure IoT CentralにアクセスしてAzure IoT Centralアプリケーションを作ります。Trialでも大丈夫だと思いますが、なにか引っかかるとヤなのでPay-As-You-Goにしておきます。

f:id:matsujirushix:20190503184201p:plain

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

f:id:matsujirushix:20190503185250p:plain

Azure IoT Centralの、Administration - Device conneciton画面にある、Certificates(X.509)のPrimaryのところのフォルダアイコンをクリックして、さきほど取得したCA証明書を選択します。このとき、拡張子でフィルタされて表示されないので*.*に切り替える必要があります。

f:id:matsujirushix:20190503185740p:plain

すると、「Needs Verification」という警告が表示されているかと思います。これは、さきほど設定したCA証明書(のプライベートキー)を本当に所有しているのか?検証が必要だぞ!という警告です。

それでは、Verificationしましょう。
Primaryのところの歯車マークをクリックして、Verification Codeを生成します。

f:id:matsujirushix:20190503190224p:plain

Verification CodeをAzure Sphereテナントに渡して、検証証明書を取得します。

azsphere tenant download-validation-certificate --output ValidationCertification.cer --verificationcode <Verification Code>

f:id:matsujirushix:20190503190411p:plain

検証証明書をAzure IoT Centralに渡します。
Verifyをクリックして、さきほど取得した検証証明書を選択します。すると、Verifiedに切り替わります。

f:id:matsujirushix:20190503190808p:plain

Azure Sphereアプリケーションに必要な情報を揃える

あとは、Visual Studioazure-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画面にあります。

f:id:matsujirushix:20190503193305p:plain

Azure sphere tenant IDは、azsphereコマンドで取得します。

azsphere tenant show-selected

f:id:matsujirushix:20190503193430p:plain

Azure DPS global endpoint URLはglobal.azure-devices-provisioning.netです。

Azure IoT Hub URLは、、、
Azure IoT Centralに、ダミーのDevice Template、Real Deviceを登録して、ShowIoTCentralConfigコマンド(もしくはdps_cstrコマンド)で取得します。

f:id:matsujirushix:20190503194259p:plain

Azure Sphereアプリケーションを修正

サンプルコードのAzureIoT.slnを開いて、AzureIoTのapp_manifest.jsonに、先に調べた情報を入力します。

f:id:matsujirushix:20190503194803p:plain

実行

実行すると、出力ウィンドウにAZURE_SPHERE_PROV_RESULT_PROV_DEVICE_ERRORというエラーメッセージが表示されますが、

f:id:matsujirushix:20190503195005p:plain

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です。

最後に

  • バイスに証明書埋め込まれているっていいね。手間がかからない。
  • 技術要素を学習するのにAzure Sphere + Azure IoT Centralは良さげ。
  • IoT Hub URLを省略できるようにしてほしい。(中の人がんばって!)
  • シナリオによってはAzure Sphereのマルチテナント必要と感じた。

ALGYAN4周年イベントで登壇しました

4/6にマイクロソフト品川で開催された、ALGYAN4周年 IoT祭り2019『IoTとAIとセキュリティ』大講演会&豪華ノベルティ抽選会!に登壇しました。

algyan.connpass.com

ちょっと過去の思い出を

ALGYAN発足から、わずか4年。まだ4年だったのね。

一番最初のイベントで、いきなり東京と大阪の同時開催。東京以外も大事にしている感ありますw
イベント申込ページが初々しい。

このときは、PinKit(GR-PEACH)+NETMFの講習でした。

PinKit(NETMF) -> Event Hub -> Stream Analytics -> Power BI, Machine Leaning

Event Hubってのが、時代を感じるなー

f:id:matsujirushix:20190413102150j:plain

当時の写真を見ると、あれまここで出会っていたのねという方々が。このイベントをキッカケに、デバイス沼にハマってしまった人も多数いるようです。

ALGYAN4周年

で、ALGYAN4周年。

まぁ、すごかった。

人多すぎ

f:id:matsujirushix:20190413103848j:plain

溢れんばかりの。。。というか、セミナールーム溢れていました。

ある方は「セミナールーム入ったときに(熱気で)曇っていた。」とおっしゃっていました。

講演すご

日本マイクロソフトSeeed(「e」3つ)、インテル、エヌビディア、ソニーセミコンダクタソリューションズ、STMicroelectronics、などなど、、、

名だたる企業の中の人が、IoT, AI, セキュリティの最新情報を一気に聞くことができました。

f:id:matsujirushix:20190413105328j:plain

支部の活動紹介も楽しかったです。
もうちょっとちゃんと時間を取ってあげたかったですね。

ふんわりした雰囲気

ビジネスイベントと違って、良い意味でふんわりとした雰囲気でした。

登壇者の方々も楽しそう。

f:id:matsujirushix:20190413140504j:plain

で、登壇振り返り

当日の様子は、4/6のtweetを見ていただくということで、、、

わたし自身の登壇について、振り返りたいと思います。

ノベルティボード解説&CAD解説

www.slideshare.net

今回、Seeed(「e」3つ)のFusionPCBチームにスポンサーになっていただき、先着約130名にノベルティボードを配布しましたが、このノベルティボードの開発経緯と開発の流れ、部品の実装方法を解説しました。

概要と苦労した点、実装の3部でざっと説明しましたが、みなさん実装に興味があるようでした。カプトンテープ。

なお、ノベルティボードはこちらのリンクからデータをダウンロード、追加発注可能です。どうぞよろしく!

IoT祭り2019 Azure Sphereの今

www.slideshare.net

2018年10月からの、Azure Sphereのアップデートを解説するつもりでしたが、Azure Sphere知らない人も多いかな?と思い、Azure Sphereの本質(なぜ我々はAzure Sphereを作ったのか?)と、アップデートの2部構成にしました。

冒頭、Azure Sphereを知っている方に挙手いただいたのですが、、、8割くらい知っていると。
想定崩れて、うろたえて気持ち不安定になり、、、思っていたより言葉少なめ、硬めなトークになってしまいました。XBoxネタ、滑った感じだしorz
聞き苦しかったかと思います...。

思うところ

  • 良くも悪くも、tweetしたり声をかけてもらえたりして、嬉しかった。(反応無いと寂しい)
  • 次は、もうちょっと落ち着いて丁寧に話そう。
  • 人多くて想定外な部分もあったかと思うが、大きなトラブルなく運営すばらしい。

Azure Sphere 19.02がリリース

Azure Sphere 19.02がリリースされました。

azure.microsoft.com

このブログ記事から気になる点のピックアップと、リリースノートを確認したいと思います。

ブログ記事

わたしが気になったところだけ抜粋。

Expect to see additional silicon announcements in the near future,

今はMT3620一択ですが、近いうちに別のチップが発表されることを示唆しています。

organizations will be able to use new peripheral classes (I2C, SPI) from the A7 core.

A7(Cortex-A7)から、I2CとSPIが使えるようになりました。
I2CはSeeed製Grove Shield併用で通信できたので気になりませんが、SPIは出来なかったので、SPI使いたい人には朗報ですね。

adding new platform support for critical networking services (DHCP and SNTP)

プライベートイーサネットDHCPとSNTP追加されました。
プライベートイーサネット、、、ゲートウェイ用途が多いのかなぁ。IIoTとか。

by leveraging our new reference solutions and hardware modules,

リファレンスソリューションとハードウェアモジュールが増えました。
リファレンスソリューションはこれ。AzureIoTとI2C, SPIは気になるので後で見る。
ハードウェアモジュールは、、、具体的に何だろう?ブログからは分かりませんでした。

リリースノート

docs.microsoft.com

新機能と変更

SPI

MT3620のSPIサポートが追加されました。(BetaAPI) (^^)/
APIこちら

I2C

MT3620のI2Cサポートが追加されました。(BetaAPI) (^^)/
APIこちら

DHCPサーバとSNTPサーバ

プライベートイーサネットDHCPサーバとSNTPサーバのサポートが追加されました。
(プライベートイーサネット試している人って、どれくらいいるんだろう??)

アプリケーションサイズとストレージ

フラッシュメモリの1MBを、アプリケーションを展開するイメージパッケージで使えるようになりました。
Flash、RAMに関して、詳しくはこちら
アプリケーションのメモリ使用状況を知ることができるようになりました。こちら。これはかなりうれしい。
また、azsphere device sideload show-quotaコマンドでmutable storageの使用量を表示できるようになりました。

アプリからread-only flash storageが読めるようになったっぽい。18.02でも出来たのかな?

Azure IoTサポート

Azure Sphere OSに入っているAzure IoT SDKを2018/10 LTSバージョンに更新しました。
Azure IoT CentralやAzure IoT Hubに繋ぐことができます。

ぱっと見、Azure IoT Centralは未だ辛そう... 要調査。

OSアップデートのリカバリ

Azure Sphere OSは、デバイス起動に失敗する可能性があるアップデートを検知して、ロールバックします。

CMake

CMakeのプレビューを公開しました。

BLE経由のWi-Fi設定

BLEからWi-Fiを設定するリファレンスソリューションを更新しました。

OSフィード

OSフィードをPreview MT3620から、

  • Retail Azure Sphere OS
  • Retail Evaluation Azure Sphere OS <- 追加

にしました。

くわしくはこちら

将来、Retail Evaluation Azure Sphere OSRetail Azure Sphere OSよりも2週間前にリリースされる予定。(いまは同時リリース)

旧リリースとの互換性

(省略。Previewなんだから、最新の19.02で再構築しましょう。)

既知の問題

詳細はリリースノートを見てください。

  • Visual Studio 2017とVisual Studio 2019 Previewの両方をインストールしているとき
  • azsphere device wifi show-statusdevice error 13.1
  • パスにASCII以外(日本語とか)が含まれているのは未サポート
  • C++コードでビルドエラーは発生しないが未サポート。(C言語のみサポート)

Seeed ReButtonでメール送信

この記事の続きです。

matsujirushi.hatenablog.jp

ReButtonを押すとAzure IoT Centralにメッセージが飛んで記録されるところまで出来たので、今回はAzure IoT Centralにメッセージが来たらEメールを送信する、、、バックエンドの設定をやってみたいと思います。

ボタンを押すとAzure IoT Centralに表示される

まず、前記事の設定が正しく動いているか確認します。

ボタンをシングルクリックして、Azure IoT Centralにメッセージが届くことを確認。

f:id:matsujirushix:20190128211401p:plain

よしよし、ちゃんと動くぞ。

ルールを追加

メッセージが届いたときにEメール送信するにはルールというものを追加します。

まず、ルールを選択して、テンプレートの編集をクリックしてください。

f:id:matsujirushix:20190128211545p:plain

次に、新しい規則をクリックしてください。

f:id:matsujirushix:20190128211625p:plain

テレメトリイベントが表示されるので、イベントをクリックしてください。

f:id:matsujirushix:20190128211920p:plain

名前を適当に入れて、条件+をクリック、測定メッセージを選んでから、保存をクリックしてください。

f:id:matsujirushix:20190128212227p:plain

ちょっと分かりにくいですが、、、
ここまでの操作で、

  • ルールを追加(イベントルール)
  • ルールに、条件を追加(メッセージが発生)

が出来上がりました。

ようするに、

「イベントの”メッセージ”が来たら、なにかやるぞ!」

が設定できた状態です。

次に、Eメール送信を設定します。

アクション+をクリックして、電子メールをクリックしてください。

f:id:matsujirushix:20190128212819p:plain

そして、終了(!?)に、Eメールアドレスを入力してから、保存をクリックしてください。
このEメールアドレスは、Azure IoT Centralにサインインしたメールアドレスを入力してください。

終了ってなんだ??と思うでしょうが、、、英語表示にするとToですw

f:id:matsujirushix:20190128213212p:plain

最後に、テンプレートの編集のDoneをクリックしてください。

f:id:matsujirushix:20190128213317p:plain

ボタンを押す!

ボタンをシングルクリックすると、、Eメールが届くようになりました!!

f:id:matsujirushix:20190128213616p:plain

Eメールの宛先を増やす

Eメールの宛先は、Azure IoT Centralに登録されていて、かつ、サインインしたアドレスしか指定することができません。

ユーザーは、管理 > ユーザー で追加することができます。

f:id:matsujirushix:20190128213914p:plain