IoT何をいまさら(84) Eddystoneパケット、Wiresharkで表示フィルタ

Joseph Halfmoon

別シリーズで micro:bit を使って EddystoneプロトコルのBLE Beasonを「動かして」みています。ビーコンからの電波を受けるツールとしてはスマホアプリを使用。しかし開発用としてはPC上のWiresharkの方がいいかも。キャプチャされる大量のBLEパケットに溺れてしまわないように、今回はWiresharkのBLE関係表示フィルタについて調べてみました。

PC上でWiresharkでBLE(Bluetooth Low Energy)のパケットをキャプチャするのに使ったのは、アイキャッチ画像に掲げましたAdafruit社の”Bluefruit LE sniffer” USBドングルです。USBに接続すれば NORDIC SEMICONDUCTOR社の nRF Snifferとして認識されております。以前も一度これを使った件投稿しておりますが、BLEパケットの表示フィルタリングについては書いてなかったので今回ざっと整理しておきたいと思います。

ドングルを接続し、Wiresharkを起動して、nRF Snifferとして認識されているポートに接続すれば以下の画面の様なキャプチャの画面が得られます(以下はキャプチャ停止中、キャプチャ中だと赤い四角のキャプチャ停止ボタンがアクティブになる。)以下画面では既に表示フィルタを掛けていますが、フィルタしないと大量のBLEパケットが列挙されすぎるかもしれません。思った以上身の回りにはBLEつかっている小物が多く、予想以上のパケットが飛んでいるからです。

wireshark BLE ADV packet capture

普段からWiresharkお使いの方はご存知と思いますが、Wiresharkのフィルタには2種類あります。キャプチャ時点でフィルタするものとGUI表示するときにフィルタするものです。キャプチャ時点で落としてしまうと、データ取得後、実は見たかったと思っても後の祭りです。通信の経緯を追いかけたいのであれば、キャプチャ時点では制限をかけず、表示でフィルタする方が安全だと思います。

スニッフィングツール上でのWiresharkの使い方は ツールの発売元の以下のページにも書かれています。しかし、以下はコネクトしたデバイス間でのやり取りの解析例が中心で、表示フィルタについてはあまり情報ありません。

Adafruit社 Working with Wireshark

ドングルに搭載されている BLE 通信チップのメーカである、Nordic社の以下のページの方が表示フィルタの情報があります。

NORDIC SEMICONDUCTOR社 nRF Sniffer usage, Inspecting captured data

上記にしても、それほど多くの情報が掲載されているわけでもないです。結局、以下のWiresharkの表示フィルタのリファレンスを眺めながら記述することになると思います。

Wireshark Display Filter Reference

BLEだけでなく、ありとあらゆるプロトコルを網羅している感のあるWiresharkのリファレンスには膨大な情報があり過ぎてどこに必要な情報があるのか探すのに困ります。実際、今回ターゲットにしている Eddystone については、まず膨大な項目の中から数十項目ほどのBluetooth関係のリファレンスをみつけ、さらにその中のBLE関係項目のそのまた下のレイヤ(数十から数百項目あり)の中をさがさないといけません。それに1箇所にまとまっているわけではないので、文書の中をアチコチ飛び回らないと所望の情報が見つからなかったりします。以下は関係文書を見回った結果のメモのようなものであります。

なお、解析対象のパケットとフィールドが分かっていれば、それを表示し、以下の画面のように「フィルタとして適用」していけば、リファレンスマニュアルを這いずり回らなくても必要なフィルタリングは可能です。

wiresharkBLEfilt01
複数のフィルタを論理演算子で接続すれば複雑なフィルタリングが可能ですが、以下では単純なフィルタのみとりあげています。

Bluetoothデバイスアドレス、アドバタイズパケット・ヘッダでフィルタ

まずはBluetoothデバイスアドレスや、アドバタイズパケットのヘッダなどリンク層レベルでフィルタする場合に参照すべきリファレンスは以下です。

Bluetooth Low Energy Link Layer

6バイトのBluetoothデバイスアドレスを指定すれば、特定のデバイスのパケットだけを抽出できます。

btle.advertising_address == f5:d1:5f:xx:xx:xx

またアドバタイズパケットのヘッダの値でフィルタするならば以下も使えます。

btle.advertising_header == 0x2342
EddystoneのAdTypeでフィルタ

アドバタイズパケットのデータ部分にはAdStructureとよばれる繰り返し構造が含まれます。Eddystoneの場合、その中には16-bit Service UUID(16bit UUID data typeと同じ値)0xFEAA(Google)や、Adtypeと呼ばれる0x16という定数が含まれます。これらの値はBluetoothのCore Specification Supplement(CSS)中で定義されているためか、以下のリファレンスの中で定義されています。

Bluetooth Common

Eddystoneを示す16ビットのUUIDで抽出すれば、Eddystoneのパケットのみを取り出せます。

btcommon.eir_ad.entry.uuid_16 == 0xfeaa

AdTypeを0x16として抽出しても同様な効果が得られると思います。

btcommon.eir_ad.entry.type == 0x16
無線そのものの情報取得

無線通信(物理層に関わる)そのものの情報は以下のリファレンスを参照すべきかとも思いますが、

Bluetooth Low Endergy RF Info

このノルディック社のモジュールを使ったスニッファには以下の専用のリファレンスページが立てられている(それだけメジャー?)ので以下使っています。

Nordic BLE Sniffer

まずRSSI(Received Signal Strength Indicator)の強さでフィルタ掛ける場合は以下例(-70 dBmより大きい場合のみ抽出)のようにできます。

nordic_ble.rssi > -70

また、物理チャンネルを指定する場合は以下のように。

nordic_ble.channel == 37

なお、BLEの場合、40チャンネルのうち、アドバタイズに使えるのは37, 38, 39の3チャンネルです。番号はつながっていますが、周波数的には最小、真ん中辺、最大のところにあって、隣接するのはデータチャネルです。

micro:bit (MakeCode環境)のサービスもWiresharkでサポート

犬も歩けば棒に当たる、読んでみるもんです。今回WiresharkのBluetooth関係のページを経めぐっていて見つけました。micro:bitのサービス(こちらはコネクションを確立してから使うもの)を解読するための項目が大量に含まれていました。

Bluetooth GATT Attribute Protocol

GATT(汎用アトリビュートプロファイル)という名のもとの半分以上をmicro:bitサービスで占拠しています。後でmicro:bitサービスをスマホで操作するところをWiresharkでキャプチャして解析してみたいと思います。

IoT何をいまさら(83) M5Stack ATOMLite、MQTTでnode-RED接続 へ戻る