前回、前々回とBBC micro:bit上で実行可能なBluetoothサービスをスマホから使ってみました。今回からは「垂れ流し」「一方通行」のアドバタイズ・パケットに戻ってBLEのローレベルな動作を観察したいと思います。「ブロックを積み」はするのですが、ブロック1個おけばとりあえずOKっと。最近そればかり。
※「ブロックを積みながら」投稿順 index はこちら
BLE(Bluetooth Low Energy)素人の私が書くのもなんですが、BLEの場合、デバイス同士がコネクトして双方向通信を始める前段階に、アドバタイズということを行います。
- コネクトして欲しい末端側(ペリフェラル)のデバイスが「私はここにいるよ」とアドバタイズする
- すると、スマホなどセントラルなデバイスが発見し、コネクトするためのシーケンスを行って「握る」。以降はデバイス間で双方向で通信できる。
アドバタイズは、上記のようにコネクションを確立する第一段階でもあるのですが、アドバタイズだけでもアプリとして成り立ちます。ブロードキャスト(放送)的に皆さんに何か情報をお届けするなど。また、近くに居るの、居ないのといった位置を調べるためのビーコンとしてもアドバタイズ・パケットが使われます。(マクドナルドでBLEビーコンがテーブルロケータとして使われていた件はこちら)
さて、BBC micro:bit に対して MakeCode エディタでビーコン的な「アドバタイズ・パケットを発信できる」ブロックは2種類あります。前回まで使っていたservice起動のブロックを置いてもアドバタイズパケットを発信しますが、そちらはサービスにコネクトしてもらうためのアドバタイズパケットなので今回は除きます。使用するブロックは、
bluetooth advertise UID
という名の付けられたブロックです。MakeCodeエディタのHelpから、ブロックの詳細を調べると、英Lancaster大の以下のドキュメントを見よ、という感じです。BBC micro:bitへの実装をこの大学が担ったのですかね。
実装されているのはEddystoneというプロトコル?だそうです(一方通行だけれども。)Eddystoneには4通りのフレーム定義が存在し、MakeCode上にブロックが実装されているのはその内2つだけのようです。今回はその中の一つ、UIDというものをアドバタイズするブロックを使ってみます。BLEにはUUID(ユニバーサル固有識別子)というものがあり、一瞬混乱するのですが、ここでのUIDというのは異なる概念です。(ただしUUIDの一部のフィールドを切り取ってあてはめたりする場合があるようなのでまったく無関係というわけでもないです。)どこかの「場所」にUIDというものが割り当てられていて、その場所に近いか、遠いか調べるようなイメージみたいです。
さらにいうと、このEddystoneというBeacon向けのプロトコルの開発元はGoogle社だそうです。どうも AppleのiBeacon対抗?みたいです。プロトコルのフォーマットを見てみると似ているけれども異なります。Appleの方は会社毎に勝手実装できるタイプとして定義しているけれど、Eddystoneの方はBLEのADtypeとして「標準化」されているみたいです。やる気はありそう。そちらのGoogleの開発サイトは以下に。
このドキュメントをちゃんと読めば良いのですが、私は日本語の文献で「とても分かり易い」ものを別に見つけてしまいました。以下です。
ルネサス・エレクトロニクス RL78/G1D Bluetoothのビーコンへの応用
上記の文献(アプリケーションノート)にはちゃんと Eddystone についての解説も含まれており、最初にこれ読んでから始めればよかったなあ、と後になって思いましたです。
BBC micro:bit側の設定
BBC micro:bit をMakeCodeでプログラムして、アドバタイズパケットを送信しつづけれるようにいたしました。といって、ブロックを ”on start“ に1個置くだけです。アイキャッチ画像にブロック置いたところを掲げました。動作確認用のブロックを除けば本質は bluetooth advertise UIDブロック1個です。1回呼べば後は勝手にアドバタイズを繰り返してくれます。以下のフィールドがあります
- namespace
- instance
- with power
- connectable
nanespaceとinstanceには以下の例えが分かり易いと思いました。
- namespace = 博物館(あるいは建物)のお名前
- instance = 展示品1点1点固有の番号
この2つを合わせて「どこそこ」の「これ」を示すUIDとなります。アイキャッチ画像では何やら桁の大きな整数が記入されていますが、元は16進数で「分かり易そうな」数字の列を入力しただけです。MakeCodeが勝手に10進変換してくれてよく分からなくなりました。ただし、namespace部分にはいろいろ制約があることが分かったので、ちゃんと使うときにはズボラな設定は良くないでしょう。
with powerは送信電力、connectableはアドバタイズ後、コネクション可能か否か(ビーコンであればコネクション不可で良いでしょう。)どちらもデフォルト値のままです。
スキャナ側の設定
アドバタイズ・パケットを見つける側(スキャナ)は、スマホといたしました。それが一番実際の応用にも近いので。今回、使わせていただきましたのは、Android用の以下のアプリ3点であります。以下にアプリのアイコンを並べました。左のアイコンから順に
- BLUEPIXEL TECHNOLOGIES社 BLE Scanner
- NORDIC SEMICONDUCTOR社 nRF Connect for Mobile
- PunchThrough社 LightBlue
さて、BBC micro:bit が垂れ流すアドバタイズ・パケットを LightBlue で観察すると以下のような感じです。パケットは捕捉できているし、HEX文字列のペイロードを観察し、Eddystoneのプロトコルで解釈していけば、ちゃんと中身を解読することが可能です。でも後の2つの方が解読が楽かも。
続いて、BLE Scanner で観察したところ。こちらは、EddyStoneのUIDのアドバタイズ・パケットであることが認識されており、ちゃんとnamespceとInstanceまで抽出してくれています。また、推定距離 10cm(実際そんな距離でした)という表示も出してくれてます。
また、距離に関しては以下のようなファンシーな「マップ」を表示してくれるので、多数のデバイスがあるときには便利かも。
最後は、NORDIC SEMICONDUCTOR社のRF Connect for Mobileです。ご存知のとおり、BBC micro:bit のマイコンというかRFチップはNORDIC社製です。流石にプロ仕様?それでいて無料。SCAN画面でも十分な情報が表示されています。
しかし、さらに MORE などへ進むと、アドバタイズの間隔とRSSIの変化のグラフなど、エンジニアリングユース向きな機能がバッチリであります。私的にはこれが推し(個人の感想です。)ちょっと画面が地味だけれども。
ぶっちゃけ、小箱の中に micro:bit と電池ボックスを入れたものを展示品の下などにひっそり隠せば、展示品に近づくとその説明がスマホに表示されるようなアプリは簡単かも。当然やっているのだろうけれど。お手製Beaconアプリ、後で作ってみますかね。