XIAO nRF52840でnRF Snifferを動かす

# まとめ
技適の通ったXIAO nRF52840とnRF Snifferを使って安価にBLEのパケットを取得してみました。

# はじめに
BLEの接続が上手くいかない時、空中を飛んでるパケットを解析することがあります。パケットの中身を見ると接続不良の原因が判明しやすくなり、効率よくデバッグできます。

Bluetoothのパケットを取得するための機器は `Bluetooth プロトコル・アナライザ`､`スニファー`などと呼ばれ、主に法人向けに販売されています。以下はellisys社のアナライザーで、価格は`$10,000~`となっています (2023年7月の為替相場で140万円以上)

**ellisys Bluetooth Tracker**
<img width="320" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/046b3946-9cff-b7b5-09bc-02bf7f20b5c5.png">

他にもアナライザーは販売されてますが、どれも高価なので個人やスタートアップにとって使用のハードルが高い状況です:confounded:

# nRF Snifferでお手軽BLEアナライザー
BLEチップ大手Nordic Semiconductorの[nRF Sniffer](https://www.nordicsemi.com/Products/Development-tools/nrf-sniffer-for-bluetooth-le)というツールと開発ボードを使うと安価にパケットの取得を行うことができます:heart_eyes:

**nRF Snifferに対応したnordicの開発ボード**

| 名前 | 価格 | 技適取得:zap: |
|:-----------|:------------|:------------:|
|nRF51 DK| 約6,000円 | × |
|nRF51 Dongle| 生産中止 | × |
|nRF52 DK| 約6,000円 | × |
|nRF52833 DK| 約7,500円 | × |
|nRF52840 DK| 約7,000円 | × |
|nRF52840 Dongle| 約1,500円 | × |

しかし、これらの開発ボードは技適未取得のため日本国内で使うにはハードルが高いです:confounded:

# 技適が通ったデバイスでnRF Snifferを使いたい!
なんと技適の通った`XIAO nRF52840`というデバイスでnRF Snifferを使えるという情報を見つけました！

https://www.keitark.com/2022/10/01/nrf-sniffer-with-seeed-xiao-ble-j-link%E7%84%A1%E3%81%97%EF%BC%89/

こちらの記事によると、J-Linkも使わずにSniffer用のFWを書き込めるらしい :muscle:

# Seeed Studio XIAO nRF52840
さっそくスイッチサイエンスさんで購入。送料込みで`2136円`でした。
![Screenshot from 2023-07-11 15-11-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/0b52afca-9d09-fd9b-7cb8-e18402f19eb6.png)

デバイスは親指の爪くらいのサイズでとても小さいです。技適のマークがついてますね!
<img width="280" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/1c7571c0-2149-3982-22a9-dd651ee67b38.png">

---

では、さっそく `XIAO nRF52840` を使ってスニファーを動かしていきます! :muscle: 

# 動作環境
今回はMacを使いましたが、Windowsでも動かすことができると思います。

### ハードウェア
- MacBook Pro 13-inch, 2020, macOS 13.4.1
- Seeed Studio XIAO nRF52840

### ソフトウェア
- nRF Sniffer v4.1.1
- Wireshark v4.0.6
- Python 3.11.4

# １．nRF Sniffer用のHEXファイルをUF2形式に変換する
`XIAO nRF52840` はUF2という形式のFWアップデートに対応しているそうです。
nordicが提供しているSnifferのFWはHEXという形式なのでHEX → UF2にファイルを変換します。
(変換にはPython 3が必要になるので事前にインストールしておきましょう) 

### nRF SnifferのHEXファイルをダウンロードする
2023年7月時点の最新バージョン v4.1.1をダウンロードしました。
https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE/Download?lang=en#infotabs
![スクリーンショット 2023-07-11 15.38.53 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/6162d835-c991-5c7b-8e95-a77344902ae3.png)

ダウンロードしたZIPファイルの中の `hex/sniffer_nrf52840dongle_nrf52840_4.1.1.hex` が今回使うHEXファイルです。


### HEX→UF2変換用のスクリプトをダウンロードする
`uf2conv.py`と`uf2families.json`をダウンロードします。
https://github.com/microsoft/uf2/tree/master/utils
![スクリーンショット 2023-07-11 16.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/c004176e-f627-9c33-c86e-aaf273930d22.png)


### スクリプトでHEX→UF2に変換する
```
 $ python3 uf2conv.py sniffer_nrf52840dongle_nrf52840_4.1.1.hex -c -f 0xada52840
Converted to uf2, output size: 139264, start address: 0x1000
Wrote 139264 bytes to flash.uf2
```
変換が終わると `flash.uf2` というファイルが出来上がります。

# 2. 変換したUF2ファイルをXIAO nRF52840に書き込む

`XIAO nRF52840` と MacをUSBケーブルで接続し、リセットボタンを素早く2回押すとUSBドライブとして認識されます。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/507cbab6-33d2-f340-e72a-4416a13b5790.png">

変換したUF2ファイル `flash.uf2` をUSBドライブにドラッグアンドドロップします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/5b540e4a-4f57-a1a4-f3d5-e5078899abd7.png">

以上でnRF Sniffer用のファームウェアの書き込みは完了です。

# 3. Wireshark

WiresharkのStable Releaseをインストールします。
https://www.wireshark.org/download.html

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/664742c7-153d-299d-306f-aac6f29a4be3.png">

nRF Sniffer v4.1.1のZIPを展開したフォルダで以下のコマンドを実行します。

```
$ cd extcap
$ python3 -m pip install -r requirements.txt
```

nRF Sniffer用のキャプチャツールをWiresharkの指定フォルダにコピーします。

Wiresharkを起動し、メニューバーから `About wireshark`を選択します。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/41e1065c-32ea-5f02-6563-f083e9dbd75a.png">

赤枠のフォルダーにnRF Sniffer v4.1.1のZIPファイル内の `extcap`フォルダ内のファイルをコピーします。

Capture -> Refresh Interfacesでリフレッシュします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/1b967b99-dd5c-e377-756a-acf0c5712835.png)

