ファームウェアエンジニアの中林 (id:tomo-wait-for-it-yuki) です。
BLE 製品開発者の100割が使用していることで有名な nRF Connect ですが、BLE 通信のマクロ機能があることはご存知でしょうか?
本エントリでは nRF Connect のマクロ機能を使って、組込み界の Hello, World
であるLチカをやっていきます。
エントリ内ではリファレンスデバイスとして、スマートライトの Philips Hue を使用します。
実は、この nRF Connect のマクロ機能を使って Nature Remo から BLE マクロをリモート実行する機能のベータテスターを絶賛募集中です。 もしこのエントリを読んで興味を持った方は、ぜひご応募ください。
nRF Connect
BLE の SoC nRF シリーズを開発していることで有名な Nordic Semiconductor 社が提供しているツールです。 BLE デバイスのスキャナーとして使ったり、GATT 通信のデバッグに活用している方も多くいらっしゃるかと思います。
for Mobile と for Desktop があるのですが、今回紹介するのはスマートフォンアプリの for Mobile です。
最初に注意点ですが、同じ nRF Connect for Mobile でも Android 版と iPhone 版とは全く別物です (見た目から違います) 。 本エントリで紹介する BLE マクロ機能は Android 版にしか存在しないため、iPhone ユーザーの方はご注意ください。
nRF Connect で GATT 通信
さて、早速 nRF Connect の BLE マクロを使っていきましょう、と言いたいところなのですが、まず前提となる nRF Connect で GATT 通信する方法を簡単に紹介します。 BLE の GATT 通信についての解説は Web 上にもたくさんあるため、省略します。
リファレンスデバイスの Philips Hue はあらかじめ、公式アプリでセットアップを済ませておき、消灯状態にします。 nRF Connect だけで Philips Hue を点灯してみます。
操作手順
手順は簡単です。
これを nRF Connect で操作していきます。
nRF Connect での操作
公式アプリでリファレンスデバイスをセットアップした状態で、nRF Connect を起動し周囲の BLE デバイスをスキャンすると、該当デバイスが BONDED
な状態で検出されます。
アイコンがクリスマス仕様になっていますね。
メリークリスマス!
ここで、 CONNECT
ボタンを押してリファレンスデバイスと接続します。
接続が完了すると、リファレンスデバイスが搭載している GATT サービスの一覧が表示されます。
そのうち、赤枠で囲ったサービス (UUID: 932c32bd-0000-47a2-835a-a8d455b859dd
) がリファレンスデバイスを操作するためのサービスになっているので、タップします。
すると、サービスが持つキャラクタリスティクスが表示されます。
上から2つ目のキャラクタリスティック (UUID: 932c32bd-0002-47a2-835a-a8d455b859dd
) がリファレンスデバイスを点灯 / 消灯するためのキャラクタリスティックとなっています。
キャラクタリスティックに書き込むときは上矢印のアイコンをタップします (補足: 読み込みは下矢印1つのアイコン、通知の有効化は下矢印3つのアイコンを、それぞれタップします) 。
該当のキャラクタリスティックに1バイトだけ書き込みたい場合は、BYTE
を選択します。
書き込みたいデータ 0x01
を入力して、SEND
ボタンをタップすると、キャラクタリスティックへの書き込みが実行されます。
無事リファレンスデバイスが点灯しました。
nRF Connect のマクロ
それでは、本題のマクロ機能です。 対象機器に接続したあとのサービスやキャラクタリスティクスが表示されている画面の右下に、マクロの記録やマクロの実行を開始するためのメニューボタンがあります。
赤い○ボタンをタップすれば、マクロの記録がはじまります。 上でリファレンスデバイスを点灯したように、キャラクタリスティックにデータを書き込んだり、データを読み込んだりして、目的の操作を実行します。 目的の操作を終えたら、■ ボタンで終了し、名前とアイコンを選んで保存します (なぜかアイコンにピカチュウがあります) 。
保存したマクロは ▶ ボタンで実行できます。
マクロををタップすると、どのようなオペレーションが記録されているか詳細を見ることができ、マクロのステップ実行も可能です。
実行時に失敗したオペレーションには !
マークがつきます。
れっつ L チカ!
では、マクロ機能を使って、リファレンスデバイスを点滅させてみましょう。 マクロの記録を開始して、次のマクロを作ります。
スリープは砂時計アイコンから、スリープする期間を選ぶことで挿入できます。
マクロを保存したら、マクロ詳細を開いて、リピート実行ボタンをタップした上で、マクロを実行します。
すると本エントリ冒頭の gif のように無事チカチカします。
マクロのインポートとエクスポート
保存したマクロは XML 形式でエクスポートすることができます。 また、XML 形式のマクロをインポートすることもできます。
先ほど作った L チカのマクロは XML 形式だと下記の内容になります。
最初に、使用するサービスやキャラクタリクスがターゲットデバイスに存在するかどうかチェックする assert-service
が自動的に挿入されます。
それ以外は素直にサービスとキャラクタリスティックを指定して、データを書き込む内容ですね。
<macro name="blink" icon="PLAY"> <assert-service description="Ensure 932c32bd-0000-47a2-835a-a8d455b859dd service" uuid="932c32bd-0000-47a2-835a-a8d455b859dd"> <assert-characteristic description="Ensure 932c32bd-0002-47a2-835a-a8d455b859dd characteristic" uuid="932c32bd-0002-47a2-835a-a8d455b859dd"> <property name="WRITE" requirement="MANDATORY"/> </assert-characteristic> </assert-service> <write description="Write 0x01 to 932c32bd-0002-47a2-835a-a8d455b859dd" characteristic-uuid="932c32bd-0002-47a2-835a-a8d455b859dd" service-uuid="932c32bd-0000-47a2-835a-a8d455b859dd" value="01" type="WRITE_REQUEST"/> <sleep description="Sleep 500 ms" timeout="500"/> <write description="Write 0x00 to 932c32bd-0002-47a2-835a-a8d455b859dd" characteristic-uuid="932c32bd-0002-47a2-835a-a8d455b859dd" service-uuid="932c32bd-0000-47a2-835a-a8d455b859dd" value="00" type="WRITE_REQUEST"/> <sleep description="Sleep 500 ms" timeout="500"/> </macro>
マクロの構文
マクロの構文は下記リポジトリで公開されています。 このリポジトリではさらに adb からマクロを実行して自動テストする方法も紹介されています。 自動テストはまだ試したことがありませんが、こちらも便利そうですね。
Nature Remo BLE マクロベータテスター募集中です
このようなマクロ機能を遠隔地から実行できると素敵だと思いませんか? 実は Nature Remo の新機能として、開発を進めており、現在ベータテスターを募集中です。
募集要項はこちらです。
応募はこちらのフォームからどうぞ!