Visual Studio Codeでmbed OSプログラムをデバッグする方法(STM32)
以前、Visual Studio Codeでmbed OSをデバッグする方法を試していました。
OCDにpyOCDとOpenOCDの2種類ありますが、OpenOCDの方(対象がSTM32のときに使う)はGDBサーバーの自動起動がうまくできなくて、その後、Visual Studio Code(というかC/C++拡張機能)のIntelliSense微妙だよね?となり、C/C++拡張機能のソースコードが公開されていないなー、使うならVisual Studioだよなー、と脳内が大幅に脱線してしまって、全然、Visual Studio Codeを触っていませんでした。
ですが、先日、ET2017のArmブースで渡會さんがVisual Studio CodeでSTM32をデバッグするデモを展示しており、すぐにセットアップ手順も公開されたので、それに沿って「以前、なにがダメだったのか」を確認しようと思います。
渡會さんが公開しているセットアップ手順はこちら。 VSCodeでSTM32マイコンのデバッグ環境を構築する | Mbed
必要なソフトウェアのインストール
VSCodeのダウンロードとインストール
既にVSCodeはインストールされていました。しかし、x86だったので、x64 1.18.1をインストールしました。
C/C++拡張機能のインストール
C/C++ 0.14.2をインストールしました。
OpenOCDのインストール
既にインストールされていました。
Open On-Chip Debugger 0.10.0+dev-00130-gcb317ea-dirty (2017-04-26-21:33)
Mbed OS用ビルドツールのインストール
Mbed CLIの開発環境が整っているので、たぶん大丈夫でしょう。というわけでスルー。
プロジェクトの設定
適当なフォルダに、サンプルプログラムをインポートします。これはいつもやっている操作ですね。
C:\mbed>mbed import mbed-os-example-blinky
VSCode用にプロジェクトをエクスポートですが、たぶんここは用意したボードに合わせて、コマンドの引数を変更しないといけない気がします。
mbed detectで、ボードの名前を確認します。
C:\mbed\mbed-os-example-blinky>mbed detect [mbed] Detected NUCLEO_F401RE, port COM11, mounted D:, interface version 0221: [mbed] Supported toolchains for NUCLEO_F401RE +---------------+-----------+-----------+-----------+-----------+-----------+-----------+ | Target | mbed OS 2 | mbed OS 5 | ARM | GCC_ARM | IAR | ARMC6 | +---------------+-----------+-----------+-----------+-----------+-----------+-----------+ | NUCLEO_F401RE | Supported | Supported | Supported | Supported | Supported | Supported | +---------------+-----------+-----------+-----------+-----------+-----------+-----------+ Supported targets: 1 Supported toolchains: 4
NUCLEO_F401REであることが分かったので、それっぽくエクスポートを実行してみます。
C:\mbed\mbed-os-example-blinky>mbed export -m NUCLEO_F401RE -i vscode_gcc_arm Scan: .
んー、なんか味気ないメッセージ表示で、ちゃんと実行できたか分かりませんが、このまま進めてみましょう。
.vscode/launch.jsonを、下記のとおり4箇所変更します。ボードとインターフェースに何を指定したらいいのか分からなかったので適当に変更しました。
"debugServerArgs": "-f \"C:\\OpenOCD\\tcl\\board\\stm32f4discovery.cfg\" -f \"C:\\OpenOCD\\tcl\\interface\\stlink-v2-1.cfg\" -c init -c \"reset init\"", "serverStarted": "target halted due to debug-request, current mode: Thread", "MIDebuggerPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\4.9 2015q3\\bin\\arm-none-eabi-gdb.exe", "debugServerPath": "C:\\OpenOCD\\openocd.exe",
ビルドとデバッグ
Visual Studio Codeの"フォルダを開く"で、mbedソースが置いてあるフォルダを開いて、デバッグ>デバッグの開始を実行します。
あれれ、良く分からないエラーが。
めげずに何度もデバッグ>デバッグの開始、をすると、なんとなくOpenOCDの起動のところまで進みました。
OpenOCDの起動でエラーになっている模様。
コマンドプロンプトで実行してみると、cfgファイルの選択が間違っているように見受けられます。
C:\mbed\mbed-os-example-blinky>"C:\OpenOCD\openocd.exe" -f "C:\OpenOCD\tcl\board\stm32f4discovery.cfg" -f "C:\OpenOCD\tcl\interface\stlink-v2-1.cfg" Open On-Chip Debugger 0.10.0+dev-00130-gcb317ea-dirty (2017-04-26-21:33) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html C:\OpenOCD\tcl\board\stm32f4discovery.cfg:4: Error: Can't find interface/stlink-v2.cfg in procedure 'script' at file "embedded:startup.tcl", line 60 at file "C:\OpenOCD\tcl\board\stm32f4discovery.cfg", line 4
NUCLEO_F401RE -> NUCLEO_L476RG
NUCLEO-F401REを早々に諦めて、過去実績のあるNUCLEO-L476RGで試すことに。
mbed export -m NUCLEO_L476RG -i vscode_gcc_armして、.vscode/launch.jsonを下記のとおり編集します。
"debugServerArgs": "-s C:\\OpenOCD\\tcl -f board\\st_nucleo_l476rg.cfg -c init -c \"reset init\"", "serverStarted": "target halted due to debug-request, current mode: Thread", "MIDebuggerPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\4.9 2015q3\\bin\\arm-none-eabi-gdb.exe", "debugServerPath": "C:\\OpenOCD\\openocd.exe",
デバッグの開始で何度かエラーになりましたが、繰り返すことで、無事、デバッガが起動しました!!!
感想
- mbed OS(STM32)をVisual Studio Codeでデバッグできた。OpenOCDで。
- デバッグの開始で、エラーになるときがあった。(ビルドに時間がかかるとエラーになるのか!?)
- 以前はserverStartedを設定していなかったのがダメだった気がする。
- 使うボードによってOpenOCDの設定をどうしたらいいか分からなかった。
- IntelliSense、まともに使える。(以前やったときは、イマイチと感じていたが、mbed-cliでimportしたのが良かったのかも?)
SignalR (alpha) for ASP.NET Core 2.0
LinuxでSignalRを使いたいと思いググったところ、ちょうどalphaバージョンがリリースされた直後でした。
このBlogのGetting Startedにやり方が書いてあるものの、ちょっとよく分からなかったので、SignalR .NET Core: Realtime cross-platform open web communicationを参考に手順を書いておきます。
SignalRって何?という方は、こちらをご参照ください。
SignalRサーバー
Visual Studio 2017で、ASP.NET Core Web アプリケーションのプロジェクトを新規作成します。
ASP.NET Core 2.0を選んで、空を選択。
出来上がったプロジェクトはこちら。
nugetからMicrosoft.AspNetCore.SignalRをインストールします。このとき、似たような名前があるので注意して選んでください。なお、現在はalphaバージョンなので、プレリリースを含めるをチェックしないと表示されません。
追加されました。
サービスにSignalRを追加します。StartupクラスのConfigureServices()にservices.AddSignalR()を追加してください。そして、Configure()にChatクラスへのルーティングを追加しておきます。
Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddSignalR(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseSignalR(routes => { routes.MapHub<Chat>("chat"); }); //app.Run(async (context) => //{ // await context.Response.WriteAsync("Hello World!"); //}); }
Chatのところのクイックアクションで、Chatクラスを追加します。
Chatクラスを下記のとおり記入します。
Chat.cs
using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRCore2 { public class Chat : Hub { public Task Send(string data) { return Clients.All.InvokeAsync("AddMessage", data); } } }
実行して、http://localhost:50031/chatを開いたときにConnection ID requiredと表示されれば正常です。
SignalRクライアント
クライアントからjsファイルやhtmlファイルを開けるよう、StartupクラスのConfigure()にapp.UseFileServer()を追加します。
Startup.cs
public class Startup { public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... app.UseFileServer(); }
npmコマンドでネットからsignalr-client-1.0.0-alpha1-final.min.jsを取得して、wwwroot/scriptsにコピーします。
npm install @aspnet/signalr-client
mkdir C:\Users\takashi\Desktop\SignalRCore2\wwwroot\scripts copy node_modules\@aspnet\signalr-client\dist\browser\signalr-client-1.0.0-alpha1-final.min.js C:\Users\takashi\Desktop\SignalRCore2\wwwroot\scripts
wwwrootにindex.htmlを新規作成します。
index.htmlのbodyタグに追加します。
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <input type="text" id="message" /> <input type="button" id="send" value="send" /> <ul id="messages"></ul> <script src="/scripts/signalr-client-1.0.0-alpha1-final.min.js"></script> <script> var conn = new signalR.HubConnection('http://localhost:50031/chat'); conn.on('AddMessage', data => { var li = document.createElement('li'); li.innerText = data; document.getElementById('messages').appendChild(li); }); conn.start() .then(() => { console.log('Started'); }) .catch(err => { console.log('Err'); }); document.getElementById('send').addEventListener('click', evt => { var data = document.getElementById('message').value; conn.invoke('Send', data); }); </script> </body> </html>
結果
実行すると、このとおり!
サンプルコード
.NET Core on BeagleBone Green(Debian 9.1)
BeagleBone Greenで.NET Coreを動かしてみました。
動機
BeagleBone GreenでAzure IoT Edgeが動くか試していて、Cサンプルが動くところまでは出来ました。 でも、Cだと開発がツライ。できればC#使いたい。ので、.NET Coreをインストールしたのですが、packageが無いとエラーに。
debian@beaglebone:~/iot-edge/build$ sudo apt-get install dotnet-sdk-2.0.0 E: Unable to locate package dotnet-sdk-2.0.0
そもそも、BeagleBone Greenで.NET Coreって動くのか? ということで、調べることにしました。
.NET Core for Linuxはx64だけ
.NET Core 2.0 - Supported OS versionsによると、対応アーキテクチャはx64だけで、ARMは対応外orz
.NET Core 2.0 RuntimeだけならARM32あり
でも、こんな素敵なブログが!
Setting up Raspian and .NET Core 2.0 on a Raspberry Pi
これによると、.NET Coreアプリケーションの開発や実行は、
の3つのコンポーネントに分かれていて、.NET Core RuntimeはARM32でも動くと書いてあります。
RuntimeのDaily Buildsがここにあって、ARM32に相当するLinux(armhf)が存在することが確認できます。
やってみる
BeagleBone Greenのファームウェアを最新にアップデートして、先のブログの手順を実施してみます。
なお、使ったファームウェアはbone-debian-9.1-iot-armhf-2017-08-31-4gb.img。
BeagleBone Greenに.NET Core Runtimeをインストール
Setting up Raspian and .NET Core 2.0 on a Raspberry PiのTask: Install the .NET Core Runtime on the Raspberry Pi.を実行します。
debian@beaglebone:~$ curl -sSL -o dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Runtime/release/2.0.0/dotnet-runtime-latest-linux-arm.tarr.gz debian@beaglebone:~$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet debian@beaglebone:~$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin
何事もなく終了。
.NET Coreアプリケーションを用意
.NET Coreアプリケーションは、Windows PCのVisual Studioで開発します。
プロジェクトの新規作成で、コンソールアプリ(.NET Core)を選択し、コンソールに適当に表示するコードを用意します。
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine("Hello BBG!"); Console.ReadLine(); } } }
.NET Coreアプリケーションをlinux-arm用に作成して、BeagleBone Greenへコピー
BeagleBone Greenへ持っていく実行ファイル群をWindows PCでdotnet publishコマンドで作成してから、ファイル転送しなければいけません。
具体的には、.csprojのフォルダで、dotnet publish -r linux-armを実行します。
C:\Users\takashi\Desktop\netcore\ConsoleApp1>dotnet publish -r linux-arm
すると、プロジェクト配下のbin\Debug\netcoreapp2.0\linux-armフォルダとbin\Debug\netcoreapp2.0\linux-arm\publishフォルダにそれらしいファイルが出来上がるので、publishフォルダの中身すべてをBeagleBone Greenへコピーします。わたしは、zip圧縮してからTeraTermのSSH SCPでコピーしました。
BeagleBone Greenで.NET Coreアプリケーションを実行
コピーした.NET Coreアプリケーションに実行属性が付いていないので、実行属性を付けてから実行します。
debian@beaglebone:~/netcore$ chmod a+x ConsoleApp1 debian@beaglebone:~/netcore$ ./ConsoleApp1 Hello BBG!
動いた!!!
おまけ
- .NET Core Runtimeをインストールせずに.NET Coreアプリケーションを実行すると下記のエラーが発生する。
debian@beaglebone:~/netcore$ ./ConsoleApp1 Failed to load , error: libunwind.so.8: cannot open shared object file: No such file or directory Failed to bind to CoreCLR at '/home/debian/netcore/libcoreclr.so'
- .NET Core Runtimeをインストールするとディスクを約52Mbytes消費した。
- Debugging .NET Core on Linux #5を参考にリモートデバッグを試したがプロセス一覧から選択した先で接続がプッツリ切れてデバッグできない。(.NET Core Runtimeだけではダメなのかな)
Azure IoT Edge + .NET Core(Ubuntu 14.04)
.NET Coreサンプルをビルド、実行してみたいと思います。
軸となる手順は.NET Core Sampleです。
OSのインストール
下記と同じ設定の、AzureのA0 Basicを使います。
Azure IoT Edgeのインストール
こちらのSet up a Linux development environmentのとおり、必要なパッケージを インストールして、Azure IoT Edgeのgitをクローンします。
matsujirushi@edge2:~$ sudo apt-get update matsujirushi@edge2:~$ sudo apt-get install curl build-essential libcurl4-openssl-dev git cmake pkg-config libssl-dev uuid-dev valgrind libglib2.0-dev libtool autoconf matsujirushi@edge2:~$ git clone https://github.com/Azure/iot-edge.git
.NET Coreのインストール
Install .NET Core SDKのUbuntu 14.04のとおり、.NET Coreをインストールします。
matsujirushi@edge2:~$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main" > /etc/apt/sources.list.d/dotnetdev.list' matsujirushi@edge2:~$ sudo apt-get update matsujirushi@edge2:~$ sudo apt-get install dotnet-sdk-2.0.0
参考にしたInstall .NET Core SDKには"sudo apt-get install dotnet-sdk-2.0.0"と書かれているので、最新の.NET Core v2.0をインストールする手順ですが、.NET Core Sampleには、"Our current version of the binding was tested and loads modules written in .NET Core v1.1.1.“と、.NET Core v1.1.1でテストしたとあります、、、
まぁ、このままv2.0で進めてみます。
.NET Coreの動作確認
とくに手順には記載ありませんが、.NET Coreが動くか確認しておきましょう。
matsujirushi@edge2:~$ dotnet new console -o consoleapp matsujirushi@edge2:~$ cd consoleapp matsujirushi@edge2:~/consoleapp$ dotnet run Hello World! matsujirushi@edge2:~/consoleapp$ cd ~
サンプルをビルド、実行
ビルド
Building the sampleのとおり、ビルドします。
matsujirushi@edge2:~$ cd iot-edge matsujirushi@edge2:~/iot-edge$ tools/build.sh --enable-dotnet-core-binding
ビルド時に自動的に実行されるテストでエラーが発生。
Starting test execution, please wait... Testhost process exited with error: It was not possible to find any compatible framework version The specified framework 'Microsoft.NETCore.App', version '1.1.1' was not found. - Check application dependencies and target a framework version installed at: / - Alternatively, install the framework version '1.1.1'.
v1.1.1じゃないとダメですか。そうですか。
.NET Core v1.1.1をインストール
v1.1.1の入れ方が分からず、あれこれネット徘徊してようやく見つけました。
matsujirushi@edge2:~$ sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list' matsujirushi@edge2:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 matsujirushi@edge2:~$ sudo apt-get update matsujirushi@edge2:~$ sudo apt-get install dotnet-dev-1.0.1
ビルド(2回目)
ハイ、気を取り直して再びビルド。
matsujirushi@edge2:~$ cd iot-edge matsujirushi@edge2:~/iot-edge$ tools/build.sh --enable-dotnet-core-binding
CMakeのバージョンが古いと言われてしまいました。
CMake Error at CMakeLists.txt:320 (cmake_minimum_required): CMake 3.2.2 or higher is required. You are running version 2.8.12.2
最新CMakeをビルド&インストール
CMakeサイトを見ると、現在の最新版は3.9.2でした。
3.9.2のソースをダウンロードして、ビルド、インストールします。
matsujirushi@edge2:~$ wget https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz matsujirushi@edge2:~$ tar xvf cmake-3.9.2.tar.gz matsujirushi@edge2:~$ cd cmake-3.9.2 matsujirushi@edge2:~/cmake-3.9.2$ ./bootstrap && make && sudo make install
ビルド(3回目)
はぁ、気を取り直して再びビルド。
matsujirushi@edge2:~$ cd iot-edge matsujirushi@edge2:~/iot-edge$ tools/build.sh --enable-dotnet-core-binding
オッケー、エラー無し!
実行
Running the sampleに記載がありますが、この文章ではちょっと分からない、、、
ファイルを漁ったところ、これで実行できることが分かりました。
matsujirushi@edge2:~$ cd ~/iot-edge/build/samples/dotnet_core_module_sample matsujirushi@edge2:~/iot-edge/build/samples/dotnet_core_module_sample$ ./dotnet_core_module_sample ../../../samples/dotnet_core_module_sample/src/dotnet_core_module_sample_lin.json
実行すると、このように表示されます。
gateway successfully created from JSON gateway shall run until ENTER is pressed 9/9/17 1:45:02 PM>?Printer?module?received?message:?SensorData: 1360631426 Property[0]>?Key=source?:?Value=sensor 9/9/17 1:45:06 PM>?Printer?module?received?message:?SensorData: 276754225 Property[0]>?Key=source?:?Value=sensor 9/9/17 1:45:11 PM>?Printer?module?received?message:?SensorData: 1900584355 Property[0]>?Key=source?:?Value=sensor 9/9/17 1:45:16 PM>?Printer?module?received?message:?SensorData: 1806553877 Property[0]>?Key=source?:?Value=sensor
まとめ
- .NET Coreは、v1.1.1をインストールする。
- CMakeは、3.2.2以上をインストールする。
さあ、次は自作モジュールか。その前に、VisualStudioからデプロイ、リモートデバッグできる環境が使えると良いのですが、それって可能なんだろうか?
Azure IoT Edgeをビルドしてみた(Ubuntu 14.04)
Azure IoT Edgeのビルドにトライしました。
OS選び
Azure IoT Edgeは下記サイトに記載があるとおり、LinuxやWindowsでテストされています。
Azure IoT Edge Operating system compatibility
モジュールのデバッグを考えるとWindows+VisualStudioが良さそうですが、組込機器で動かすことを考えるとLinuxなのかな?と思い、今回はLinuxで。
ビルドの手順を確認したいだけなので、実機ではなく、Azureの仮想マシンを使うことに。失敗したらすぐに再構築ってことでw
自宅のネット回線が遅いので、イライラを避けるためにAzure仮想マシンの選択は良いです。
Azure仮想マシンと互換リストを見比べること数分。Ubuntu Server 14.04 LTSを使うことにしました。
Ubuntu 14.04
Azureの仮想マシン作成で必要事項を入力して、ポチポチすればOK。
一番小さい「A0 Basic」にしました。
数分で出来上がり。
matsujirushi@edge1:~$ uname -a Linux edge1 4.4.0-93-generic #116~14.04.1-Ubuntu SMP Mon Aug 14 16:07:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Azure IoT Edgeのインストール
こちらのSet up a Linux development environmentのとおり、必要なパッケージを インストールして、Azure IoT Edgeのgitをクローンします。
matsujirushi@edge1:~$ sudo apt-get update matsujirushi@edge1:~$ sudo apt-get install curl build-essential libcurl4-openssl-dev git cmake pkg-config libssl-dev uuid-dev valgrind libglib2.0-dev libtool autoconf matsujirushi@edge1:~$ git clone https://github.com/Azure/iot-edge.git
サンプルをビルド、実行
同封されているサンプルプログラムの、hello_worldモジュールとloggerモジュールを実行してみたいと思います。
こちらのとおり、ビルドして、その後に実行します。
ビルド
matsujirushi@edge1:~$ cd iot-edge matsujirushi@edge1:~/iot-edge$ tools/build.sh --disable-native-remote-modules
実行
matsujirushi@edge1:~/iot-edge/build$ ./samples/hello_world/hello_world_sample ../samples/hello_world/src/hello_world_lin.json gateway successfully created from JSON gateway shall run until ENTER is pressed
表面上、なにも変化ありませんが、、、hello_worldモジュールとloggerモジュールが動いているはずです(汗
loggerモジュールはlog.txtに書き出しているので確認してみます。
matsujirushi@edge1:~/iot-edge/build$ cat log.txt [{"time":"20","content":"Log started"}, {"time":"20","properties":{"helloWorld":"from Azure IoT Gateway SDK simple sample!"},"content":"aGVsbG8gd29ybGQ="}, {"time":"20","properties":{"helloWorld":"from Azure IoT Gateway SDK simple sample!"},"content":"aGVsbG8gd29ybGQ="}, ...
まとめ
- Azure IoT Edgeは、Azure仮想マシンのUbuntu 14.04で動く。(とても簡単)
- Azure仮想マシンはA0 BasicでOK。
- ビルド結果はbuildディレクトリ配下に配置される。
- サンプルの実行は、ビルド結果を実行するが、パラメータのJSONファイルはソース側を指定している。(←ビルド結果を別環境にコピーして実行するときには注意が必要)
モジュールの追加に挑戦したいが、言語はnode.jsかnetcoreを使いたいところ。
次は、どちらかの言語のサンプルをビルドする環境を構築したいと思います。
Azure IoT HubとAzure IoT Edge、各SDKの位置づけ
Build 2017 Keynoteにも挙がっていた、Azure IoT Edge。
Stream AnalyticsやMachine Learningをエッジ側で動作させようというもので、とても興味深いものですが、そのAzure IoT Edgeを詳しく解説するイベントがあったので参加しました。
タイトルが「Deep Deep Dive」とDeepが2回w
マイクロソフト太田さんが2時間休憩なしで説明しまくるという、結構ハードなイベントでした。
イベントの内容は後日資料、動画が公開される予定なので、それを見てもらうとして、、、
イベントの後に、某氏から「EdgeとかDevice SDKとかの関係が良く分からない。」と聞かれたので、復習&整理しておこうと思い、ブログ書くことにしました。
Azure IoT Hub
現在、マイクロソフトはデバイスをAzureに接続する手段として、Azure IoT Hubを提供しています。下図のとおり、デバイスとバックエンドを仲介&スケーリングすることで、何百万台ものデバイスの同時接続することができます。
Azure IoT Hubとデバイスの接続
上図の左側にあたる、デバイスからAzure IoT Hubへの接続は、具体的にはAMQPやMQTT、HTTPで接続、通信するのですが、さまざまなデバイスで容易に接続できるよう、いくつものOS、言語でAzure IoT Hubに接続するライブラリが提供されています。これをAzure IoT Hub device SDKといいます。
Azure IoT Hubとバックエンドの接続
上図の右側にあたる、Azure IoT Hubからバックエンドへの接続は、Azure IoT Hub service SDKが提供されています。
Azure IoT HubとDevice SDKの位置づけ
図示するとこのような位置づけで、Azure IoT Hub device SDKは"device"という名称が付いているものの、全てのデバイスに入れるものではなく、Azure IoT Hubに接続するデバイスで使用するものです。
省電力デバイス -> 〇〇〇 -> Azure IoT Hub
Azure IoT Hubへの接続にはAzure IoT Hub device SDKを使うことは分かりましたが、BLEデバイスなどの極めて省電力なデバイスでこれらの機能(実際はAMQPなど)を載せるのは不可能です。このようなときは、ゲートウェイを設置して、省電力デバイスの代わりにAzure IoT Hubへ接続を代行します。このゲートウェイを実装するために、Azure IoT Gateway SDKというものが提供されています。(いました)
ゲートウェイからエッジに
バックエンドで実行していた分析をオフラインでも実行したい、とか、通信コストを削減したいというニーズが高まり、それに伴いバックエンドの機能をデバイスの近くで実行するためのコンセプトが発表されました。それがAzure IoT Edgeです。
実体は、前述のAzure IoT Gateway SDKをAzure IoT Edgeと改名して、そこに機能拡張が進められています。
下図のように、現状はまだゲートウェイ+αですが、順次整備されていくものと思います。
まとめ
- 直接、Azure IoT Hubまで到達できるデバイスは、Azure IoT Hub device SDKを使う。
- 直接、Azure IoT Hubに到達できないデバイス、省電力デバイスなどは、Azure IoT Edgeを経由して、Azure IoT Hubへ接続。
各ライブラリ、コードの所在は以下のとおりです。
- Azure IoT Hub device SDK for C
- Azure IoT Hub service SDK for C
- Azure IoT device SDK for .NET
- Azure IoT service SDK for .NET
- ...
MakeCode for micro:bitをローカル環境で立ち上げる
micro:bitのソースを少しイジってみようと思い、pxt-microbitソースから環境を構築してみたのですが、思っていた以上に辛かったので書き留めました。
ラズパイにOSをインストール
こちらを参考に、RaspberryPi3にRaspbianをインストールします。
最新のRaspbianイメージ(2017-08-16-raspbian-stretch.img)では、途中のコンパイルでエラーになり回避できない(できなかった)ので、少し古いRaspbianイメージ(2017-07-05-raspbian-jessie.img)を使ってください。
初期設定は、WiFi接続とSSHを有効化、タイムゾーン、キーボードを変更しました。
キーボード … Japanese (PC-98xx Series)
pxt-microbitをソースから構築
こちらのgithub上のソースから構築した場合」を参考にしました。
前準備
pi@raspberrypi:~ $ sudo apt-get update pi@raspberrypi:~ $ sudo apt-get upgrade
Nodeをインストール
こちらにあるコマンドのとおり、Node.js 8をインストールします。
pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - pi@raspberrypi:~ $ sudo apt-get install -y nodejs
インストール後のバージョンはこちら。
pi@raspberrypi:~ $ node -v > v8.4.0
yottaをインストール
こちらにあるコマンドのとおり、yottaをインストールします。
pi@raspberrypi:~ $ sudo apt-get update && sudo apt-get install python-setuptools cmake build-essential ninja-build python-dev libffi-dev libssl-dev && sudo easy_install pip pi@raspberrypi:~ $ sudo pip install yotta
インストール後のバージョンはこちら。
pi@raspberrypi:~ $ yotta --version > 0.18.2
toolchainをインストール
GNU ARM Embedded Toolchainをインストールします。
pi@raspberrypi:~ $ sudo apt-get install gcc-arm-none-eabi
インストール後のバージョンはこちら。
pi@raspberrypi:~ $ arm-none-eabi-gcc --version > arm-none-eabi-gcc (4.8.4-1+11-1) 4.8.4 20141219 (release)
最新のRaspbianイメージ(2017-08-16-raspbian-stretch.img)だと、arm-none-eabi-gcc (15:4.9.3+svn231177-1) 4.9.3 20150529 (prerelease)がインストールされるのですが、4.9.3だと後にコンパイルエラーが発生しました。少し古いRaspbianイメージ(2017-07-05-raspbian-jessie.img)だと、arm-none-eabi-gcc (4.8.4-1+11-1) 4.8.4 20141219 (release)がインストールされて、コンパイルエラーが発生しませんでした。
追加でパッケージをインストール
npm installで発生するエラーを回避するために、不足しているパッケージをインストールします。
Package gnome-keyring-1 was not foundの対策
pi@raspberrypi:~/pxt-microbit $ sudo apt-get install libgnome-keyring-dev
libusb.h: No such file or directoryの対策
pi@raspberrypi:~/pxt-microbit $ sudo apt-get install libusb-1.0-0-dev
/bin/sh: 1: srec_cat: not foundの対策
pi@raspberrypi:~/pxt-microbit $ sudo apt-get install srecord
pxt
あとはこちらの手順とおり。
pxt-microbitソースをcloneして、
pi@raspberrypi:~ $ git clone https://github.com/Microsoft/pxt-microbit pi@raspberrypi:~ $ cd pxt-microbit
PXT command line toolsをインストール。
pi@raspberrypi:~/pxt-microbit $ sudo npm install -g pxt
依存ファイルをインストール。
pi@raspberrypi:~/pxt-microbit $ npm install
hostnameのlocalhostをIPアドレスに書き換えてから、
pi@raspberrypi:~/pxt-microbit $ vi ~/pxt-microbit/node_modules/pxt-core/built/server.js
pxt-microbitを起動します。
pi@raspberrypi:~/pxt-microbit $ pxt serve
最後に
最新のRaspbianイメージで構築できなかったのは心残り。
stretchにarm-none-eabi-gcc 4.8を入れるとか、pxt-microbitをarm-none-eabi-gcc 4.9でビルドできるようにするとか。
上記手順をAzure仮想マシンでも確認したところ、pxt serveまでは正常に動くことが確認できた。現時点のやり方としては問題なさそう。(Azure仮想マシンの受信規則を変更しなかったので、ブラウザからpxtエディタが動作するところまでは確認していません。えへ。)