Arm Mbed Cloud によるデバイス管理&リモートアップデート

 12/8(金)に Arm Mbed Connect 2017 のワークショップに参加してきました。

armkk-event.com

 このワークショップでは Mbed 対応の開発ボードで実際にコーディングしたり、 Mbed Cloud でのデバイス管理などを体験できるハンズオン型のワークショップで、下記のような内容でした。

  1. Mbed ビルドツールのインストール
  2. Mbed OS - 自分のアプリケーションをビルドする
  3. Mbed Cloud Client - Mbed Cloud アプリケーションをビルドする
  4. Mbed Cloud Client - 新しい LWM2M オブジェクトを追加する
  5. Mbed Cloud Client - 書き込み可能な LWM2M オブジェクトを追加する
  6. Mbed Cloud Client - Wi-Fi アップデート
  7. Cloud SDK – 値を取得するシンプルなwebアプリ
  8. デバッガの使用

 Mbed OS アプリのビルドは Mbed CLI を使ったものでしたが、それについては以前も書いていますので、今回は Mbed Cloud でのデバイス管理の部分について、どのような感じで管理・アップデートが行えるのかを紹介してみたいと思います。

使用デバイス

 今回使用したデバイスはワークショップ用に用意された開発ボードで、ワークショップ後はそのままいただくことができました。無料ワークショップなのになんとも太っ腹です。

f:id:akanuma-hiroaki:20171212081717j:plain:w450 f:id:akanuma-hiroaki:20171212081735j:plain:w450

 機能としては下記のようなものが載っています。

  • Wi-Fi

  • センサー(温度、湿度、照度、加速度、大気クオリティ、距離)

  • RGB LED とステータス表示用の LED

  • LCD ディスプレイ

  • スイッチ

 ワークショップ中に使ったセンサーは温度センサーだけでしたが、それ以外にも色々なセンサーが載っているので遊べそうです。OS は Mbed OS 5 です。

Mbed Cloud とは

 Mbed Cloud は IoT デバイスを管理するためのクラウドプラットフォームで、Mbed OS 5 と連携することで個別の IoT デバイスを管理することができます。

cloud.mbed.com

 現在 Mbed Cloud はパートナーしか利用することができませんが、今回のワークショップでは参加者に期間限定のアカウントが提供され、それを使ってアクセスしました。

f:id:akanuma-hiroaki:20171212084353p:plain:w450

 ログインするとダッシュボードが表示されます。

f:id:akanuma-hiroaki:20171212085241p:plain:w450

Mbed Cloud へのデバイス登録

 Mbed Cloud にデバイスを接続するには Mbed Cloud で生成した証明書を使用する必要があります。Mbed Cloud の Device identity メニューの Actions から Create a developer certificate を選択し、ダイアログに従って情報を登録して行くと証明書が作成されます。

f:id:akanuma-hiroaki:20171212090007p:plain:w450

 作成された証明書を一覧から選択してローカルにダウンロードし、アプリケーションのルートディレクトリに配置します。

 Mbed Cloud では LWM2M を使ってデバイスの管理が行われますので、デバイスの登録も LWM2M のクライアントを使います。今回のワークショップでは登録用のサンプルコードが提供されていたので、自分で書く必要はありませんでしたが、アプリ側の登録用コードの抜粋は下記のようになります。

client = new SimpleM2MClient(network, &sd, &fs);
int init_rt = client->init();
client->call_register();

 そして下記のようにビルドして、生成されたバイナリ combined.bin をボードにコピーして書き込みます。

$ mbed compile -t GCC_ARM -m UBLOX_EVK_ODIN_W2
〜〜〜中略〜〜〜
Combined binary: /Users/akanuma/Documents/mbed_connect_ws/mac-workshop-content/mbed-connect-cloud-application/BUILD/UBLOX_EVK_ODIN_W2/GCC_ARM/combined.bin
〜〜〜中略〜〜〜
Image: ./BUILD/UBLOX_EVK_ODIN_W2/GCC_ARM/mbed-connect-cloud-application.bin

 正しく登録されると、 Mbed Cloud の Device directory に対象のデバイスが表示されます。

f:id:akanuma-hiroaki:20171214233425p:plain:w450

デバイス情報の確認

 登録されたデバイスの情報を確認するには、デバイスの一覧から対象のデバイスの Device ID をクリックします。表示された詳細画面から Live resources タブをクリックすると、 LWM2M の各リソースの情報が確認できます。表示されるリソースの項目や内容は各デバイスでの実装に依存します。

