nanoFrameworkのファームウェアビルド

.NET Micro Framework後継の一つ、nanoFramework。

https://www.slideshare.net/TakashiMatsuoka2/tinyclr-os-on-wio-lte/9

何気なくドキュメントを見たら、ファームウェアのビルド手順が書かれていて、わたしでも出来るかも?と思い、やってみました。

参考にするドキュメントはこちら。

How to Build, Flash and Debug the STM32 nanoBooter and nanoCLR on Windows using Visual Studio Code | nanoFramework Documentation

ターゲットボードは、手元に有るSTM32F4DISCOVERYとします。

ビルド環境のセットアップ

Setting up the build environment for STM32

ディレクトリを作成

C:\>mkdir C:\nanoFramework
C:\>mkdir C:\nanoFramework_Tools

Visual Studio Codeをインストール

既にインストールされていました。

CMakeをコピー

CMakeサイトからcmake-3.13.1-win64-x64.zipをダウンロードして、C:\nanoFramework_Tools\CMakeに解凍します。

f:id:matsujirushix:20181208194914p:plain

Ninjaをコピー

ninjaのReleaseからv1.8.2のninja-win.zipをダウンロードして、C:\nanoFramework_Tools\Ninjaに解凍します。

f:id:matsujirushix:20181208195150p:plain

GNU ARM Embedded Toolchainをコピー

GNU-RM Downloadsからgcc-arm-none-eabi-7-2018-q2-update-win32.zipをダウンロードして、C:\nanoFramework_Tools\GNU_ARM_Toolchainに解凍します。

f:id:matsujirushix:20181208195939p:plain

ChibiOSをコピー

ChibiOSのSourceForgeからChibiOS_18.2.1.zipだと、nf-interpreterが想定しているものより古いバージョンのためコンパイルエラーになりました。(-.-) githubから取りましょう。

ChibiOSのstable_18.2.xブランチをzipダウンロードして、

f:id:matsujirushix:20181208200453p:plain

C:\nanoFramework_Tools\ChibiOS-stable_18.2.xに解凍します。

f:id:matsujirushix:20181208201046p:plain

nf-interpreterをクローン

デフォルトのdevelopブランチだと、UART周辺でコンパイルエラーになりました。(-.-) masterブランチを明示的に指定しましょう。

githubのnanoframework/nf-interpreterをクローンします。

C:\>cd C:\nanoFramework
C:\nanoFramework>git clone -b master https://github.com/nanoframework/nf-interpreter.git

Visual Studio Codeのセットアップ

Visual Studio Code拡張をインストール

下記URL先のInstallをクリックして、Visual Studio Code拡張をインストールします。

CMake-variants.jsonを設定

C:\nanoFramework\nf-interpreter\cmake-variants.jsonを作成します。

{
  "buildType": {
    "default": "MinSizeRel",
      "choices": { 
        "debug": {
          "short": "Debug",
          "long": "Emit debug information without performing optimizations",
          "buildType": "Debug"
        },
        "release": {
          "short": "Release",
          "long": "Enable optimizations, omit debug info",
          "buildType": "Release"
        },
        "minsize": {
          "short": "MinSizeRel",
          "long": "Optimize for smallest binary size",
          "buildType": "MinSizeRel"
        },
        "reldeb": {
          "short": "RelWithDebInfo",
          "long": "Perform optimizations AND include debugging information",
          "buildType": "RelWithDebInfo"
        }    
      }
  },

  "linkage": {
    "default": "",
    "choices": {
      "ST_STM32F4_DISCOVERY": {
        "short": "ST_STM32F4_DISCOVERY",
        "settings": {
          "BUILD_VERSION" : "0.9.99.999",
          "TOOLCHAIN_PREFIX" : "C:/nanoFramework_Tools/GNU_ARM_Toolchain",
          "TARGET_SERIES" : "STM32F4xx",
          "CHIBIOS_SOURCE" : "C:/nanoFramework_Tools/ChibiOS-stable_18.2.x",
          "CHIBIOS_BOARD" : "ST_STM32F4_DISCOVERY",
          "SWO_OUTPUT" : "ON",
          "USE_RNG" : "ON",
          "NF_FEATURE_DEBUGGER" : "ON",
          "NF_FEATURE_RTC" : "ON",
          "API_Windows.Devices.Adc" : "ON",
          "API_Windows.Devices.Gpio" : "ON",
          "API_Windows.Devices.Spi" : "ON",
          "API_Windows.Devices.I2c" : "ON",
          "API_Windows.Devices.Pwm" : "ON",
          "API_Windows.Devices.SerialCommunication" : "ON"
        }
      }
    }
  }
}

