🦷
macOS SonomaのWireSharkでAdafruit Bluefruit LE Snifferを使う
TL;DR
- pyserialをextcapの中に入れてしまう
- Python3.12以降で発生するエラーはnrf_sniffer_ble.pyを書き換える
環境
- MacBook Pro 2021
- macOS Sonoma 14.7.2
- WireShark 4.4.2
- Python 3.13.1
- nrf_sniffer_for_bluetooth_le_4.1.1
WireSharkをインストールする
これは普通にインストール。
UART変換デバイスドライバをインストールする
黒い基板はCP2104、青い基板FTDIのドライバをインストールする。
nRF Sniffer for Bluetooth LEをダウンロードする
以下のページからダウンロードし、展開しておく。
About WireShark画面でフォルダを確認する
Personal Extcap path と Personal configuration を確認する。

profilesにProfile_nRF_Sniffer_Bluetooth_LEをコピーする
cd .config/wireshark/
tree .
.
└── profiles
└── Profile_nRF_Sniffer_Bluetooth_LE
├── preferences
└── recent
3 directories, 2 files
extcapにnrf_sniffer_ble.py等をコピーする
- SnifferAPI/
- nrf_sniffer_ble.sh
- nrf_sniffer_ble.py
を先ほど確認したextcapにコピーする。
pyserialもextcapにインストールしてしまう
通常はここで pip install -r requirements.txt を実行するが、
現在のmacOSでは基本システムワイドにpip installをすることができない。
そのためpipxでpyserialをインストールしてlibの中身だけextcapにインストールしてしまう。
brew install pipx
pipx install pyserial
cp -r ~/.local/pipx/venvs/pyserial/lib/python3.13/site-packages/serial/ ~/.local/lib/wireshark/extcap/serial
これでpyserialが使えるようになる。
エラーが出るところはnrf_sniffer_ble.pyを書き換える
ここまでやるとだいたい動くようになるが、実際にpythonスクリプトを実行すると以下のようなエラーが表示されWireSharkからうまく使えない。
python3 nrf_sniffer_ble.py --extcap-interfaces
/Users/trick/.local/lib/wireshark/extcap/nrf_sniffer_ble.py:187: SyntaxWarning: invalid escape sequence '\s'
"{validation=^\s*((37|38|39)\s*,\s*){0,2}(37|38|39){1}\s*$}{required=true}" % CTRL_ARG_ADVHOP)
/Users/trick/.local/lib/wireshark/extcap/nrf_sniffer_ble.py:716: SyntaxWarning: invalid escape sequence '\s'
m = re.search("^\s*rssi\s*(>=?)\s*(-?[0-9]+)\s*$", capture_filter, re.IGNORECASE)
extcap {version=4.1.1}{display=nRF Sniffer for Bluetooth LE}{help=https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Sniffer-for-Bluetooth-LE}
// 以下正常部分のため略
このエラーはPython3.12以降で発生するらしく、このエラーが発生した文字列リテラルの前に r をつけると解決するようだ。
--- nrf_sniffer_ble.py.orig 2022-10-20 16:18:06
+++ nrf_sniffer_ble.py 2024-12-28 23:46:02
@@ -184,7 +184,7 @@
"{tooltip=Advertising channel hop sequence. "
"Change the order in which the sniffer switches advertising channels. "
"Valid channels are 37, 38 and 39 separated by comma.}"
- "{validation=^\s*((37|38|39)\s*,\s*){0,2}(37|38|39){1}\s*$}{required=true}" % CTRL_ARG_ADVHOP)
+ r"{validation=^\s*((37|38|39)\s*,\s*){0,2}(37|38|39){1}\s*$}{required=true}" % CTRL_ARG_ADVHOP)
print("control {number=%d}{type=button}{display=Clear}{tooltop=Clear or remove device from Device list}" % CTRL_ARG_DEVICE_CLEAR)
print("control {number=%d}{type=button}{role=help}{display=Help}{tooltip=Access user guide (launches browser)}" % CTRL_ARG_HELP)
print("control {number=%d}{type=button}{role=restore}{display=Defaults}{tooltip=Resets the user interface and clears the log file}" % CTRL_ARG_RESTORE)
@@ -713,7 +713,7 @@
def parse_capture_filter(capture_filter):
""""Parse given capture filter"""
global rssi_filter
- m = re.search("^\s*rssi\s*(>=?)\s*(-?[0-9]+)\s*$", capture_filter, re.IGNORECASE)
+ m = re.search(r"^\s*rssi\s*(>=?)\s*(-?[0-9]+)\s*$", capture_filter, re.IGNORECASE)
if m:
rssi_filter = int(m.group(2))
if rssi_filter > -10 or rssi_filter < -256:
あとはAdafruit Bluefruit LE SnifferをMacに接続してWireSharkを起動すると、 /dev/cu.*** というデバイスが表示される。

参考
Discussion