スイッチサイエンスに発注した、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