settings.jsonを設定

C:\nanoFramework\nf-interpreter\.vscode\settings.jsonを作成します。

{
    "cmake.generator": "Ninja",
    "cmake.configureSettings": {
        "CMAKE_MAKE_PROGRAM":"C:/nanoFramework_Tools/ninja/ninja.exe"
    },
    "cmake.cmakePath": "C:/nanoFramework_Tools/CMake/bin/cmake.exe"
}

nanoBooterとnanoCLRをビルド

Visual Studio Codeを起動して、ファイル -> フォルダを開く、でC:\nanoFramework\nf-interpreterを開きます。

Would you like to configure this project?というメッセージウィンドウが表示されたら、Not nowをクリックします。

Never configure projects on opening?というメッセージウィンドウが表示されたら、For this Workspaceをクリックします。

メッセージが何も表示されなくなったら、ステータスバーのNo Kit Selectedをクリックして、

f:id:matsujirushix:20181208203150p:plain

[Unspecified]を選択します。

f:id:matsujirushix:20181208203312p:plain

ステータスバーのBuildをクリックします。

f:id:matsujirushix:20181208211555p:plain

2分ちょっとでビルド完了。

f:id:matsujirushix:20181208211937p:plain

nanoBooter.hexnanoCLR.hexが出来上がりました。

f:id:matsujirushix:20181208212108p:plain

azure_iot_utilities.cのルートCA証明書

Azure SphereからAzure IoT Hubに接続するために、デバイスにルートCA証明書が必要です。

qiita.com

厳密には、Azure Sphereに限らず、Azure IoT Hubに接続するクライアントには、ルートCA証明書が必要。

この記事を書いたときはVisual Studioの接続済みサービス追加で自動生成されたazure_iot_utilities.cにあるルートCA証明書(Baltimore)をコピーしたのですが、、、

最近、証明書の有効期限が話題になっていてちょっと心配だったので、このルートCA証明書の有効期限を確認しました。

SSL証明書の内容を確認するには?

証明書の内容を表示する方法が分からず、ググってみたところ、、、
便利サイトがありました!

tech-unlimited.com

WebページにSSL証明書を貼り付けて、クリックするだけ!
なんと便利な、、、

例の証明書を確認

証明書を貼り付けて、ポチっと。

f:id:matsujirushix:20181129185903p:plain

でました!

Baltimore CyberTrust Rootで、有効期限は2025/5。

f:id:matsujirushix:20181129190033p:plain

Azure IoT Hub Sampleの調査メモ

Azure Sphere SDKに含まれている、Azure IoT Hub Sample for MT3620 RDB (Azure Sphere)プロジェクトのコードを調べます。

f:id:matsujirushix:20181125121854p:plain

main()から、Azureに絡む関数のコールツリーはこんな感じ。

main()
    InitPeripheralsAndHandlers()
        AzureIoT_Initialize()
        AzureIoT_SetMessageReceivedCallback(&MessageReceived);
        AzureIoT_SetDeviceTwinUpdateCallback(&DeviceTwinUpdate);
        AzureIoT_SetDirectMethodCallback(&DirectMethodCall);
        AzureIoT_SetConnectionStatusCallback(&IoTHubConnectionStatusChanged);
        CreateTimerFdAndAddToEpoll(,, &azureIotEventData,);
    
    WaitForEventAndCallHandler()
    
    ClosePeripheralsAndHandlers()
        AzureIoT_DestroyClient();
        AzureIoT_Deinitialize();

SetXxxCallback()で、コールバック関数を設定している。
あと、タイマーイベントでAzureIotDoWorkHandler()へのコールバックも有り。

static event_data_t azureIotEventData = {.eventHandler = &AzureIotDoWorkHandler};
static void AzureIotDoWorkHandler(event_data_t *eventData)
{
    ...
    if (AzureIoT_SetupClient()) {
        AzureIoT_DoPeriodicTasks();
    }
}

ボタン押したらメッセージ送信している部分はこれ。

static void SendMessageToIotHub(void)
{
    ...
        AzureIoT_SendMessage("Hello from Azure IoT sample!");
    ...
}

ざっと見た感じ、AzureIoT_xxxxという関数を呼んでいる。

AzureIoT_xxxxは、ウィザード?が生成したazure_iot_utilities.h/.cで定義されている。

使っている関数の、azure_iot_utilitiesの中を見るとこんな感じ。

AzureIoT_Initialize()
    IoTHub_Init()

