低コスト実装:2000円以下で構築するお手軽、簡易BLE Sniffer
はじめに
ネットで Nordic の Bluetooth LE Packet Sniffer を見かけたのがきっかけでした。
調査を進める中で、Seeed XIAO BLE nRF52840 を使用すれば、比較的安価かつシンプルな構成でBluetooth LE のパケットスニファ環境を構築できそうだと分かりました。
そこで本記事では、簡易 Bluetooth LE Packet Sniffer の構築について、実際に試した手順と動作確認の結果をまとめていきます。
準備するモノ
- Windows11 + WLS 2(Ubuntu)
- Wireshark Version 4.6.2
- Seeed Studio XIAO nRF52840(スイッチサイエンス)
- ST-Link/V2互換品
- 半田ごてとちょっとした
勇気
手順
1)nRF52840とST-Link/V2をSWD(Serial Wire Debug)で接続する。
| ST-Link/V2 | nRF52840 | 備考 |
|---|---|---|
| SWDIO | DIO | データ信号 |
| SWCLK | CLK | クロック信号 |
| GND | GND | 共通接地 |
| 3.3V (TVCC) | 3V3 | ターゲット電圧の検出用 (※1) |
| RST | RST | 必要に応じて接続 (※1) |
※1:今回は3.3VとRSTを接続しなくても動きました。
2)nRF Util のインストール
ここからWindows 版の nRF Util をダウンロードします。
ダウンロード後、コマンドプロンプト(DOS 窓) を起動し、以下のコマンドを実行してnRF Util のインストールを行ってください。
C:\Users\Developer>nrfutil install completion
C:\Users\Developer>nrfutil install ble-sniffer
C:\Users\Developer>nrfutil ble-sniffer bootstrap
nRF Util が正常にインストールできると、以下のファイルが展開されます。
C:\Users\xxx\.nrfutil\share\nrfutil-ble-sniffer\firmware\sniffer_nrf52840dk_nrf52840_4.1.1.hex
C:\Users\xxx\AppData\Roaming\Wireshark\extcap\nrfutil-ble-sniffer-shim.exe
C:\Users\xxx\AppData\Roaming\Wireshark\extcap\nrfutil-ble-sniffer-hci-shim.exe
C:\Users\xxx\AppData\Roaming\Wireshark\extcap\nrfutil-ble-sniffer-shim-config.json
3)openocdのInstall
WSLのUbuntuを起動後、aptコマンドでOpenOCDをインストールしてください。
$ sudo apt install openocd
$ sudo apt install usbutils
4)F/Wの書き込み
Windows 上の USB デバイスを WSL(Ubuntu)に接続する
C:\Windows\System32>usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-9 0db0:0076 USB 入力デバイス Not shared
3-1 0483:3748 STM32 STLink Shared
4-2 0c45:7663 USB 入力デバイス Not shared
4-3 093a:2510 USB 入力デバイス Not shared
C:\Windows\System32>usbipd bind --busid 3-1
C:\Windows\System32>usbipd attach --wsl --busid 3-1
usbipd コマンドの実行には管理者権限が必要です。
また、usbipd attach を実行する前に、WSL 2(Ubuntu)をあらかじめ起動しておく必要があります。
Ubuntuで、openocdコマンドを使いF/Wを書き込む
$ openocd -f interface/stlink.cfg -f target/nrf52.cfg -c init -c "reset init" -c halt -c "nrf5 mass_erase" -c "program sniffer_nrf52840dk_nrf52840_4.1.1.hex verify" -c reset -c exit
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
nRF52 device has a CTRL-AP dedicated to recover the device from AP lock.
A high level adapter (like a ST-Link) you are currently using cannot access
the CTRL-AP so 'nrf52_recover' command will not work.
Do not enable UICR APPROTECT.
Info : clock speed 1000 kHz
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.241270
Info : [nrf52.cpu] Cortex-M4 r0p1 processor detected
Info : [nrf52.cpu] target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for nrf52.cpu on 3333
Info : Listening on port 3333 for gdb connections
[nrf52.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00009c80 msp: 0x2003d3c0
Info : nRF52840-xxAA(build code: D0) 1024kB Flash, 256kB RAM
Info : Mass erase completed.
[nrf52.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
Warn : Adding extra erase range, 0x00011734 .. 0x00011fff
** Programming Finished **
** Verify Started **
** Verified OK **
$
5)Wiresharkの起動
Wireshark を起動し、メニューから [ヘルプ] → [Wireshark について] を選択します。
表示されるポップアップウィンドウで [プラグイン] タブ を開き、
一覧に nrfutil-ble-sniffer-shim.exe および nrfutil-ble-sniffer-hci-shim.exe が表示されていれば、
Sniffer デバイスは正しく認識されています。

キャプチャ対象のインタフェースとしてnRF Sniffer for Bluetooth LEを選択することで、キャプチャできます。
最後に
私の環境ではnRF Sniffer for Bluetooth LE のキャプチャプラグインをインストール後、Wireshark の起動が極端に遅くなる現象を確認しました。
調査したところ、
C:\Users\xxxxxx\AppData\Roaming\Wireshark\extcap
に配置されたキャプチャプラグインが起動時に読み込まれることが原因のようです。
当該ディレクトリから キャプチャプラグインのファイルを削除すると、Wireshark の起動速度は元に戻りました。
BLE Sniffer を使用しない場合は、プラグインを一時的に削除(または退避)しておく運用が無難だと思われます。