f:id:akanuma-hiroaki:20171214233141p:plain:w450

 また、更新が可能なリソースはこの画面から値を更新することも可能です。各リソースが更新可能かどうかはデバイス側での実装に依存します。

f:id:akanuma-hiroaki:20171214233654p:plain:w450

Wi-Fi アップデートの準備

 IoT デバイスでは Web アプリケーションやスマートフォンアプリケーションと違って、デバイス自体を遠隔地において来てしまうので簡単にファームウェアのアップデートのフラッシュを行うことができません。そこで IoT プラットフォームによる、デバイスのファームウェアのリモートアップデート機能が重要になってきます。 Mbed Cloud でもこの機能を持っており、 Wi-Fi に接続した上でソフトウェアをリモートでアップデートできます。

 Mbed Cloud のリモートアップデートでは manifest-tool を使いますが、そのために API キーが必要になりますので、Mbed Cloud のコンソールから API キーを生成します。 Access management メニューの API keys の画面から Create new API key をクリックして表示されるダイアログに従うと API キーが生成されて表示されます。API キーの内容は生成時しか見ることはできないため、ここでコピーして保存しておきます。

f:id:akanuma-hiroaki:20171214082141p:plain:w450

 次に manifest-tool がインストールされていない場合はインストールします。ワークショップ時はインストール用のファイルが配布されたので pip でローカルファイルを使ってインストールしましたが、通常はこちらのチュートリアルの手順に従ってインストールすることになるかと思います。

https://cloud.mbed.com/docs/v1.2/updating-firmware/tutorial-installing-the-manifest-tool.html

 ただ、このチュートリアルの手順だと manifest-tool のリポジトリが見つからないということでエラーになってしまうため、実際に使う場合は確認が必要です。

$ pip install -U "git+https://github.com/ARMmbed/manifest-tool-restricted.git"
Collecting git+https://github.com/ARMmbed/manifest-tool-restricted.git
  Cloning https://github.com/ARMmbed/manifest-tool-restricted.git to /private/var/folders/l1/5gdn8snd6gj_nfyh5j4nc1sw0000gn/T/pip-rx_uWM-build
remote: Repository not found.
fatal: repository 'https://github.com/ARMmbed/manifest-tool-restricted.git/' not found
Command "git clone -q https://github.com/ARMmbed/manifest-tool-restricted.git /private/var/folders/l1/5gdn8snd6gj_nfyh5j4nc1sw0000gn/T/pip-rx_uWM-build" failed with error code 128 in None

 ここではひとまず manifest-tool がインストールできたことにして、次にアプリケーションのルートディレクトリで manifest-tool を設定します。コマンドのシグネチャは $ manifest-tool init -d "<company domain name>" -m "<product model ID>" -a "<api key>" -q --force という感じなので例えば、

$ manifest-tool init -d "example.com" -m "update_test" -a "ak_1MDE2MDBmYWM0YjBjXXXXXXXXXXXXXXXXXXXX" -q --force

 という感じになります。これで公開鍵/秘密鍵のペアが作成されて公開鍵はデバイスに組み込まれるようになりますので、秘密鍵はプログラムの更新時に署名するために保持しておきます。 manifest-tool init による設定が終わったら再度ビルドして combined.bin をボードに書き込んでおきます。

Wi-Fi アップデートの実施

 ここまででリモートアップデートの準備ができましたので、実際にリモートアップデートを実施してみます。まずアプリケーションのソースに何らかの変更を加えたらこれまで同様にビルドしておきます。ただ今回使用するバイナリは combined.bin ではなく、ブートローダを含まない bin になりますので、今回の例であれば mbed-connect-cloud-application.bin になります。

$ mbed compile -t GCC_ARM -m UBLOX_EVK_ODIN_W2
〜〜〜中略〜〜〜
Image: ./BUILD/UBLOX_EVK_ODIN_W2/GCC_ARM/mbed-connect-cloud-application.bin

 ビルドしたら manifest-tool prepare コマンドを実行して、マニフェストファイルの生成と、バイナリとマニフェストファイルのアップロードを行います。

