nRF Sniffer v3を使ってみた
先日、Bluefruit LE SnifferのFWをnRF Sniffer v2からnRF Sniffer v3にアップデートしました。
簡単に使ってみたところ、以下のことがわかりました。
- Bluetooth5のパケットに対応している
- BLE Meshのパケットに対応している
- Bluefruit LE Snifferでは最新スマホの通信を追えない
- 最新スマホは2M PHYに対応しているため
- スニファを購入するときは、同対応の確認をお勧めします
総じて言えるのは、アップデートして良かったってことです!
特に最後の「Bluefruit LE Snifferでは最新スマホの通信を追えない」は、1年以上原因がわからず、ようやくの解決となりました。感謝感激です。
以下、簡単に説明を加えようと思うのですが、先に登場人物の紹介を。
左にある基盤剥き出しなのが、今回の主役、Bluefruit LE Snifferです。パソコンに指すと、そこらへんに飛びかうBLEのパケットを盗聴して、その中身をパソコンに報せてくれます。
右にあるUSBメモリみたいなのが、Laird社のBL654です。これでもれっきとしたBLEの開発ツールで、Bluetooth5に対応しています。事前にBLE Meshの機能を入れておいたので、今回はBluetooth5 & BLE Meshデバイスとして動きます。
その他、写真を撮影しているのがiPhone8で、BL654の通信相手になります。
Bluetooth5のパケットに対応している
nRF Sniffer v3ではBluetooth5のパケットを確認できるようです。
全部は確認していませんが、ある程度はカバーしていそうな雰囲気です。
例として、Bluetooth5の新機能「 2M PHY 」で確認します。
そもそも2M PHYとは何かを説明すると・・・
Bluetooth4時代は、BLEの通信帯域は1Mbps固定でした。
Wi-Fiに比べると、とてつもなく低い帯域幅です。
もともとBLEは低消費電力が売りですから、1Mbpsで十分でした。
しかし時代の流れがあったんでしょうね。
Bluetooth5では、電波の強度を半分にする代わり、通信帯域を2倍にするモードが追加されました。
これが2M PHYです。
BLEはデフォルトでは1Mbpsで動くのですが、マスタとスレーブの合意が取れれば、2Mbpsで動くようになります。
Bluetoothの仕様書によると、2M PHYの交渉の流れは以下のようになります。
同一の流れをBluefruit LE Snifferで確認してみます。
マスタをiPhone8、スレーブをLaird社のBL654にします。
コネクションを張った直後の通信パケットは以下のようになりました。
ちょうど選択しているパケット(青色)から、2M PHYの交渉がスタートします。 パケットを時間方向に進んでいくと、
- LL_PHY_REQ
- (Empty PDU)
- LL_PHY_RSP
- LL_PHY_UPDATE_IND
のように、仕様書の流れと一致していることがわかります。
ちなみにPHYの列を見ると、現在は 1M PHY で通信していることがわかります。
交渉が成立すると「LE 1M」 -> 「LE 2M」になると推測できますが、Bluefruit LE Snifferが2M PHYに未対応のため、ここで通信が途切れました。そこらへんの話は後述します。
ついでに、LL_PHY_REQのパケットの中身を確認してみます。
これはiPhone8からBL654へのリクエストです。
要約すると、
「送信には2M PHYを使いたいんや」
「受信にも2M PHYを使いたいんや」
てことを言ってます。
BLE Meshのパケットに対応している
nRF Sniffer v3は、BLE Meshのパケットも解釈してくれます。
とはいっても、ネットワークレイヤまでの話なんですけどね。一応アプリケーションレイヤも見れるのですが、電文は暗号化されているので、中身を解読することはできません。
Nordic社の質問フォーラムを見る限り、現在開発中のようですが・・・ なかなか難しいのかも。
BLE Meshって、暗号化に凄い力を入れていますからね。
メッシュという構造上、ハッカーにさらされやすいので。
それでは、パケットの一例を紹介します。
まずはUnprovisioned Device Beaconから。Bluetooth Meshデバイス(の候補)が、まだMeshネットワークに入っていないことを報せるパケットです。
Bluetooth Meshの仕様書では、以下のように構造を定義しています。
Bluefruit LE SnifferでBL654のパケットを確認します。
パケットのうち、Bluetooth Mesh Beacon部を確認します。
中身に、
- Type
- Device UUID
- OOB :0x0000 = 外部入出力の仕組みなし
が含まれていることがわかります。URI Hashはないですが、これはオプションです。
この状態ではアプリケーションデータが何もないため、暗号化は関係ありません。
続いて、アプリケーションデータを含むパケットの話に進みたいのですが・・・、
専用スマホアプリ(nRF Mesh)の見た目が全然違うんですけど!?
1年前はこんなアプリじゃなかったよな、お前?
全く使い方がわからないw
これは時間がかかりそうなので、また今度にします!!
Bluefruit LE Snifferでは最新スマホの通信を追えない
一年以上謎だった現象です。
iPhone8の通信を追跡しようとすると、最初はうまくいくのですが、途中からばったり通信パケットが見えなくなるのです。
ついに解決することができました!
上で述べたように、iPhone8は、コネクション確立後に2M PHYで通信しようと試みます。
一方でBluefruit LE Snifferの2M PHY対応はというと、搭載しているnRF51822次第になります。
Noridic社のnRF51822のページを覗いてみると・・・
案の定「2M & Coded PHYに対応していません」の記述を発見!
・・・そりゃあ、通信を追えない訳だ。
電気的な特性が違うのだから、意味を解釈できるわけがない。
わかってしまえば当然なんだけどさ。
そんなの簡単に気づくわけないでしょw
メーカ側も多少の親切心を出してくれるとありがたんだけどなー。
ということで、
スニファを買うときは、2M & Coded PHYへの対応を確認しましょう!
同じAdafruit社であれば、Bluefruit nRF52 Featherなら大丈夫かも。
以上、nRF Sniffer v3を使ってみた感想でした!