AzureIoT_SetupClient()
    IoTHubDeviceClient_LL_CreateFromConnectionString()
    IoTHubDeviceClient_LL_SetOption()
    IoTHubDeviceClient_LL_SetMessageCallback()
    IoTHubDeviceClient_LL_SetDeviceMethodCallback()
    IoTHubDeviceClient_LL_SetDeviceTwinCallback()
    IoTHubDeviceClient_LL_SetConnectionStatusCallback()
    IoTHubDeviceClient_LL_SetRetryPolicy()
AzureIoT_DoPeriodicTasks()
    IoTHubDeviceClient_LL_DoWork()

AzureIoT_SendMessage()
    IoTHubMessage_CreateFromString()
    IoTHubDeviceClient_LL_SendEventAsync()
    IoTHubMessage_Destroy()

AzureIoT_DestroyClient()
    IoTHubDeviceClient_LL_Destroy()
AzureIoT_Deinitialize()
    IoTHub_Deinit()

Azure SphereデバイスをTP4.2.1から18.11にアップデート

これの続きです。

matsujirushi.hatenablog.jp

バイスのOSをTP4.2.1から18.11にアップデートします。

リリースノートの手順に沿って、実行します。

docs.microsoft.com

バイスのOSバージョンを確認

バイスのOSバージョンを確認します。

C:\>azsphere device show-ota-status
warn: Your device's Azure Sphere OS version (TP4.2.1) is deprecated. Recover your device using 'azsphere device recover' and try again. See aka.ms/AzureSphereUpgradeGuidance for further advice and support.
Your device is running Azure Sphere OS version TP4.2.1.
The Azure Sphere Security Service is targeting this device with Azure Sphere OS version 18.11.
warn: Your device is running an older Azure Sphere OS version (TP4.2.1). It has not yet started receiving the available update to version 18.11.
warn: Your device is not connected to Wi-Fi. Please check the Wi-Fi configuration on your device and try again.
Go to aka.ms/AzureSphereUpgradeGuidance for further advice and support.
Command completed successfully in 00:00:03.6789809.

「Azure Sphereセキュリティサービスの対象は18.11」で、
「あなたのデバイス、TP4.2.1で廃止されるよ」と脅されますw

バイスグループを変更

TP4.2.1で作ったアプリケーションがOTAでインストールされないようにするため?に、デバイスのデバイスグループをSystem Software Onlyに設定します。

C:\>azsphere device update-device-group -d cd037ae5-27ca-4a13-9e3b-2a9d87f9d7bd
warn: Your device's Azure Sphere OS version (TP4.2.1) is deprecated. Recover your device using 'azsphere device recover' and try again. See aka.ms/AzureSphereUpgradeGuidance for further advice and support.
Successfully moved device '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC' to device group 'cd037ae5-27ca-4a13-9e3b-2a9d87f9d7bd' in your Azure Sphere tenant.
Command completed successfully in 00:00:02.9167273.

はい、あいかわらずバージョンで脅されますが、デバイスグループが変更できました。

ちなみに、-dで指定しているcd037ae5-27ca-4a13-9e3b-2a9d87f9d7bdSystem Software Onlyの意味です。

バイスのOSをアップデート

では、OSをアップデートしましょう。

azsphere device recoverを実行せよ、ということですが、TP4.2.1では-iパラメータが必須でした。
どうやら、18.11でオプションになったようです。

C:\>azsphere device recover
Starting device recovery. Please note that this may take up to 10 minutes.
Board found. Sending recovery bootloader.
Erasing flash.
Sending images.
Sending image 1 of 16.
Sending image 2 of 16.
...
Sending image 16 of 16.
Finished writing images; rebooting board.
Device ID: 961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC
Device recovered successfully.
Command completed successfully in 00:02:40.9711364.

イメージファイルはここに展開されていました。 C:\Program Files (x86)\Microsoft Azure Sphere SDK\RecoveryImages

バイスのOSバージョンを確認(2回目)

バイスのOSバージョンを確認します。

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

アップデート完了!!

TP4.2.1のプロジェクトが実行できない

TP4.2.1で作ったプロジェクトを18.11で実行してみようとしたところ、プロジェクトにターゲットAPIセットが設定されていないとエラーになりました。

1>------ ビルド開始: プロジェクト: SteppingMotor, 構成: Debug ARM ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Application Type\Linux\1.0\AzureSphere.targets(38,5): error : 'Target API Set' project property is not set. Open the Project Properties and set this field using the drop-down box. Ensure that the Configuration selected on that page includes the active build configuration (e.g. Debug, Release, All Configurations).
1>プロジェクト "SteppingMotor.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

