目次
BLE無線区間のデータを見たくなった
ESP32とWindows 10間でBLE接続をしてセンサデータを準?リアルタイムで収集するソフトウェアを書いているのですが、どうにも通信周りが安定してこないので、お互い何のパケットを送受信しているのかを見ながらデバッグしようと思いました。ネットワークのSnifferをしたいんだったらWiresharkを用いて中身をのぞくのがデファクトスタンダードかと思いますが、Bluetooth関連となると、IP over BLEはなにもしなくてもデータの中身を覗くことができますが今やっているのはGATT Serverの上にシリアル通信ぽいものを作成しているため、何らかのSniffer用ドングルが必要になります。そこでスイッチサイエンスのnRF51822搭載 Bluefruit LE Snifferを購入して試してみることにしました。
Bluefruit LE Sniffer
本体は基板むき出しなのでちょっと怖い。こういう時用に3DPを持っておいてなんちゃってケースを作った方が良いんだろうかと最近思い始めています。でもFFF(Fused Filament Fabrication)方式が家庭向きには良いと言いつつ、会社で3DP買って試したときやっぱり樹脂が溶けたときの臭いが気になったので・・・なかなか踏み出せないでいます。

使い方(Adafruitのページに純粋に従うケース)
USB-UARTドライバのインストール
AdafruitのページのUSBドライバを用意して(今スイッチサイエンスから入手可能なドングルはCP2104がUSB通信用チップとして搭載されているものなので、CP2104 Driver Requirements (Black Boards)を選びます。VCPドライバが必要なのでそれをインストールしておきます。インストール後に本ドングルを挿すと青色LEDが点滅してBLEのパケット受信を始めます。
WireShark立ち上げ&プラグインインストール(置くだけ)
AdafruitのページにてSniffer v2をインストールできます(このSniffer v2ページの中央付近にあるボタンを押下するとBETA-1がインストールできます)が、これは展開するとPythonファイルになってるのですね。これはWireSharkのExtCapになっているので、まずWireSharkを立ち上げてメニューから[ヘルプ]→[wiresharkについて]を選択して、出てくるポップアップウィンドウからタブを選んでExtCapのパスを確認しておきます。個人ExtCapパスに入れるとすると、その場所の列をクリックするとフォルダを作ってくれてExplorerでそのパスを開いてくれます。そこに先ほどのSniffer v2の展開物をコピーします。


WireShark再起動&パケットキャプチャ成功
その後WireSharkを再起動すると、インタフェースの中に「nRF Sniffer (COMx)」が含まれるようになります。

これでキャプチャを開始すると、ちゃんとESP32で動作させているBLE通信のアドバタイズパケットが流れていることが観測できました。これはありがたいです・・・。

Nordic Semiconductor社のページに従いたい人(ややチャレンジャー?)
以上のやり方は、Python2.xに縛られてしまう事と(もうだいぶPython3.xに移行していってしまってるので、このためだけにPython2.xを生かすというのもつらい)、Bluetooth 5.0には対応できないと思われるので、BLE通信プロセッサを製造しているNordic Semiconductor社のページからWiresharkのプラグインを取ってきて検証してみましょう。
Nordic Semiconductor上でのファームおよびWiresharkプラグイン
Nordic SemiconductorのWebページ上では「nRF Sniffer for Bluetooth LE」という名称で紹介されています。おそらく型番からいって、このAdafruitから出ているSnifferはnRF51 Dongle相当かと思われますが、もうdiscontinuedとか切ないことが書いてあります。でもまぁまだ売られていますしね・・・Bluetooth 5.0の2MbpsバージョンをSniffする必要がなければ問題はないかと思います。私の場合、ESP32 WROOM32-DのBLE接続が見えれば良い(Bluetooth 4.xです)のでOKということで。
ファームウェアのアップデートは本デバイスでは面倒そう
Nordic Semiconductor社のソフトウェアページでは本デバイス相当のnRF51 Dongleの最新ファームウェアも同梱されたnrf_sniffer_for_bluetooth_le_4.0.0.zipまで配布がされていますが、Adafruitのデバイス紹介ページにあるように、そのままのやり方では(Nordic社のリリースしているプログラムライターでは)ファームウェアアップデートモード(DFUモード)にするだけでは書き込めずJ-linkなどから行わないとダメって書いてあって(JTAG経由でアップロードせよって事でしょうけれど、I/Oが立っていないので裏面パターンに置いてあるSWDIO/SWCLKにJ-linkの出力をおけってことかも)、これは大変そう・・・って思ったので書き換えは断念しました。
プラグインについては3.x系までは使える
Wiresharkプラグイン部分については、ntf_sniffer_for_bluetooth_le_3.1.0.zipで試したところ、ここまではOK。上記の要領で動作させることができます。Python3.x前提にできるので、ちょっと心の中のめんどくささが解消されるかなというところです。4.xまで上げるとなぜか認識できなくなったので、これはファームウェアアップデートに踏み込まなくてはならないのかなと推測しています。