$ manifest-tool update prepare -p ./BUILD/UBLOX_EVK_ODIN_W2/GCC_ARM/mbed-connect-cloud-application.bin -o myUpdate

 これで Mbed Cloud にマニエストファイルとアップデート用のバイナリファイルがアップロードされましたので、 Mbed Cloud のコンソールからキャンペーンの設定を行いますが、アップデートの配布対象デバイスを指定するためにはデバイスフィルタを作成しておく必要がありますので、下記メニューから作成しておきます。(詳細は割愛)

f:id:akanuma-hiroaki:20171214085533p:plain:w450

 デバイスフィルタを作成したら Firmware update のメニューからキャンペーンを作成します。

f:id:akanuma-hiroaki:20171214085920p:plain:w450

 次に表示されるフォームで、先ほど manifest-tool update でアップロードされたマニフェストと、配布対象デバイスの条件として事前に作成したデバイスフィルタを選択し、任意のキャンペーン名を入力して Save します。

f:id:akanuma-hiroaki:20171214234407p:plain:w450

 するとキャンペーンが作成され、内容が表示されます。

f:id:akanuma-hiroaki:20171214234634p:plain:w450

 この状態ではまだキャンペーンは開始されていませんので、 Start をクリックするとキャンペーンが開始し、アップデートがスタートします。

f:id:akanuma-hiroaki:20171214235922p:plain:w450

 これでデバイス側が正しくネットワークに接続して稼働していれば、アップデートが行われます。例えばワークショップ時のサンプルコードではシリアル出力で様子を確認していると下記のようにアップデートが行われたことがわかりました。

Firmware download requested
Authorization granted
Downloading firmware...
Downloading: [-                                                 ] 0 %Temperature: 23.74C!!!!
Downloading: [+/                                                ] 2 %Temperature: 23.74C!!!!
Downloading: [++-                                               ] 4 %Temperature: 23.77C!!!!
Downloading: [+++-                                              ] 6 %Temperature: 23.77C!!!!
〜〜〜中略〜〜〜
Downloading: [++++++++++++++++++++++++++++++++++++++++++++++-   ] 92 %Temperature: 23.77C!!!!
Downloading: [+++++++++++++++++++++++++++++++++++++++++++++++-  ] 95 %Temperature: 23.77C!!!!
Downloading: [++++++++++++++++++++++++++++++++++++++++++++++++\ ] 97 %Temperature: 23.78C!!!!
Downloading: [++++++++++++++++++++++++++++++++++++++++++++++++++] 100 %
Download completed
Firmware install requested
Authorization granted
Booting up...
             Bootloader starting, formatting? 0
                                               [BOOT] mbed Bootloader
[BOOT] ARM: 0000000000000000000000000000000000000000
[BOOT] OEM: 0000000000000000000000000000000000000000
[BOOT] Layout: 0 801A75C
[BOOT] Active firmware integrity check:
[BOOT] [++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++]
[BOOT] SHA256: 0950D54B7D7CB0957BB3AF342E390D5BEBDF3847E88E291B76F8XXXXXXXXXXXX
[BOOT] Version: 1513261526
[BOOT] Slot 0 firmware integrity check:
[BOOT] [++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++]
[BOOT] SHA256: 0C596036D5DD603389852A9D7BD18C4BE5743FDCCFC30BD465F3XXXXXXXXXXXX
[BOOT] Version: 1513262444
[BOOT] Slot 1 is empty
[BOOT] Update active firmware using slot 0:
[BOOT] [++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++]
[BOOT] Verify new active firmware:
[BOOT] [++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++]
[BOOT] New active firmware is valid
[BOOT] Application's start address: 0x8020400
[BOOT] Application's jump address: 0x805FB05
[BOOT] Application's stack address: 0x20030000
[BOOT] Forwarding to application...

 キャンペーンの進捗状況はキャンペーン一覧の Active タブから確認できます。

f:id:akanuma-hiroaki:20171214235658p:plain:w450

f:id:akanuma-hiroaki:20171214235533p:plain:w450

まとめ

 デバイスを LWM2M で管理するという点では SORACOM Inventory と同じようなイメージを持ちました。Firmware のアップデートについては LWM2M でもできそうな感じではありますが、プラットフォームでサポートしていて複数端末へのアップデートの配布や状況の確認等もコンソールからの設定で行えるのは便利そうに思いました。Mbed Cloud はまだ誰でも利用できるわけではありませんが、どんな感じでデバイス管理を行えるかのイメージが掴めたのは良かったです。