Azure IoT Edge v2に最適なシングルボードコンピュータ
Azure IoT Edge v2をシングルボードコンピュータ(SBC)で動かそう!と思い、Raspberry Pi 3のRaspbianで試したところ、さまざまなエラーに見舞われて上手く動きませんでした。
「SBCで安定して動かすことはできないのか?」
いくつかのSBCで、実際にAzure IoT Edge v2を動かしてみたときの、わたし個人の見解です。
Azure IoT Edgeは現時点はプレビューです。
アップデートによって状況は改善されるものと思います。
テスト方法
OSはUbuntu Linux Server 16.04を使いました。Raspberry Pi 3はRaspbian。Windows 10が動くSBCもありますが、IoT EdgeがDockerベースで作れらていることから、Linuxの方が事故りにくいと思い、Linuxにしました。
チュートリアルにある、
をセットアップして、それぞれのモジュール(edgeAgent, edgeHub, tempSensor, asa-container)に異常がないか確認しました。(例:docker logs -f tempSensor)
本当はC#モジュールで試したかったのですが、VSCode拡張でLinuxコンテナーがAmd64しか出力できなかったので止めました。
Raspberry Pi 3
様々なエラーに見舞われましたが、、、Raspbian Lite(2018-03-13-raspbian-stretch-lite.img)にこの手順でセットアップすれば動きました。
セットアップ時にメモリが足りないようで、ときどきリブートしないとエラー地獄になります。セットアップさえ終われば、ちゃんと動いています。
ただ、遅いです。tempSensorだけなら良いですが、ASAと連携するとガクガクな動きになります。
- IoT Edgeランタイム動く
- ASA動く
- セットアップにコツがいる
- 遅い
- メモリ不足エラーが不安
UP2
AAEONが出している超パワフルなSBC。パソコンがそのままSBCになった、という感じの代物です。
- IoT Edgeラインタイム動く
- ASA動かない(edgeHubからのPOSTでエラー?)
- 鬼速い
有線LANが2系統あるのが問題なのでは?edgeHubのdocker設定を変更すれば回避できるかも?と思いましたが、深追いしていないです。
LattePanda
DFRobotが出しているLattePanda。秋月電子通商さんで販売されているので入手しやすいSBC。 UbuntuのインストールUSBメモリからブートが出来なくて、確認できませんでした。
- Ubuntuがインストールできずorz
- 基板が熱くて不安
UP
AAEONが出しているラズパイっぽいSBC。 サイズ、コネクタ配置もラズパイ風。
- IoT Edgeランタイム動く
- ASA動く
- 速い
Minnowboard MAX
これもLattePanda同様に日本で入手しやすいSBC。Minnowboard MAXは生産終了(EOL)なので、後継のMinnowboard Turbotを使いたかったのですが、、、手元に無いのでコレで。
- IoT Edgeランタイム動く
- ASA動く
- 遅い
まとめ
速くてメモリ潤沢で不安が無い ... UP
入手しやすい ... Minnowboard MAX(ただしEOL)
自らの技術力を試したい ... Raspberry Pi 3
417 - The device's deployment configuration is not setの対処方法
事象
IoT HubでIoT Edge Deviceを作り、(IoT Edge DeviceにModule追加せずに)エッジデバイスでIoT Edgeランタイムを起動すると、IoT Edge DeviceのEdge Runtime Responseに417 - The device's deployment configuration is not setというエラーが表示されます。
また、エッジデバイスでedgeAgentとedgeHubの2つのDockerコンテナが起動するはずなのが、edgeAgentしか起動しません。
pi@raspberrypi:~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1a8c72c3ce1 microsoft/azureiotedge-agent:1.0-preview "/usr/bin/dotnet Mic…" 24 hours ago Up 23 hours edgeAgent pi@raspberrypi:~ $
edgeAgentのログで、ConfigEmptyExceptionが発生していることが分かります。
2018-04-16 11:52:08.164 +00:00 [ERR] - Error refreshing edge agent configuration from twin. Microsoft.Azure.Devices.Edge.Agent.Core.ConfigSources.ConfigEmptyException: This device has an empty configuration for the edge agent. Please set a deployment manifest. at Microsoft.Azure.Devices.Edge.Agent.IoTHub.EdgeAgentConnection.UpdateDeploymentConfig() in /opt/vsts/work/1/s/edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.IoTHub/EdgeAgentConnection.cs:line 171 at Microsoft.Azure.Devices.Edge.Agent.IoTHub.EdgeAgentConnection.<RefreshTwinAsync>d__20.MoveNext() in /opt/vsts/work/1/s/edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.IoTHub/EdgeAgentConnection.cs:line 124 2018-04-16 11:52:10.378 +00:00 [INF] - Updated reported properties
原因
これは、IoT Edgeランタイムに必要な設定(edgeAgentに対するModuleTwin?)が無いことで発生しています。
対処方法
次の操作でIoT Edgeランタイムの設定を作成すると直ります。
- IoT Hubにある、IoT Edge DeviceのSet Modulesをクリック
- Add Modules画面が表示されるので、Nextをクリック
- Specify Routes画面が表示されるので、Nextをクリック
- Review Template画面が表示されるので、Submitをクリック
Review Template画面で表示されているJSONが、edgeAgentにModuleTwinで設定されているようです。
Azure IoT Edge Quick Install Guide for Raspberry Pi 3
Azure IoT Edge v2 ランタイムをRaspberry Pi 3にインストールする手順です。
Key point
Setup process consume memory and Raspberry Pi 3 has memory only little. You need reboot before heavy setup/install process.
Step 1
Create microSD image
- 2018-03-13-raspbian-stretch-lite.img
- Create empty file 'ssh' on boot volume in microSD when you need to use SSH.
Step 2
Reduce GPU memory
$ sudo vi /boot/config.txt gpu_mem=16
Disable IPv6 stack
$ sudo vi /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6=1
Reboot
$ sudo reboot
Step 3
Install pip
$ sudo apt-get update $ sudo apt-get install python-pip
Upgrade setuptools and others
$ sudo apt-get install python2.7-dev libffi-dev libssl-dev $ sudo pip install -U setuptools pip $ sudo pip install -U cryptography idna
Reboot
$ sudo reboot
Step 4
Install Docker
$ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh $ sudo usermod -aG docker pi
Re-login
$ exit
Step 5
Install Azure IoT Edge Runtime
$ sudo pip install -U azure-iot-edge-runtime-ctl $ sudo iotedgectl setup --auto-cert-gen-force-no-passwords --connection-string "{ConnectionString}"
Reboot
$ sudo reboot
Step 6
Start Azure IoT Edge Runtime
$ sudo iotedgectl start
Reboot
$ sudo reboot
iothub-explorerをAzure Cloud Shellで使えるようにする
Azure IoT Hubの状況をモニタリングするのに、AzureポータルとDevice Explorerを使うのが定番です。特に、C2DメッセージはAzureポータルでは確認できないので、Device Explorerを使うことになります。
残念なことに、このDevice ExplorerはWindows専用。MacユーザーやLinuxユーザーがC2Dメッセージをモニタリングしたいときは、Device Explorerの代わりにiothub-explorerというCLIツールを使うことになりますが、Node.jsをインストールしてiothub-explorerをインストールと、ちょっと煩わしい。
気になるが良い手が無いなぁと思っていたところ、先日、ビデオ会議でソラコム松井さん、松下さんから「Azure Cloud Shell良いよ」と、素晴らしい方法を聞いたので、試してみました。(松井さん、松下さんありがとうございます!!)
Azure Cloud Shellのセットアップ
Webブラウザから操作できるシェル。Azure管理コマンドを実行するために用意されたシェル環境のようで、Azureポータルのアカウントに紐づいて環境作成できます。(複数セッションの同時接続は可能。) サーバーは無料で、ストレージは有料。Azureストレージアカウントに課金されます。
Azureポータルの上部にある、コンソールっぽいアイコンをクリックしてください。
すると、画面が上下分割されて下部にAzure Cloud Shellが表示されるので、Bash (Linux)をクリックしてください。
ストレージの作成をクリックしてください。
なお、一番右のフォルダのようなアイコンをクリックすると、Azure Cloud Shellだけのウィンドウを開くことができます。また、そのURLをブックマークしておくと、Azureポータルを立ち上げずに直接Azure Cloud Shellを開くことも可能です。
iothub-explorerのインストール
公式の手順はnpm install -g iothub-explorerと、グローバル領域(/usr/local/lib/node_modules)にインストールしていますがAzure Cloud Shellではここにインストールすることはできません。いくつか代案がありますが、、、ここではグローバル領域を変更してインストールしましょう。
mkdir ~/.npm-global npm config set prefix '~/.npm-global' npm install -g iothub-explorer
iothub-explorerの起動
~/.npm-global/bin/iothub-explorer
すばらしい。
PATHの追加
いちいち~/.npm-global/...と入力するのは面倒なので、.bashrcにPATH追加を追記しておくと少し便利です。
vi ~/.bashrc
PATH=~/.npm-global/bin:${PATH}
. ~/.bashrc
Azure Cloud Shellの削除
一度、Azure Cloud Shellをセットアップすると、Azureストレージアカウントに課金されます。ストレージを使っているので。
もういらないよ!というときは、リソースグループのcloud-shell-storage-xxxを削除しましょう。
Power BI 勉強会@名古屋支部 #1に参加しました
Maker Faire Tokyo 2017のデモ、ゴミ箱残量モニタリングを作るときにEvent Hub -> Stream Analytics -> Power BIで実装したのですが、Power BIがいろいろ分からずWPFアプリケーションに変更していました。(十分理解する前に時間切れで使い慣れた方法に変更するというのは、お仕事では必要ですね。)
以降、Power BIをじっくりやろうというチャンスが無かったのですが、Power BI 勉強会@名古屋支部 #1が開催されるということで参加しました。
会場は日本システム開発株式会社さんのオープンイノベーションベース。(名古屋で会場を確保するのは大変なので)会場提供ありがたい。
内容はPower BIの使いどころとか使ってみるとハマるところなどを実体験に基づいて発表されていました。どれも熱意のあるセッションで素敵でした。熱意大事。詳しくはconpassのセッション情報と資料をご参照ください。(←手抜き)
togetterもどうぞ。
(わたしは仕組み、仕掛けあたりが興味ポイントなのですが)わたしが気になった、気づいた点をいくつかピックアップしますと、
描画ツールではなく分析ツール
Power BIの出力は見た目がきれいなので綺麗なレポートを作るツールと感じますが、その理解は間違い。データを手軽にコネコネして分析するためのツール。また、データを最新のものに更新しても、コネコネした手順をやりなおす必要が無い。
Power Query -> DAX
コネコネのキモは、Power QueryとDAX。特にPower Query。Power QueryはPower Query Formula Languageという関数型言語で記述するのですが、Excel風のクエリーエディターでGUI操作すると、記述が生成されます。
ストリーミングデータセット
データセットは基本的にバッチ分析で、リアルタイム分析?はストリーミングデータセット。履歴データの解析をオンすると、レポートで分析できるようになります。
データセットとストリーミングデータセット、Power BIが保持するデータ、レポートと(ダッシュボードに貼る)リアルタイム表示のタイル、の関係をどう理解するのかがポイント。
Power QueryとDAXの攻略がキモかな?と思いました。その先はデータ分析能力ですねorz
3/24に次回イベント、Power BIもくもく会があるようです。
ちょっと日にちが先なので、、、ぼっちモクモクしようと思います。
MbedプログラムをVisual Studioでデバッグする
前回に続き、MbedプログラムをVisual Studioでデバッグしてみました。
元ネタはこちらです。 blogs.msdn.microsoft.com
元ネタにあるとおり、デバッグができるのはPreviewのVisual Studio 2017 15.6です。そのため、前回と違ってVisual Studio 2017 Previewを使いました。Visual Studio 2017 Previewはここからダウンロードできます。
- Windows 10 64bit 1709
- Visual Studio 2017 15.6.0 Preview 3.0
- NUCLEO-F401RE
プログラムの作成
前々回と同じです。
Embedded開発とIoT開発をインストール
Visual Studioに含まれている、Visual C++ tools for CMake and LinuxとEmbedded開発とIoT開発のオプションをインストールしておく必要があります。
Visual Studioを英語表示にしておく
前回にVisual Studioを英語表示にしておかないとBuild/Cleanのコンテキストメニューが表示されなかったので、早めに英語表示にしておきます。ツール -> オプションの国際対応の設定にある言語をEnglishにして、Visual Studioを再起動してください。
Visual Studioで開く
前々回とほぼ同じです。
File -> Open -> Folderでエクスポートしたプログラムを開いてください。そして、Project -> Edit Settings -> CppProperties.jsonを選んで、自動的に作られたCppProperties.jsonを下記に入れ替えて保存してください。
Project -> Edit Settingsが表示されないときは、main.cppをダブルクリックで開くと表示されます。
CppProperties.json
{ "configurations": [ { "inheritEnvironments": [ "gcc-arm" ], "name": "gccarm", "includePath": [ "${env.INCLUDE}" ], "defines": [ ] } ] }
Visual Studio 2017 15.5の場合、"gcc-arm"を"gcc_arm"にしないと正常に動作しませんでした。
Visual Studio 2017 15.6.0 Preview 3.0の場合、ソースの探索にとても時間がかかるようです。CPU負荷が気になる場合はしばらく放置しましょう。
ビルド
前回と同じです。
Makefileを右クリックしてBuildを選ぶとビルドできます。
デプロイ
Nucleo_blink_led.binを右クリックしてConfigure Tasksを選んでcopyコマンドをタスクに割り付ければVisual Studioからデプロイできるようになります。
tasks.vs.json
{ "version": "0.2.1", "tasks": [ { "taskName": "Deploy", "appliesTo": "BUILD/Nucleo_blink_led.bin", "type": "launch", "command": "${env.COMSPEC}", "args": [ "copy BUILD\\Nucleo_blink_led.bin D:" ] } ] }
デバッグ
Visual StudioからMbedのデバッグは、Visual Studio -> GDB Client(arm-none-eabi-gdb) -> GDB Server -> Mbedデバイスという経路で行われます。
GDB Client(arm-none-eabi-gdb)はVisual StudioオプションのEmbedded開発とIoT開発に含まれています。
GDB Serverはデバイスに合わせて別途インストールしておく必要があります。メジャーところはpyOCD、OpenOCDですね。
今回はST-Linkが搭載されているNUCLEOなので、OpenOCDをつかうことにします。
OpenOCD
いろいろなバリエーションのものがネットで配布されていますが、お友達のkekyoさんがビルドしているものがあるので、それを使いましょう。
リリース1.0.1にあるopenocd-0.10.0_i686-w64-mingw32_2018-01-14.tar.bz2をC:\OpenOCD\openocd-0.10.0に解凍してください。
Debug and Launch Settings
Nucleo_blink_led.binを右クリックしてDebug and Launch Settingsを選んでください。Debugger選択画面が表示されるので、C/C++ Debug microcontroller(gdbserver)を選択すると、マイコンデバッグ用のlaunch.vs.jsonが作られます。
そして、launch.vs.jsonを修正します。
GDB Server
GDB Serverに関するエントリ(3箇所)を変更してください。debugServerArgsとserverStartedはMbedデバイスによって記入内容が違うことがあるのでちょっと難しいです。特にserverStarted。コマンドプロンプトでGDB Serverを起動して、表示された文言をコピーしましょう。
launch.vs.json(GDB Server関連) - 変更前
"debugServerPath": "path-to-your\\gdbserver.exe", "debugServerArgs": "-f path-to-your/board.cfg", "serverStarted": "GDB\\ server\\ started",
launch.vs.json(GDB Server関連) - 変更後
"debugServerPath": "C:\\OpenOCD\\openocd-0.10.0\\bin\\openocd.exe", "debugServerArgs": "-f board\\st_nucleo_f4.cfg", "serverStarted": "Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints",
GDB Client
GDB Clientに関するエントリ(1箇所)を変更してください。デフォルトの記述のままで正しそうですが、現時点はフルパスを明記しないと動かないようです。
launch.vs.json(GDB Client関連) - 変更前
"miDebuggerPath": "${env.gccpath}\\bin\\arm-none-eabi-gdb.exe",
launch.vs.json(GDB Client関連) - 変更後
"miDebuggerPath": "C:\\Program Files (x86)\\Microsoft Visual Studio\\Preview\\Professional\\Linux\\gcc_arm\\bin\\arm-none-eabi-gdb.exe",
Setup commands
GDBのセットアップコマンドを変更してください。一番最初のエントリはコメントなので削除する必要があります。必要に応じて、追加のコマンドを追記します。
launch.vs.json(セットアップコマンド) - 変更前
"setupCommands": [ { "text": "Documentation: Learn how to configure embedded debugging", "description": "See here for more info http://aka.ms/vsembeddeddebug", "ignoreFailures": true }, { "text": "-environment-cd ${workspaceRoot}/BUILD" }, { "text": "-file-exec-and-symbols ${workspaceRootFolderName}.elf", "description": "load file", "ignoreFailures": false }, { "text": "-enable-pretty-printing", "ignoreFailures": true }
launch.vs.json(セットアップコマンド) - 変更後
"setupCommands": [ { "text": "-environment-cd ${workspaceRoot}/BUILD" }, { "text": "-file-exec-and-symbols ${workspaceRootFolderName}.elf", "description": "load file", "ignoreFailures": false }, { "text": "-enable-pretty-printing", "ignoreFailures": true }, { "text": "monitor reset halt", "ignoreFailures": true }, { "text": "monitor reset init", "ignoreFailures": true }
デバッグ情報の生成
MbedオンラインコンパイラからエクスポートしたMakefileだと、コンパイル時にデバッグ情報が付加されていません。Makefile内のCCとCPPに'-g'を追加、'-Os'を'-O0'に変更してリビルド、デプロイしてください。リビルドですが、Makefile修正だとリビルドされないのでCleanしてBuildしてください。
Makefile(一部) - 変更前
CC = 'arm-none-eabi-gcc' '-std=gnu99' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-Os' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp' CPP = 'arm-none-eabi-g++' '-std=gnu++98' '-fno-rtti' '-Wvla' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-Os' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'
Makefile(一部) - 変更後
CC = 'arm-none-eabi-gcc' '-g' '-std=gnu99' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-O0' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp' CPP = 'arm-none-eabi-g++' '-g' '-std=gnu++98' '-fno-rtti' '-Wvla' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-O0' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'
デバッグ
Select Start ItemをNucleo_blink_led.binにしてデバッグ実行すればOKです。
が!デプロイ直後だとうまくブレークできないときがあるようです(あります)。かなり高い確率で。そんなときは、デバッグ停止して、NUCLEOのRESETボタンをクリック、再度、デバッグ実行するとうまく動くようです。思うようにブレークされないときはRESETしましょう(笑
MbedプログラムをVisual Studioでビルドする
前回に続き、MbedプログラムをVisual Studioでビルド(コンパイル)を試してみました。
環境は以下のとおりです。
- Windows 10 64bit 1709
- Visual Studio 2017 15.5.3
- NUCLEO-F401RE
ビルド
試すといっても、Makefileを右クリックしてBuildするだけ...と思いきや、右クリックしてもBuild(やClean)が表示されていません。
Visual Studioのバージョンを上げたり、15.6 Preview 2を入れたりしても、状況変わらず。
試行錯誤した結果、英語表示に切り替えるとBuild/Cleanがでてくることが分かりました。(お、おぅ...)
本件、マイクロソフトへFeedbackしましたので、改善されるでしょう。
気分一新、Makefileを右クリックしてBuildを選ぶと、make.exeが起動しないエラーが。
'C:\mbed\Nucleo_blink_led_gcc_arm_nucleo_f401re\Nucleo_blink_led\Makefile' (Build) Process 'make.exe' failed to start. 指定されたファイルが見つかりません。 at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start() at Microsoft.VisualStudio.VC.Workspace.MakefileTaskAction.<RunAsync>d__19.MoveNext() Printing diag info: ActionType = Build filepath = C:\mbed\Nucleo_blink_led_gcc_arm_nucleo_f401re\Nucleo_blink_led\Makefile pwd = C:\mbed\Nucleo_blink_led_gcc_arm_nucleo_f401re\Nucleo_blink_led path = C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm\arm-none-eabi\bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm\bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\GNU MCU Eclipse\Build Tools\2.9-20170629-1013\bin\bin makename = make.exe makepath = C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\GNU MCU Eclipse\Build Tools\2.9-20170629-1013\bin makearg = BuildConfiguration = gccarm
わたしのPCでは、C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional に Linux というフォルダーが無いので何かインストールが不足しているんじゃないかと、Visual Studio インストーラーを見たところ、それっぽい項目が増えている?ではありませんか!
C++によるLinux開発 にある、Embedded開発とIoT開発 をチェックして、追加インストールすると、Buildが正常に実行されるようになりました。
gccは6.3.1でした。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm\bin>arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]