Azure IoT Hubのツール

Azure IoT Hubに接続するデバイスを開発するときに、Azure IoT Hubに送られたD2Cメッセージをモニタリングしたいことがよくあります。そんなときは、わたしはいつもDevice Explorerを使っています。

さて、最近、SignalR Serviceを試しているのですが、こんなときはデバイスの代わりにD2Cメッセージを送信したい(様々なデータを送信して試したい)のですが、Deivce Explorerには、D2Cメッセージを送信する機能がありませんでした。

他に何か使えそうなツールが無いか調べてみたところ、、、Azure IoT Hubの開発に使えるツールがいくつかあったので、メモしておきます。

Device Explorer @WinForm

f:id:matsujirushix:20190707095836p:plain

オープンソースGUIツール。
WinFormで作られているので、Windowsでしか使えません。

https://aka.ms/aziotdevexpのリンク先から、最新のビルド済みインストーラ(SetupDeviceExplorer.msi)をダウンロードできます。

バイス管理は、デバイスの作成、削除、接続文字列の取得と、接続状態、最終接続日時などを確認できます。
バイス操作は、D2Cモニタリング、C2Dメッセージ、ダイレクトメソッド、デバイスツインの読み書きができます。

iothub-explorer @黒画面

後述の「az iotを推奨」ってことでメンテナンス継続しないアナウンスあり。
ってことで、リンクだけ置いておきます。

az iot @黒画面

f:id:matsujirushix:20190707101949p:plain

オープンソースコマンドラインツール。
正式名称はMicrosoft Azure IoT Extension for Azure CLI
Azure CLI拡張機能で、Pythonで作られています。

ちなみに、Azure CLIの正式名称はMicrosoft Azure Cross-platform Command Line Interface。

