M1 Mac で BLE sniffer を動かす

少しはまったのでメモる。

#目的

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を[ここ](https://www.wireshark.org/download.html)からダウンロードしてインストール
スニファー用のファイルを[ここ](https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE/Download#infotabs)からダウンロード。以下で、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行目）

```python
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だけあるみたい。（２台しか確認していないので本当かどうか不明。環境によって違うかもしれないので、その辺は自分で調べてください。）
とりあえず /dev/cu.debug-console に対して serial.Serial(..., rtscts=True) を実行するとエラーになるのでそれを回避する。なんとなく、/dev/cu* を順に調べていって、snifferが見つかったら返すみたいなので、うまくいかなかったら適当に修正してください。

これでエラーにならないのを確認したら WireShark 起動すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133150/46eddd00-84b5-68be-535d-743591e10c69.png)

みたいに、Snifferが見えるようになる。なぜ２つ見えるかは不明だけど、どっちでもOK。

この後、WireSharkのEditのConfiguration ProfilesでProfile_nRF_Sniffer_Bluetooth_LEを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133150/58e5fb02-9837-05cb-69d6-2aa43743f0db.png)

とりあえず動くところまでは確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133150/ce7fd683-f6b4-e814-b4a8-305efcb3909a.png)