これまでBLEのアナライズは市販機器とBT接続するアプリを作成する場合、なかなか通信仕様書に未記載のタイミングやシーケンスもありとても有効でした。。これまで WinShark に Adafruit ADA-2269 nRF51822搭載 Bluefruit LE Sniffer (下図)を WinShark で用していました。

PCに差せばすぐ使えるので導入しやすいです。しかしBLE4.0までの対応です。今回開発ネタの BLE5.4のnRF52840と、BLE5.2のAndorid端末を使います。Adafruit で試したところやはりアナライズに引っ掛からないようです。そこで nRF52840 Dongle をアナライザ化できるとのことで導入しました。その覚書です。
入手と初期CHECK
入手期間は1weekくらい。日本に在庫を持っているようです。在庫元はDigkeyでした。静電ビニールに型番が大きく印刷されたシールが貼られていてメーカの自身ありげな感じです。

PCに差すと赤いLEDがふんわり1秒程度で点滅します。これはBootloadrモードです。出荷時にBootloadrが書込んあるので、高価なデバッガインターフェイス無くてもプログラムの書込みが出来るようになっているわけです。
nRF Connect Desktop をインストール済みPCなら、以下のように仮装COMポートの割り当てを確認できます。

アナライザプログラムの書込み
導入KIT: nRF Sniffer for Bluetooth LE をダウンロードします。登録等は不要です。なるほど Adafruit のプログラムも元々Nordic製だったのですね。
具体的に何を使って書込むのか、WEBページ、PDFドキュメントには明確に書いてありません。nRF Connect Desktop から、J-linkコマンド版から、nrfprogから、nrfutil からと複数の情報があり悩みます。同Dongleの場合は nRF Connect Desktop の Programer でOKです。 Bootloaderの書込みプロトコルは?と深読みしてしまいがちですが、Programer が同Dongleのbootloader に対応しています。少し古いバージョンでも大丈夫なようです。







尚、一度書込むとDongleの通常起動時はアナライザプログラムが起動します。WinSharkからのリクエストがないとLEDは何も点滅しないため、失敗したかと焦ります。bootloader は残っているので、起動したまま下図のRESETボタンを押す再びbootloader モードに移行します。USBに差しながら押すとかはナシです。(Zigbeeがそうだったような) 取説には「boot PINとGPIOを接続する」等の記載がみられましたが本操作だけていいようです。

WinSharkの基本セットアップ
導入KITのフォルダー内容をWinSharkコピーします。

Profileをインポートします。

基本コレでOKなハズですが、WinSharkがDongleを認識しません。
WinSharkの設定見直し1
Dongleを認識しない原因は、プログラム書込み後、Dongleの仮想COMがWindows標準用に代わってしたことによるものでした。以下のように修正します。これでDongleの黄緑LED1が約0.5secで点滅を開始しました。



しかしWinSharkのインターフェイス一覧に、計測用LAN非接続の Windows8 32bit では表示され、Win10/Win11 64bitでは表示されない事象が発生です。WinSharkの編集->設定->Protcol->Bluetooth->BT LE LLをみると、 32bit版ではBLE5.0まで、64bit版ではBLE5.4までの対応となっているようで、32bit版では目的が達成できません。
WinSharkの設定見直し2
導入KITはPythonを使っているますが、そのインストール有無判定にWhereコマンドを使っています。以下12行目です。( py も python もない場合スルーなのもいただけないですが… )

Windows10以降は、Microsoft Store 版のpython があり、py か python をたたくとMicrosoft Store に飛ぶランチャーが仕込まれています。このため nrf_sniffer_ble.py がスルーされていました。びっくりです。紛らわしいので削除します。この後、正しく本家Pythonも入れて、環境変数のPATHを切ります。


WinSharkの設定見直し3
しかしまだうまくいきません。nrf_sniffer_ble.py の処理結果を見たいので、 nrf_sniffer_ble.bat に手を入れます。リダイレクトでエラー出力を、Users\xxx\Appdata\Temp に記録し、エラーがあったらNotepadで開きます。こうすると何か問題が生じたらスルーせずに気づけます。
@echo off
set MYLOG=%TEMP%\nrf_sniffer_ble_bat.log
del /f %MYLOG%
rem Path to this batch file
set NRF_SNIFFER_BLE_PATH=%~dp0
rem Remove the "\" from the end of the path
set NRF_SNIFFER_BLE_PATH=%NRF_SNIFFER_BLE_PATH:~0,-1%
rem Activate virtualenv if present
if exist "%NRF_SNIFFER_BLE_PATH%\env\Scripts\activate.bat" call "%NRF_SNIFFER_BLE_PATH%\env\Scripts\activate.bat" 2> %MYLOG%
rem Find out if the launcher is installed and available
where py > NUL 2>&1
if %ERRORLEVEL% EQU 0 (
py -3 "%NRF_SNIFFER_BLE_PATH%\nrf_sniffer_ble_win.py" %* 2>> %MYLOG%
) else (
python "%NRF_SNIFFER_BLE_PATH%\nrf_sniffer_ble_win.py" %* 2>> %MYLOG%
)
if %ERRORLEVEL% NEQ 0 (
notepad %MYLOG%
)
以下エラーがでていました。option機能を追加インストールします。


警告(UNIXでは出ないのでしょうか?)も一応直して、Windows専用にリネームしときます。カッコ内は ¥¥ しないといけないようです。


これでDongleの黄緑LED1が点滅を開始しましたが、WinSharkのメイン画面にインターフェイス名: nRF Sniffer for Bluetooth LE が現れません。
WinSharkの設定見直し4
仕方ないので nrf_sniffer_ble_win.py にトレースを仕込みます。 logging は仕込まれていましたが、logfileに落とすようになっていないので、132行目辺りに以下のコードを挿入、既存 logging インスタンスはlogger に置換。ログファイルはパスを渡すと面倒なのて固定です。
logger = logging.getLogger("nrf_sniffer_ble_win")
logger.setLevel(logging.INFO)
fl_handler = logging.FileHandler(filename="c:\\windows\\temp\\nrf_sniffer_ble_win_py.log")
logger.addHandler(fl_handler)
しかしいろいろいじっているうちにインターフェイス名が現れるようになりました。

ログしてみると RF52840とAndorid端末:MotoG32でためした約2Kbの244byte分割送信が見受けられました。

ようやくアナライズ環境が準備できましたが、新たなギモンが生じました。別記事に引き続きます。
GPLライセンスに従い修正したスクリプトは、本体にupdateするのは恐れ多いので個別にGitHubにおきました。
https://github.com/MOTOPLUS4APPLICATIONS/nrf_sniffer_for_bluetooth_le