chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

snifferでBLEをキャプチャする->Micro:Bitでなんとかなるかと

スイッチサイエンスに発注した、nRF51822搭載 Bluefruit LE Sniffer が届いたのでセットアップして使ってみる。
nRF51822搭載 Bluefruit LE Sniffer - スイッチサイエンス

結論:BLEのキャプチャまでは行えた。->その後正常に動作せず苦戦->Micro:bitで代用中
以下作業メモ:

セットアップ
セットアップはおおよそ、Nordic Semiconductor社からSniffer用ツール一式をDL、
落としたファイル:nrf_sniffer_for_bluetooth_le_3.0.0_129d2b3.zip
Wiresharkをインストール、
nRFから落としたファイル類をWireSharkの各フォルダにコピー
1. C:\Program Files\Wireshark\profiles <- 展開したProfile_nRF_Sniffer_Bluetooth_LE フォルダごとコピー
2. C:\Program Files\Wireshark\extcap <- 展開したextcapフォルダ配下のファイル一式

動作確認
マニュアルに従って、extcapフォルダ内でnrf_snifferバッチを実行して正しく実行できるかを確認する。
手抜きで引数無しで以下で確認、serialパッケージなしとエラーで怒られる

C:\Program Files\Wireshark\extcap>nrf_sniffer_ble.bat
Traceback (most recent call last):
  File "C:\Program Files\Wireshark\extcap\nrf_sniffer_ble.py", line 48, in <module>
    import serial
ModuleNotFoundError: No module named 'serial

補足:正しい確認コマンドは引数を付けた以下

C:\Program Files\Wireshark\extcap>nrf_sniffer_ble.bat --extcap-interfaces


エラー回避
自分のPCにはPythonがいろいろ入っているのだが、、batchからはpyコマンドで起動されているようである。pyコマンド+pipを使ってpipを更新した後、pyコマンド+pipでpyserialパッケージをインストール

C:\Windows\system32>py -3 -m pip install --upgrade pip
C:\Windows\system32>py -3 -m pip install pyserial

再度batchファイルを実行、正常に動作されたことを確認

WireSharkを起動すると「nRF Sniffer Bluetooth LE COM」が表示されるので、それを選んでキャプチャ実行、BLEパケットがキャプチャされる。

今後の取り組み:
KorgのmicroKeyAirのパケットがどのようなものか、キャプチャしてビットフィールドから確認する。ESP32+MicroPython版BLEで生成したBLE Serverのパケットとどう違うのかも確認。

■追記(200812)
一旦動いていたBLEのSnifferが動かなくなった。動かないとは正確に言うと、WireSharkの画面で、キャプチャ用インタフェースリストにBLE Snifferが出なくなったということ。キャプチャ用デバイスとの通信がうまくいっていないのかも。ボーレート切り替えに注意しろという記事もあったので、ボーレート切り替えのパッチを当てる必要があるかもしれない。(UART.pyに手パッチを当ててみたがやはり表示されず)
他のキャプチャ手段として、RaspberryPiも使えるそうなので、ラズパイでSniffingしてみることに。
■追記
ラズパイはpromiscuous mode ではキャプチャできないようで、、他人同士の通信はキャプチャできない。この制限は大きいので、やっぱりnRF51822によるsnifferが動くようにもうすこし取り組む
nRF51822搭載 Bluefruit LE Sniffer - スイッチサイエンス
https://cdn-learn.adafruit.com/assets/assets/000/059/041/original/nRF_Sniffer_User_Guide_v2.1.pdf?1533935335
V1 Python API | Introducing the Adafruit Bluefruit LE Sniffer | Adafruit Learning System

AdaFruitのBLE SnifferのUSB-UARTブリッジは、CP2104である。(FT231Xは古い青色ボード)

Windows環境ではどうもUSB-Serialドライバがおかしいのか正しく認識されないので、RaspberryPiにSnifferを接続して動かしてみる。CP210Xドライバがないので、DLしてビルドしてインストール

  sudo apt-get install linux-headers
  make
