前回は、Bluetoothインタフェースを搭載しているラズパイ(Raspberry Pi3 model B)上で動かしたWiresharkを使って、M5Stackが垂れ流すBLEのアドバタイジング・パケットをキャプチャできることを確かめました。同じことをPC上でもやりたい。そこで購入させてもらったのが、USBドングル型のBLEパケットの検出用ツール、Adafruit社のBluefruit LE Snifferというものです。これを使ったらPCでもキャプチャはバッチリ?
※「IoT何をいまさら」投稿順Indexはこちら
(2021年4月12日追記、Wireshark上でのBLEアドバタイズパケットの表示フィルタについてはこちらをご参照ください。)
購入は、この前もUSBドングル型の電流メータを購入させてもらったSWITCHSCIENCE社から。現物写真は冒頭のアイキャッチ画像を御覧ください。同社のHPからリンクをたどれば、インストールに必要なドキュメント等はたどれます。今回、頼りにしたのは
introducing-the-adafruit-bluefruit-le-sniffer.pdf
というドキュメントなのですが、そこの手順を若干「勝手にアップデート」してインストールを行いました。まず最初のステップは、このUSBドングルがCOMポートに見えるようにUSBシリアルドライバのインストールです。どうもボードに2つのバージョンがあるようで、「黒色」ボードなら、SILICON LABS社のCP2104ドライバ、「青色」ボードならFTDI社のFT231xドライバを導入しておくように書いてあります。購入したのは「黒色」なのですが、どちらのドライバもインストール済(マイコンツールではどちらも定番)なので、ここはパス。BLE-snifferドングルを差し込めば、COMポートとして認識されました。
ドングル上に書き込むファームウエアのアップデートは、こちらもパス。購入状態のままとしました。
そして次は、肝心のBLEを制御するNORDIC社 nRF51822、BLE無線マイコンと呼んでよいでしょう、とWiresharkの間をつないでくれるNORDIC社提供のソフトウエアをインストールです。肝心なことは、PC上にインストールしたWiresharkは外部提供のキャプチャのためのAPIを所定のフォルダ内で探すので、そこに必要なファイルを置いておかないといけない、ということです。実際のロケーションはWiresharkのメニューから
ヘルプ>Wiresharkについて>フォルダ(タブ)
を選択すれば、Global Extcap pathとしてextcapフォルダへのパスを知ることができます。そこに書き込むべきなのはPythonでかかれたAPI群です。しかし、上記のPDFファイルには、Python2でないとそいつらは動かないので、Python27入れろ、みたいなことが書いてあったのです。流石に今年は2020年、Python27はないでしょう、と思いました。(実は、まだPC上にはPython27も残してはいるのですが、普段使いは昨秋よりPython38にスイッチ済です。)
NORDIC社のダウンロードサイトを見れば、3つのバージョンが見つかりました。一番古い1.0を除き、2.0.0というバージョンのものが上記のPDF相当のもののようです。3.0.0というバージョンのものがPython3対応のものでした。(なお、3.0.0はPython3のみでしか動作しないようです)
-
- nrf_sniffer_for_bluetooth_le_2.0.0_c87e17d.zip
- nrf_sniffer_for_bluetooth_le_3.0.0_129d2b3.zip
ここでは迷わず、Python3対応の3.0.0の方を解凍しその中のextcapフォルダ内のファイルをWiresharkの対応フォルダにコピーしました。なお、忘れずに
pyserial 3.4以上
がインストールしてあることを確認。私の環境ではPython27にはpyserial入っていたのに、python3側には無かったのでpip3しました。複数バージョンを並置していると、ときどきありますかね、そういうことが。
さて、設定を済ませてWiresharkを起動すれば、こんな感じ。ちゃんと、一番下に nRF Sinffer for Bluetooth LE が見えています。
M5Stackには、テスト用に2投稿前と同じアドバタイジング・パケットを垂れ流しておいてもらい、キャプチャをかけてみます。
キャプチャを止めて、ソースアドレスでソートすれば、M5Stack(チップはEspressif製なのでアドレスの上位がEspressiとなっている)のアドバタイジング・パケットが列挙されてきます。
Length4オクテッド(まあ、実際この環境ではオクテッド=8ビット=バイトな関係)、そしてテスト用のManufacture Specificを示す0xff、テスト用のCompanyID 0xfffffという具合で読めとります。前々回手動でやり、前回ラズパイでやったのと同じことがPCでもできました。
さて、蛇足ですが、今回使用したUSBドングルタイプのBLE Snifferと、BBC micro:bit、MCUは同じNordic製 nRF51822です。兄弟?の近影はこちら。