ターゲットAPIセットを1に設定したところ、問題なくコンパイル、実行できました。

Azure Sphere SDK 18.11をインストール

これの続きです。

matsujirushi.hatenablog.jp

Azure Sphere SDK 18.11をインストールしてみます。

インストーラをダウンロード

ブラウザでhttp://aka.ms/AzureSphereSDKDownloadを開くと、インストーラがダウンロードされます。

Azure_Sphere_SDK_Preview_for_Visual_Studio.exeと、ファイル名にバージョン番号が無いので、ちょっと分かりにくいです。

ダウンロードしてから、ファイルの詳細を見るとバージョンが18.11.3.20192であることが確認できます。

f:id:matsujirushix:20181116204054p:plain

インストール

わたしのPCには、すでにAzure Sphere SDK TP4.2.1が入っていますが、それをアンインストールせずに、ダウンロードしたEXEを実行してインストールしてみました。

画面の指示に従い、進めていくと、、、完了。

事前に古いバージョンのアンインストールは不要でした。

インストール結果

azsphereコマンド

azsphereコマンドは、18.11.3.20146になりました。

C:\>azsphere
Missing required positional argument '<Operation>'.

Azure Sphere Utility version 18.11.3.20146
Copyright (C) Microsoft Corporation. All rights reserved.
...

Visual Studio拡張

Visual Studio拡張は、18.11.3.20192になりました。

f:id:matsujirushix:20181116204536p:plain

プロジェクトテンプレート

Blank Applicationが増えてる!!
これはウレシイ。

f:id:matsujirushix:20181116204649p:plain

f:id:matsujirushix:20181116204730p:plain

いいねぇ♪

あと、ライブラリがちゃんとビルドできるように直ったっぽい。これは追って調査せねば。

f:id:matsujirushix:20181116204900p:plain

Azure SphereがTP4.2.1から18.11にアップデート

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

azure.microsoft.com

リリースノートから、どんな変更点があったのか?確認したいと思います。

18.11リリースノート

リリースノートはこちらです。

docs.microsoft.com

バージョン表記について、以前は4.2.1という連番でしたが、今回から年と月になりました。Windows10風。
今回、2018年11月にリリースしたので、18.11だそうです。

出だしから、驚きの内容がが。

updating the OS to the 18.11 release will involve connecting the device to a PC and manually installing the OS instead of receiving the software over the air (OTA).

18.11へのOSアップデートは、OTAではなくPCから手動でインストールするようです。

お、おぅ、、、って感じw

OTAによるOSアップデート、楽しみにしていたのですが、、、
次回からはOTAでできるようになるようなので、お楽しみに。

Update to the 18.11 release

アップデート手順です。
ここはスルーで。

New features and changes in this release

新機能や変更点です。

Target API set and Beta APIs

Visual Studioで開発するプロジェクトのプロパティに、Target API Setが追加になり、Beta APIの利用可否を設定するようになりました。

f:id:matsujirushix:20181116184727p:plain

Beta APIとは、どんなAPIなの?については、あらたに説明ページが追加されているので、そちらを見ると分かります。

docs.microsoft.com

Strict prototype checking

デフォルトで、厳密なプロトタイプチェックが有効になりました。-Wstrict-prototypesですかね。
「引数無しの関数は(void)と書いてね」だそうです。

Wi-Fi setup using Bluetooth low-energy (BLE)

スマートフォンからBluetooth LE経由で、Azure SphereWi-Fi設定するサンプルコードが用意されました。
Azure Sphereとは別に、Bluetooth LEの通信ができるデバイスが必要です。そりゃそうですね。
んー、nRF52 Development Kitがいるみたいだし、Azure Sphereに特別な機能が追加されたようには見受けられないので、スルーかな。
ちなみに、こちらに結線図があります。

github.com

Real-time clock

コイン電池でバックアップされたRTCを使えるようになりました。Beta API

Mutable storage

64Kのストレージ(内蔵Flashだよね。たぶん。)が使えるようになりました。Beta API

Private Ethernet

MT3620にプライベートな10Mbpsイーサネットワークが使えるようになりました。
SPIに接続したMicrochipのイーサネットインターフェースをC POSIX APIで使えるようになったと思われる。詳細はcoming soon。

External MCU update

外部に接続したMCUファームウェアをアップデートするサンプルコードが用意されました。

Software update improvements

OTA絡みで、ルート証明書の期限切れに対応したみたい。

Ping command

USB経由の接続で、以前はpingに応答していましたが、応答しないように変更されました。