sudo cp cp210x.ko /lib/modules/5.4.51+/kernel/drivers/usb/serial/
sudo insmod /lib/modules/5.4.51+/kernel/drivers/usb/serial/usbserial.ko
sudo insmod cp210x.ko
root@raspberrypi:/lib/modules/5.4.51+/kernel/drivers/usb/serial# lsmod | grep cp
cp210x                 24576  0
usbserial              36864  1 cp210x

バイスをさした後のログ

Aug 13 00:05:32 raspberrypi kernel: [  299.803843] dwc_otg_handle_wakeup_detected_intr lxstate = 2
Aug 13 00:05:32 raspberrypi kernel: [  300.313785] usb 1-1.1: new full-speed USB device number 7 using dwc_otg
Aug 13 00:05:32 raspberrypi kernel: [  300.413984] usb 1-1.1: device descriptor read/64, error -32
Aug 13 00:05:33 raspberrypi kernel: [  300.633838] usb 1-1.1: device descriptor read/64, error -32
Aug 13 00:05:33 raspberrypi kernel: [  300.853832] usb 1-1.1: new full-speed USB device number 8 using dwc_otg
Aug 13 00:05:33 raspberrypi kernel: [  300.954030] usb 1-1.1: device descriptor read/64, error -32
Aug 13 00:05:33 raspberrypi kernel: [  301.173864] usb 1-1.1: device descriptor read/64, error -32
Aug 13 00:05:33 raspberrypi kernel: [  301.294304] usb 1-1-port1: attempt power cycle
Aug 13 00:05:34 raspberrypi kernel: [  301.953942] usb 1-1.1: new full-speed USB device number 9 using dwc_otg
Aug 13 00:05:34 raspberrypi kernel: [  302.394018] usb 1-1.1: device not accepting address 9, error -32
Aug 13 00:05:34 raspberrypi kernel: [  302.494202] usb 1-1.1: new full-speed USB device number 10 using dwc_otg
Aug 13 00:05:35 raspberrypi kernel: [  302.934041] usb 1-1.1: device not accepting address 10, error -32
Aug 13 00:05:35 raspberrypi kernel: [  302.934488] usb 1-1-port1: unable to enumerate USB device

失敗している雰囲気が。。多分正しく認識されると /dev/ttyUSB0等で見えるはずだが。。そのデバイスは、なし
別のUSBポートに差しなおししたら正しく認識された。 /dev/ttyUSB0も出現した。

Aug 13 00:14:20 raspberrypi kernel: [  827.703715] dwc_otg_handle_wakeup_detected_intr lxstate = 2
Aug 13 00:14:29 raspberrypi kernel: [  836.975416] dwc_otg_handle_wakeup_detected_intr lxstate = 2
Aug 13 00:14:29 raspberrypi kernel: [  837.543888] usb 1-1.4: new full-speed USB device number 11 using dwc_otg
Aug 13 00:14:30 raspberrypi kernel: [  837.678533] usb 1-1.4: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
Aug 13 00:14:30 raspberrypi kernel: [  837.678566] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Aug 13 00:14:30 raspberrypi kernel: [  837.678585] usb 1-1.4: Product: CP2104 USB to UART Bridge Controller
Aug 13 00:14:30 raspberrypi kernel: [  837.678603] usb 1-1.4: Manufacturer: Silicon Labs
Aug 13 00:14:30 raspberrypi kernel: [  837.678619] usb 1-1.4: SerialNumber: 01C73488
Aug 13 00:14:30 raspberrypi kernel: [  837.698755] cp210x 1-1.4:1.0: cp210x converter detected
Aug 13 00:14:30 raspberrypi kernel: [  837.703161] usb 1-1.4: cp210x converter now attached to ttyUSB0

存在はしたが、まともに動いていないようである

# cat /dev/ttyUSB0
cat: /dev/ttyUSB0: Input/output error

■追記
昨日はどうやってもUSB-Serial変換ドライバがうまく割り当てられなかったのだが、今日はすんなり接続できた。なぜか?COMポートさえ見えればSnifferで動かせるはずなのだが。