Azure CLI拡張機能追加コマンドでインストールできます。 (インストール方法

Azure IoT Hubのデバイス管理、デバイス操作など、様々なことが可能です。さらに、Azure IoT Hub Device Provisioning Serviceの操作もできます。
また、Azureポータルでは表示されていない内部の情報も取得することができます。
できることのバリエーションでいえば、これが最強。
ドキュメントはここですが、英語&もりだくさんなので辛し。

Azure IoT Hub Toolkit @VSCode

f:id:matsujirushix:20190707104620p:plain

オープンソースVisual Studio Code拡張。
Node.js向けAzure IoT SDKを使って作られています。←軽く見た感じだと

インストールは、VSCode拡張の追加で。

出来ることは、ここに詳しく書かれています。
機能は、ざっと見ると、Device Explorerの機能+D2Cメッセージ 送信(!)、カスタムエンドポイント関連、IoT Edge関連のようです。

Cloud Explorer @VisualStudio

f:id:matsujirushix:20190707105234p:plain

ソースは非公開。VisualStudio拡張機能

VisualStudioインストーラに統合されているので、VisualStudioに「Azureの開発」ワークロードを追加すると、デフォルトでインストールされます。

出来ることは、Azure IoT Hub Toolkitと同等のようです。
メニューが日本語化されていて、ちょっと嬉しい。

まとめ

ちょっとD2Cメッセージ見てみたいといったライトな使い方だと、

で、
D2Cメッセージを送りたいときは、

  • Azure IoT Hub Toolkit もしくは Cloud Explorer

を使う。

Azure IoTの内部を掘り下げてやろう!という強者は、

  • az iot

を使う。

Windows, Macのどちらにも対応したハンズオンでは、Azure IoT Hub Toolkit推しってことになります。

Azure SphereのCoreとApplicationの名称

以前と用語が変更になっているっぽいので、最新のドキュメントで確認、整理しました。

docs.microsoft.com

f:id:matsujirushix:20190623200435p:plain

  • Arm Cortex-A
    • optimized for low power
    • High-level application core
    • Arm Cortex-A subsystem
    • hardware-based compartmentalization of processes
    • high-level applications, and services
  • Arm Cortex-M(s)
    • for real-time processing
    • Real-time core(s)
    • Arm Cortex-M I/O subsystem
    • real-time capable applications
    • bare-metal code or a RTOS
    • cannot access the internet directly

docs.microsoft.com

  • Build high-level applications ...

docs.microsoft.com

  • Base APIs
    • C standard library ... POSIX-based C development library
    • curl library
    • Azure IoT C SDK library
  • Applibs
    • Application ... Communicates with and controls real-time capable applications
    • GPIO
    • I2C
    • Log
    • Networking
    • RTC
    • SPI
    • Storage
    • UART
    • WiFiConfig

docs.microsoft.com

  • Build real-time capable applications (RTApps) ...

For details about programming the M4 cores on the MT3620, request the MT3620 M4 Datasheet from Avnet

まとめ

Core Core name Application name Application name(short)
Arm Cortex-A High-level application core High-level application HighLevelApp
Arm Cortex-M(s) Real-time core(s) Real-time capable application RTApp

HighLevelAppAzure Sphereサンプルコードから持ってきました。

Azure Sphere Cortex-M4のサンプルプログラムを動かしてみた

ベータサポートではありますが、19.05からCortex-M4でプログラムが動かせるようになりました。

matsujirushi.hatenablog.jp

というわけで、マイクロソフトから提供されているサンプルプログラムを動かしてみたいと思います。

サンプルプログラム

Cortex-M4のサンプルプログラムは、azure-sphere-samplesでいくつか提供されています。
Cortex-A7で動かすプログラムはHighLevelApp、Cortex-M4で動かすのはRTAppという名称になっているようです。RTAppは、RealTime Appってことみたい。

ここでは、一番シンプルなGPIO_RTApp_MT3620_BareMetalを動かすことにしましょう。

手順は、readme.mdです。

前提条件(Prerequisites)

MT3620開発ボードなら大丈夫。

サンプルをビルドと実行

SDKMCUが19.05になっていることを確認しておきます。

C:\>azsphere show-version
19.05
Command completed successfully in 00:00:00.2236452.

C:\>azsphere device show-ota-status
Your device is running Azure Sphere OS version 19.05.
The Azure Sphere Security Service is targeting this device with Azure Sphere OS version 19.05.
Your device has the expected version of the Azure Sphere OS: 19.05.
Command completed successfully in 00:00:03.8632201.

C:\>

そして、MT3620のRTCoreを有効にします。

Azure Sphereコマンドプロンプトを管理者権限で起動していない場合、ここでエラーが発生します。

C:\>azsphere dev prep-debug --EnableRTCoreDebugging
Installing USB drivers to enable real-time core debugging.
Drivers installed for all attached devices.
Getting device capability configuration for application development.
Downloading device capability configuration for device ID '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC'.
Successfully downloaded device capability configuration.
Successfully wrote device capability configuration file 'C:\Users\takashi\AppData\Local\Temp\tmpA059.tmp'.
Setting device group ID 'cd037ae5-27ca-4a13-9e3b-2a9d87f9d7bd' for device with ID '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC'.
Successfully disabled over-the-air updates.
Enabling application development capability on attached device.
Applying device capability configuration to device.
Successfully applied device capability configuration to device.
The device is rebooting.
Installing debugging server to device.
Deploying 'C:\Program Files (x86)\Microsoft Azure Sphere SDK\DebugTools\gdbserver.imagepackage' to the attached device.
Image package 'C:\Program Files (x86)\Microsoft Azure Sphere SDK\DebugTools\gdbserver.imagepackage' has been deployed to the attached device.
Application development capability enabled.
Successfully set up device '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC' for application development, and disabled over-the-air updates.
Command completed successfully in 00:00:44.1955946.

C:\>

ここでは、PCにCortex-M4デバッグ用のUSBドライバをインストールして、デバイスのcapabilityを変更、gdbserverをインストールしています。USBドライバはこれかなぁ?
f:id:matsujirushix:20190622205850p:plain

次はビルド。Visual Studioを起動して、メニューのファイル>開く>CMakeで、GPIO_RTApp_MT3620_BareMetalフォルダにあるCMakeLists.txtを開きます。すると、自動的にCMakeが実行されて、outフォルダにいろいろと書き込まれます。

いよいよビルド。ソリューションエクスプローラーでCMakeLists.txtを右クリックして、コンテキストメニューのビルドを実行します。結果、イメージパッケージ(GPIO_RTApp_MT3620_BareMetal.imagepackage)が出来上がります。

最後に、スタートアップアイテムの選択でGDB Debugger(RTCore)を選んでF5で実行すれば、イメージパッケージがMT3620開発ボードに転送されて、プログラムが実行されます。

f:id:matsujirushix:20190622211629p:plain

気になった点

ブレークポイントとか試しましたが止まりませんでした。まだ対応していないのか?それともやり方が悪いのか?
デバッグ機能が使えないのは辛し。

デバッグ機能が使えるっぽい記述があるけど、、、ブレークで止めることができないorz

■2019/6/23追記
RTCoreMain()起動直後のコードだと止まらないみたい。
この2箇所を仕込んで実行すると、line121は止まらず、line132で止まった。
f:id:matsujirushix:20190623195316p:plain

デバイスから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のマルチテナント必要と感じた。