感想

  • やってみようと思うのは、Mutable storageぐらい。
  • TP4.2.1から18.11とTP(Technical Preview?)が消えたけど、Preview扱い。PreviewとGAの判断がつかないよねこれ。

次は、SDKを確認して、OSアップデートしてみようと思います。

Azure IoT EdgeをRaspberry Piにインストール

11月にAzure IoT Edgeが1.0.4にアップデートしました。

azure.microsoft.com

7月に、Azure IoT Edgeをラズパイにインストールしましたが、、、そこから手順に変更が無いか、確認しました。

RasPi3B + Raspbian

いつものように、マイクロSDをSDFormatterでイレースしてから、Win32DiskImagerでRaspbianイメージをマイクロSDに書き込みます。
Raspbianイメージは現時点最新のLite、2018-10-09-raspbian-stretch-lite.imgにしました。

f:id:matsujirushix:20181116174253p:plain

あと、忘れずにbootにsshファイルを作っておきます。 Raspbian起動後、パソコンのTeraTermからSSH接続で操作したいので。

RasPiにマイクロSDを差して起動、念のためパッケージを最新します。

$ sudo apt update
$ sudo apt upgrade

この時点のディスク使用量はこちら。

$ df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       15003420 1138416  13222604   8% /
devtmpfs          470116       0    470116   0% /dev
tmpfs             474724       0    474724   0% /dev/shm
tmpfs             474724   12236    462488   3% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             474724       0    474724   0% /sys/fs/cgroup
/dev/mmcblk0p1     44143   22502     21642  51% /boot
tmpfs              94944       0     94944   0% /run/user/1000

IoT Edgeをインストール

手順はこちら。

docs.microsoft.com

書かれているコマンドをコピペして実行すればOKです。

コンテナーランタイムをインストール

$ curl -L https://aka.ms/moby-engine-armhf-latest -o moby_engine.deb && sudo dpkg -i ./moby_engine.deb
$ curl -L https://aka.ms/moby-cli-armhf-latest -o moby_cli.deb && sudo dpkg -i ./moby_cli.deb
$ sudo apt-get install -f

IoT Edgeセキュリティデーモンをインストール

$ curl -L https://aka.ms/libiothsm-std-linux-armhf-latest -o libiothsm-std.deb && sudo dpkg -i ./libiothsm-std.deb
$ curl -L https://aka.ms/iotedged-linux-armhf-latest -o iotedge.deb && sudo dpkg -i ./iotedge.deb
$ sudo apt-get install -f

IoT Edgeセキュリティデーモンをセットアップ

/etc/iotedge/config.yamlに、IoT Hubへ接続するためのIoT Edgeデバイス接続文字列を設定して、再起動します。

$ sudo vi /etc/iotedge/config.yaml
$ sudo systemctl restart iotedge

IoT Edgeの稼働確認

IoT Edgeセキュリティデーモンのバージョンは、1.0.4。

$ iotedge version
iotedge 1.0.4 (2835ac47fbb944ba628a5cfe812ff394768842e0)

edgeAgent、動いています。

$ sudo docker ps
CONTAINER ID        IMAGE                                      COMMAND                   CREATED             STATUS              PORTS               NAMES
347334cf656e        mcr.microsoft.com/azureiotedge-agent:1.0   "/bin/sh -c 'echo \"$…"   2 minutes ago       Up 2 minutes                            edgeAgent

edgeAgentのバージョンは、1.0.4.18259757。

$ sudo docker logs edgeAgent
[2018-11-16 09:17:17 +00:00]: Starting Edge Agent
[11/16/2018 09:17:17.886 AM] Edge Agent Main()
2018-11-16 09:17:19.134 +00:00 [INF] - Starting module management agent.
2018-11-16 09:17:20.228 +00:00 [INF] - Version - 1.0.4.18259757 (2835ac47fbb944ba628a5cfe812ff394768842e0)

この時点のディスク使用量はこちら。

$ df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       15003420 1442820  12918200  11% /
devtmpfs          470116       0    470116   0% /dev
tmpfs             474724       0    474724   0% /dev/shm
tmpfs             474724   12324    462400   3% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             474724       0    474724   0% /sys/fs/cgroup
/dev/mmcblk0p1     44143   22502     21642  51% /boot
tmpfs              94944       0     94944   0% /run/user/1000

まとめ

  • GA直後と手順は一緒。チョー簡単。
  • ディスク使用料は+298MB。(モジュールはedgeAgentのみの場合)

なお、今回はOSからまるっと入れ替えしましたが、旧バージョンからのアップグレードも可能です。
手順はこちら。

docs.microsoft.com