🦷

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をインストールする

これは普通にインストール。

https://www.wireshark.org/

UART変換デバイスドライバをインストールする

黒い基板はCP2104、青い基板FTDIのドライバをインストールする。

https://learn.adafruit.com/introducing-the-adafruit-bluefruit-le-sniffer/usb-driver-install

nRF Sniffer for Bluetooth LEをダウンロードする

以下のページからダウンロードし、展開しておく。

https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE/Download?lang=en#infotabs

About WireShark画面でフォルダを確認する

Personal Extcap pathPersonal 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 をつけると解決するようだ。

https://devzone.nordicsemi.com/f/nordic-q-a/107828/invalid-escape-sequence-s

--- 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.*** というデバイスが表示される。

参考

https://zenn.dev/nnabeyang/articles/ad71028a39ad78
https://qiita.com/tadaogi/items/bfe9f8b86286f64068b5

Discussion