12/8(金)に Arm Mbed Connect 2017 のワークショップに参加してきました。
このワークショップでは Mbed 対応の開発ボードで実際にコーディングしたり、 Mbed Cloud でのデバイス管理などを体験できるハンズオン型のワークショップで、下記のような内容でした。
- Mbed ビルドツールのインストール
- Mbed OS - 自分のアプリケーションをビルドする
- Mbed Cloud Client - Mbed Cloud アプリケーションをビルドする
- Mbed Cloud Client - 新しい LWM2M オブジェクトを追加する
- Mbed Cloud Client - 書き込み可能な LWM2M オブジェクトを追加する
- Mbed Cloud Client - Wi-Fi アップデート
- Cloud SDK – 値を取得するシンプルなwebアプリ
- デバッガの使用
Mbed OS アプリのビルドは Mbed CLI を使ったものでしたが、それについては以前も書いていますので、今回は Mbed Cloud でのデバイス管理の部分について、どのような感じで管理・アップデートが行えるのかを紹介してみたいと思います。
使用デバイス
今回使用したデバイスはワークショップ用に用意された開発ボードで、ワークショップ後はそのままいただくことができました。無料ワークショップなのになんとも太っ腹です。
機能としては下記のようなものが載っています。
Wi-Fi
センサー(温度、湿度、照度、加速度、大気クオリティ、距離)
RGB LED とステータス表示用の LED
LCD ディスプレイ
スイッチ
ワークショップ中に使ったセンサーは温度センサーだけでしたが、それ以外にも色々なセンサーが載っているので遊べそうです。OS は Mbed OS 5 です。
Mbed Cloud とは
Mbed Cloud は IoT デバイスを管理するためのクラウドプラットフォームで、Mbed OS 5 と連携することで個別の IoT デバイスを管理することができます。
現在 Mbed Cloud はパートナーしか利用することができませんが、今回のワークショップでは参加者に期間限定のアカウントが提供され、それを使ってアクセスしました。
ログインするとダッシュボードが表示されます。
Mbed Cloud へのデバイス登録
Mbed Cloud にデバイスを接続するには Mbed Cloud で生成した証明書を使用する必要があります。Mbed Cloud の Device identity メニューの Actions から Create a developer certificate
を選択し、ダイアログに従って情報を登録して行くと証明書が作成されます。
作成された証明書を一覧から選択してローカルにダウンロードし、アプリケーションのルートディレクトリに配置します。
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 に対象のデバイスが表示されます。
デバイス情報の確認
登録されたデバイスの情報を確認するには、デバイスの一覧から対象のデバイスの Device ID をクリックします。表示された詳細画面から Live resources タブをクリックすると、 LWM2M の各リソースの情報が確認できます。表示されるリソースの項目や内容は各デバイスでの実装に依存します。
また、更新が可能なリソースはこの画面から値を更新することも可能です。各リソースが更新可能かどうかはデバイス側での実装に依存します。
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 キーの内容は生成時しか見ることはできないため、ここでコピーして保存しておきます。
次に 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 のコンソールからキャンペーンの設定を行いますが、アップデートの配布対象デバイスを指定するためにはデバイスフィルタを作成しておく必要がありますので、下記メニューから作成しておきます。(詳細は割愛)
デバイスフィルタを作成したら Firmware update のメニューからキャンペーンを作成します。
次に表示されるフォームで、先ほど manifest-tool update
でアップロードされたマニフェストと、配布対象デバイスの条件として事前に作成したデバイスフィルタを選択し、任意のキャンペーン名を入力して Save します。
するとキャンペーンが作成され、内容が表示されます。
この状態ではまだキャンペーンは開始されていませんので、 Start
をクリックするとキャンペーンが開始し、アップデートがスタートします。
これでデバイス側が正しくネットワークに接続して稼働していれば、アップデートが行われます。例えばワークショップ時のサンプルコードではシリアル出力で様子を確認していると下記のようにアップデートが行われたことがわかりました。
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 タブから確認できます。
まとめ
デバイスを LWM2M で管理するという点では SORACOM Inventory と同じようなイメージを持ちました。Firmware のアップデートについては LWM2M でもできそうな感じではありますが、プラットフォームでサポートしていて複数端末へのアップデートの配布や状況の確認等もコンソールからの設定で行えるのは便利そうに思いました。Mbed Cloud はまだ誰でも利用できるわけではありませんが、どんな感じでデバイス管理を行えるかのイメージが掴めたのは良かったです。