nRF Sniffer用のツールバーを表示します。
![スクリーンショット 2023-07-11 17.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/fb966bd3-e9ba-bce1-5e7e-f9aa5f893348.png)

`XIAO nRF52840` とMacをUSBケーブルで接続します。
<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/d19c2d86-54ce-b849-edc9-85a3580aecac.png">



Wiresharkの画面で `nRF Sniffer for Bluetooth LE`をダブルクリックします。
![スクリーンショット 2023-07-11 17.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/9c762397-dea2-50bc-97a8-f1f42f269f21.png)

BLEのパケットの取得が始まりました :bangbang: :sparkles:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/af309707-dc07-fb5b-3571-a1f06c50c8ac.png)

# パケットの解析方法について
具体的なパケットの解析方法については以下のサイトが参考になりそうです。

- [DevAcademy Lesson 6 – Bluetooth LE sniffer
](https://academy.nordicsemi.com/lessons/lesson-6-bluetooth-le-sniffer/)
- [Master BLE Sniffing: nRF52840 USB Dongle & Wireshark Guide](https://novelbits.io/nordic-ble-sniffer-guide-using-nrf52840-wireshark/)

# おわりに
私が業務で使ったアナライザーは数百万円もしましたが、今回の方法では2000円程度の機材で安価にパケットを取得できました。高価なアナライザーとnRF Snifferではできることに違いはありますが、基本的な接続・切断・アドバタイズなどのパケットを見て流れを追うことができますので、今後活用していきたいと思います。

# 参考サイト
- [BLE Sniffer Basics + Comparison Guide](https://novelbits.io/bluetooth-low-energy-ble-sniffer-tutorial/)
- [Nordic Semiconductor nRF Sniffer](https://www.nordicsemi.com/Products/Development-tools/nrf-sniffer-for-bluetooth-le)
- [nRF52の開発ボード比較](https://zenn.dev/naonaorange/articles/20200523_nrf52)
- [nRF Sniffer with Seeed XIAO BLE (J-Link無し）](https://www.keitark.com/2022/10/01/nrf-sniffer-with-seeed-xiao-ble-j-link%E7%84%A1%E3%81%97%EF%BC%89/)
- [nRF Sniffer for Bluetooth LE v4.1.0 User guide](https://infocenter.nordicsemi.com/pdf/nRF_Sniffer_BLE_UG_v4.1.0.pdf)
- [nRF52840-dongle als packetsniffer: Ook voor bluetooth en Zigbee](https://id.nl/huis-en-entertainment/computer-en-gaming/netwerk/nrf52840-dongle-als-packetsniffer-ook-voor-bluetooth-en-zigbee)