少しはまったのでメモる。
目的
BLE sniffer を安価に作る
概要
Mac に adafruit の ADA-2269 を刺して、WireShark から使えるようにする。
設定
基本的には、NORDIC の [nRF Sniffer for Bluetooth LE] (https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE#infotabs)に書いてあるとおりにすすめる。WindowsでもLinuxでも動くと書いてある。実際、Windowsマシンではすぐに動いた。
snifferのF/Wを書き込めと書いてあるが、ADA-2269 だとスキップして大丈夫。
WireSharkをここからダウンロードしてインストール
スニファー用のファイルをここからダウンロード。以下で、WireSharkのフォルダーにコピーする。
この後、WireShark の about WireShark の Folders で、Personal configuration と Personal Extcap path を確認。ダブルクリックすれば Finder が開く。
ここに、先程ダウンロードしたスニファー用のファイルをコピーする。
ダウンロードファイルの中の extcap の中身を、Extcap Path にコピーする。
(手順が入れ替わるけど、ここでやるのが楽なので)
ダウンロードファイルの中の Profile_nRF_Sniffer_Bluetooth_LE を、フォルダーごとPersonal configuration フォルダーにコピーする。
ターミナルを開いて、Extcapフォルダーに移動。
ここがはまったところ
python3 nrf_sniffer_ble.py --extcap-interfaces
を実行すると以下のようなエラーになる。
Traceback (most recent call last):
File "nrf_sniffer_ble.py", line 628, in <module>
extcap_interfaces()
File "nrf_sniffer_ble.py", line 135, in extcap_interfaces
for interface_port in get_interfaces():
File "nrf_sniffer_ble.py", line 126, in get_interfaces
devices = UART.find_sniffer(write_data=False) # Try non-intrusive search, set argument to True for intrusive search
File "/Users/tadashi/.config/wireshark/extcap/SnifferAPI/UART.py", line 59, in find_sniffer
reader = Packet.PacketReader(portnum=port, baudrate=rate)
File "/Users/tadashi/.config/wireshark/extcap/SnifferAPI/Packet.py", line 114, in __init__
self.uart = UART.Uart(portnum, baudrate)
File "/Users/tadashi/.config/wireshark/extcap/SnifferAPI/UART.py", line 110, in __init__
self.ser = serial.Serial(
File "/Users/tadashi/Library/Python/3.8/lib/python/site-packages/serial/serialutil.py", line 244, in __init__
self.open()
File "/Users/tadashi/Library/Python/3.8/lib/python/site-packages/serial/serialposix.py", line 332, in open
self._reconfigure_port(force_update=True)
File "/Users/tadashi/Library/Python/3.8/lib/python/site-packages/serial/serialposix.py", line 517, in _reconfigure_port
termios.tcsetattr(
termios.error: (22, 'Invalid argument')
(エラーにならなかったらOKです、、、)
SnifferAPI/UART.py の 110 行目付近でエラーになっているので、以下のように回避する。(以下のソースでは、106行目から108行目)
101 try:
102 if baudrate is not None and baudrate not in SNIFFER_BAUDRATES:
103 raise Exception("Invalid baudrate: " + str(baudrate))
104
105 logging.info('Opening serial port {}'.format(portnum))
106 # by T.Ogino
107 if portnum=='/dev/cu.debug-console':
108 portnum=None
109 self.ser = serial.Serial(
110 port=portnum,
111 baudrate=9600,
112 rtscts=True
113 )
/dev/cu.debug-console って、私が持っているもう一台の intel Mac には存在しないので、M1 Macだけあるみたい。(2台しか確認していないので本当かどうか不明。環境によって違うかもしれないので、その辺は自分で調べてください。)
とりあえず /dev/cu.debug-console に対して serial.Serial(..., rtscts=True) を実行するとエラーになるのでそれを回避する。なんとなく、/dev/cu* を順に調べていって、snifferが見つかったら返すみたいなので、うまくいかなかったら適当に修正してください。
これでエラーにならないのを確認したら WireShark 起動すると、
みたいに、Snifferが見えるようになる。なぜ2つ見えるかは不明だけど、どっちでもOK。
この後、WireSharkのEditのConfiguration ProfilesでProfile_nRF_Sniffer_Bluetooth_LEを選ぶ。
とりあえず動くところまでは確認しました。