sniffer.pyからポート指定で接続してもやはりエラーになる。Wiresharkでもスニファデバイスが表示されない。一旦Adafruit版はあきらめて、同じデバイスが乗っているMicro:bitでキャプチャを試みる(btlejack.pyというやつ)。

Micro:bitをラスパイに接続して、ラズパイで以下を実行してファーム?を焼く

# mkdir /mnt/MICROBIT
# mount /dev/sda  /mnt/MICROBIT/

# btlejack -i
BtleJack version 1.3
[i] Flashing /mnt/MICROBIT ...
[i] Flashed 1 devices

ESP32/iOS間のBLE通信をキャプチャしてみる
[ESP32]--------[iOS]

バイス側(ESP32 MicroPython)の表示

>>> *** IRQ ***
event: 1, data: (0, 1, b'G\xfa\x0c\x948\xZZ')
IRQ_CENTRAL_CONNECT
47-FA-0C-94-38-ZZ
[47:FA:0C:94:38:ZZ] connected, handle: 0

スニッファの表示

root@raspberrypi:/mnt# btlejack -s -v
BtleJack version 1.3

[i] Enumerating existing connections ...
[ - 68 dBm] 0xaf9aa3ZZ |?pkts: 1
[ - 64 dBm] 0xaf9aa3ZZ |?pkts: 2
[ - 64 dBm] 0xaf9aa3ZZ |?pkts: 3
          *続く*

cオプションでBLE通信のコネクションをフォローできる。

root@raspberrypi:/mnt# btlejack -c any
BtleJack version 1.3

[i] Detected sniffers:
 > Sniffer #0: version 1.3
LL Data: 05 22 cd 38 94 0c fa 47 1a 4d cc a4 ae 30 6f 94 9a af d4 7f e7 03 0f 00 18 00 00 00 48 00 01 f0 ff ff 1f 0a
[i] Got CONNECT_REQ packet from 47:fa:0c:94:38:cd to 30:ae:a4:cc:4d:1a
 |-- Access Address: 0xaf9a946f
 |-- CRC Init value: 0xe77fd4
 |-- Hop interval: 24
 |-- Hop increment: 10
 |-- Channel Map: 1ffffff001
 |-- Timeout: 720 ms

LL Data: 0b 06 0c 08 0f 00 03 61
LL Data: 0b 06 0c 08 0f 00 03 61
LL Data: 07 09 09 fd 00 00 00 00 00 00 00
LL Data: 0b 09 08 fd 00 00 00 00 00 00 00
LL Data: 0b 09 08 fd 00 00 00 00 00 00 00
LL Data: 0b 09 08 fd 00 00 00 00 00 00 00
LL Data: 0b 09 14 fb 00 48 08 fb 00 48 08
LL Data: 0a 07 03 00 04 00 02 0f 02
LL Data: 0a 07 03 00 04 00 02 0f 02
LL Data: 0a 0b 07 00 04 00 08 01 00 05 00 00 2a
LL Data: 0a 09 05 00 04 00 12 0e 00 01 00
LL Data: 0a 07 03 00 04 00 0a 0d 00
$ sudo blescan
Scanning for devices...
    Device (new): 06:94:8c:1a:00:ea (random), -66 dBm (not connectable)
        Manufacturer: <06000109200281510ddbaac7fabdc416f4c86fa522b6332e9ea2a70e40>
    Device (new): 30:ae:a4:cc:4d:1a (public), -80 dBm
        Flags: <06>
        Complete 16b Services: <00001812-0000-1000-8000-00805f9b34fb>
        Appearance: <4003>
        Complete Local Name: 'BLELibTest123'

■関連情報
BLE Sniffer Manual
Nordic Semiconductor Infocenter
nRF Sniffer for Bluetooth LE - Downloads - nordicsemi.com
Introduction | Introducing the Adafruit Bluefruit LE Friend | Adafruit Learning System

先行された方のブログ
Bluefruit LE Snifferを使用したBLEプロトコル解析 | TomoSoft
BLE-Sniffer FW-V2の利用方法まとめ - 144Labグループ開発者ブログ
Raspberry Pi 3でのBLEのパケット構造解析 | TomoSoft