Wio Nodeの測定データをAzure IoT Centralで表示する
Azure IoT Centralって、グラフ表示やメール通知がサクッとできて便利ですよね。
このAzure IoT Centralに、Wio Nodeの測定データを送ることができるか試してみました。
コンセプト
いたってシンプル。
タイマートリガーで10分間隔にAzure Functionsを起動して、Wio Nodeから温度・湿度を取得してAzure IoT Centralへメッセージ送信するというもの。
Wio Node
Wio NodeにGrove-BME280を接続、専用アプリでセットアップします。
すると、SeeedのWio LinkサーバーへREST APIで温度・湿度を取得することができます。
Azure IoT Central
アプリケーションを用意して、デバイステンプレートを追加、温度・湿度に対応する測定を追加します。
項目 | フィールド名 |
---|---|
温度 | temperature |
湿度 | humidity |
Azure Functions
これを放り込みます。
using Microsoft.Azure.Devices.Client; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using System; using System.Configuration; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace mjcradlefunc { public static class Function1 { [FunctionName("WioNodeToIoTCentral")] public static async Task Run([TimerTrigger("0 */10 * * * *")]TimerInfo myTimer, ILogger log) { var temperatureObject = await GetJObjectFromWioNode(GetEnvValue("WioNodeTempURI"), GetEnvValue("WioNodeToken"), log); double temperature = (double)temperatureObject["temperature"]; log.LogInformation($"temperature is {temperature}"); var humidityObject = await GetJObjectFromWioNode(GetEnvValue("WioNodeHumiURI"), GetEnvValue("WioNodeToken"), log); double humidity = (double)humidityObject["humidity"]; log.LogInformation($"humidity is {humidity}"); var msgObject = new JObject(); msgObject["temperature"] = temperature; msgObject["humidity"] = humidity; var deviceClient = DeviceClient.CreateFromConnectionString(GetEnvValue("DeviceOfIoTHub"), TransportType.Amqp); var eventMessage = new Message(Encoding.UTF8.GetBytes(msgObject.ToString())); await deviceClient.SendEventAsync(eventMessage); } private static async Task<JObject> GetJObjectFromWioNode(string uri, string token, ILogger log) { var httpClient = new HttpClient(); var jsonString = await httpClient.GetStringAsync($"{uri}?access_token={token}"); log.LogInformation($"Got json string is {jsonString}"); return JObject.Parse(jsonString); } private static string GetEnvValue(string name) { return Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process); } } }
そして、WioNodeToken
、WioNodeTempURI
、WioNodeHumiURI
、DeviceOfIoTHub
にWio NodeやAzure IoT Central(の中のAzure IoT Hub)の情報を、デバッグ時はlocal.settings.json
、実行時はapplication settingsに設定します。
local.settings.jsonの設定例
application settingsの設定例
DeviceOfIoTHub
に設定する、Azure IoT Centralの中のAzure IoT Hubのデバイス接続文字列は、dps_cstrコマンドで調べてください。
参考:デバイスからAzure IoT Centralに接続する方法 - matsujirushi’s blog
結果
でた。
費用
1日あたり、0.31円でした。
Maixduino ブロック図
タイトルのとおり。
回路図を見るついでに、ブロック図を書きました。
ブロック図
考察
- CH552Tは8051互換8bitマイコン。FTDIを模擬しているっぽい。
- M1とESP32の間はUART。で、CHT552Tも結線されている。
- M1が凄そう。
- Arduino Compatible Pin HeadersはM1とESP32に繋がっている。使い方ややこしそう。どこかに資料あるのかな?
- SPIがどういう感じなのか調べ切れていない。
- Speakerのコネクタが1.25mmピッチだった...orz
molex 51021が使えるのかな。
参考
Maixduino セットアップ手順メモ(MaixPy)
twitter見てて、なんとなーく面白そうだったので事前調査せずに買ってみました。
Maixduino。
販売ページ:Sipeed Maixduino Kit for RISC-V AI + IoT
RISC-Vにニューラルネットワークプロセッサ、Wi-FiにBluetooth、カメラにLCD。
まぁ、とにかくテンコ盛り製品w
開発環境は?
Arduino IDE or MaixPy(MicroPython)が用意されているようです。
ざっとググった感じだと、MaixPyのほうが手軽な感じ。
MaixPy
専用ファームウェアをMaixduinoに入れれば、シリアルコンソールやMaixPy IDEからPythonを実行できるというものです。
ドキュメントはココ。 maixpy.sipeed.com
現時点では、セットアップの方法がいまひとつ分からず、いくつかのサイトを徘徊して分かってきたので、メモすることにしました。
MaixPyのセットアップ
大まかには、次の作業になります。
1. 必要なファイルをダウンロード
これらのファイルが必要です。
- kflash_gui_vX.X.X_windows.7z ... ファームウェアを転送するのに使用
- maixpy_vX.X.X_full.bin ... MaixPyのファームウェア(詳しくはココ)
- maixpy-ide-windows-X.X.X.exe ... MaixPy IDE
1.はkflash_gui githubのReleasesページからダウンロードできます。
他は、MaixPy githubのReleasesページからダウンロードできます。
過去バージョンも載っているので、上の方にあるものをダウンロードしましょう。
2. Maixduinoを組み立て
Maixduinoの箱を開梱すると、本体とLCDが接続されていません。
慎重にLCDのフィルムケーブルをコネクタに取り付けます。
向きは、、、よく見ると、ケーブルと基板の双方に1番ピンのマーキングがあるので、それを参考にして接続します。
接続するとこんな感じ。
LCDがブラブラして、フィルムケーブルやコネクタが破損すると怖いので、わたしはLCDを両面テープで本体基板に貼り付けました。
3. MaixduinoをPCに接続
Type-C USBケーブルでPCに接続します。
(ケーブルは同封されていないので、、、メッチャ探した。)
シリアルポートが2個増えればOKです。
1つはRISC-Vモジュール、もう1つはESP32に繋がっています。
どっちがどっちか区別できませんが、、、わたしの場合は、小さい番号の方が、RISC-Vモジュールでした。
4. ファームウェアを転送
kflash_gui_vX.X.X_windows.7zを解凍して、中に入っているkflash_gui.exeを実行して、ファームウェアをMaixduinoへ転送します。
指定はこんな感じ。
Downloadをクリックすると、転送を開始します。
5. ファームウェア動作を確認
TeraTermなどで、RISC-Vモジュールのシリアルポートに115200,8,N,1で接続して、Ctrl+Dを押したときに、下記バナーが表示されれば正常です。
6. MaixPy IDEをインストール
maixpy-ide-windows-X.X.X.exeを実行して、MaixPy IDEをPCにインストールします。
MaixPy IDEを起動して、左下のチェーンみたいなアイコンをクリックすると、Maixduinoと接続します。
さらに、左下の再生アイコンをクリックして、フレームバッファにカメラの映像が表示されれば正常です。
Azure IoT Hubのツール
Azure IoT Hubに接続するデバイスを開発するときに、Azure IoT Hubに送られたD2Cメッセージをモニタリングしたいことがよくあります。そんなときは、わたしはいつもDevice Explorerを使っています。
さて、最近、SignalR Serviceを試しているのですが、こんなときはデバイスの代わりにD2Cメッセージを送信したい(様々なデータを送信して試したい)のですが、Deivce Explorerには、D2Cメッセージを送信する機能がありませんでした。
他に何か使えそうなツールが無いか調べてみたところ、、、Azure IoT Hubの開発に使えるツールがいくつかあったので、メモしておきます。
Device Explorer @WinForm
オープンソースのGUIツール。
WinFormで作られているので、Windowsでしか使えません。
https://aka.ms/aziotdevexpのリンク先から、最新のビルド済みインストーラ(SetupDeviceExplorer.msi)をダウンロードできます。
デバイス管理は、デバイスの作成、削除、接続文字列の取得と、接続状態、最終接続日時などを確認できます。
デバイス操作は、D2Cモニタリング、C2Dメッセージ、ダイレクトメソッド、デバイスツインの読み書きができます。
iothub-explorer @黒画面
後述の「az iotを推奨」ってことでメンテナンス継続しないアナウンスあり。
ってことで、リンクだけ置いておきます。
az iot @黒画面
オープンソースのコマンドラインツール。
正式名称は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
オープンソースのVisual Studio Code拡張。
Node.js向けAzure IoT SDKを使って作られています。←軽く見た感じだと
インストールは、VSCode拡張の追加で。
出来ることは、ここに詳しく書かれています。
機能は、ざっと見ると、Device Explorerの機能+D2Cメッセージ
送信(!)、カスタムエンドポイント関連、IoT Edge関連のようです。
Cloud Explorer @VisualStudio
ソースは非公開。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の名称
以前と用語が変更になっているっぽいので、最新のドキュメントで確認、整理しました。
- 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)
- Build high-level applications ...
- Base APIs
- Applibs
- Application ... Communicates with and controls real-time capable applications
- GPIO
- I2C
- Log
- Networking
- RTC
- SPI
- Storage
- UART
- WiFiConfig
- 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 |
HighLevelAppはAzure Sphereサンプルコードから持ってきました。
Azure Sphere Cortex-M4のサンプルプログラムを動かしてみた
ベータサポートではありますが、19.05からCortex-M4でプログラムが動かせるようになりました。
というわけで、マイクロソフトから提供されているサンプルプログラムを動かしてみたいと思います。
サンプルプログラム
Cortex-M4のサンプルプログラムは、azure-sphere-samplesでいくつか提供されています。
Cortex-A7で動かすプログラムはHighLevelApp、Cortex-M4で動かすのはRTAppという名称になっているようです。RTAppは、RealTime Appってことみたい。
ここでは、一番シンプルなGPIO_RTApp_MT3620_BareMetalを動かすことにしましょう。
手順は、readme.mdです。
前提条件(Prerequisites)
MT3620開発ボードなら大丈夫。
サンプルをビルドと実行
SDKとMCUが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を有効にします。
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ドライバはこれかなぁ?
次はビルド。Visual Studioを起動して、メニューのファイル>開く>CMakeで、GPIO_RTApp_MT3620_BareMetalフォルダにあるCMakeLists.txtを開きます。すると、自動的にCMakeが実行されて、outフォルダにいろいろと書き込まれます。
いよいよビルド。ソリューションエクスプローラーでCMakeLists.txtを右クリックして、コンテキストメニューのビルドを実行します。結果、イメージパッケージ(GPIO_RTApp_MT3620_BareMetal.imagepackage)が出来上がります。
最後に、スタートアップアイテムの選択でGDB Debugger(RTCore)を選んでF5で実行すれば、イメージパッケージがMT3620開発ボードに転送されて、プログラムが実行されます。
気になった点
ブレークポイントとか試しましたが止まりませんでした。まだ対応していないのか?それともやり方が悪いのか?
デバッグ機能が使えないのは辛し。
■2019/6/23追記
RTCoreMain()起動直後のコードだと止まらないみたい。
この2箇所を仕込んで実行すると、line121は止まらず、line132で止まった。
デバイスからAzure IoT Centralに接続する方法
IoT Centralの認知度が上がってきたのか、最近、いくつか質問が来ます。
都度、答えていると回答がブレる回答に時間がかかるので、、、ちょっと取りまとめておきます。
デバイスからAzure IoT Centralに接続するには?
公式には、IoT Centralのデバイス受け口にCloud Gatewayがあり、実体はIoT Hubであることが書かれています。
しかし、デバイスの接続情報を見ると、(みんな大好き)IoT Hub接続文字列ではなくて、スコープIDやデバイスIDなんです。
スコープIDとかで、どうやってIoT Hubに接続するの!?となりますが、、、
公式には書かれていませんが、IoT CentralのIoT Hubのデバイスに接続するには、IoT Hub DPSでプロビジョニングをするのが正しい形なのです。
図にするとこんな感じ。
- IoT Hub DPSのglobal.azure-devices-provisioning.net(グローバルデバイスエンドポイントと呼ばれている)に接続して、スコープIDやデバイスID、資格情報を渡します
- IoT Hub DPSから、IoT Hub接続文字列が返ります
- 受け取ったIoT Hub接続文字列を使って、IoT Hubに接続します
Azure IoT SDKを使う(使うべき!)なら、
します。
Provisioning client SDKをインプリせずに接続
ここでちょっと問題が。
デバイスによってはAzure IoT 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。
を使っています。
この話は、機会があればどこかで。