📝

Big SurでAdafruit Bluefruit LE Snifferを使う手順

2021/09/29に公開

Adafruit Bluefruit LE Snifferを使えば、WireSharkでBLEの通信内容を確認することができますが、WireSharkの使い方を含めて結構苦労したので、macOS(Big Sur)の場合の設定手順を共有します。

https://ssci.to/3347

WireSharkのインストールと設定

  • WireSharkのインストール
    3.0で動くという情報があったので、3.0.14をインストールしました。しかし、最新版でも動くような気もします。Pythonは2.7.16を使いました。pyenvなどの方法で、環境を作ると良いと思います。大部分は公式ドキュメントに従えば問題ありませんが、メモ程度に説明を追加しておきます。
  • USBドライバのインストール(リンク先の公式ドキュメントに従うだけです)
  • extcapとprofilesインストール

    次のファイルをダウンロードし、解凍した中にあるProfile_nRF_Sniffer_Bluetooth_LEPersonal configulationのフォルダ内のprofilesに設置します(パスの確認はメニューWireshark>About Wireshark> Foldersを選ぶと上の画像のように表示されます。ダブルクリックでファインダーが開きます)。
    nrf_sniffer_for_bluetooth_le(3.1.0)
    ただし、extcapは次のものを使います。
    extcap.zip(BETA1)
    extcapの中身をnrf_sniffer.batrequirements.txtは除いて、Extcap pathのフォルダ内に置きます(requirements.txtに使用しているモジュールが書かれているので、pip2 install -r requirements.txtします)。
  • 設定できたことを確認
    SnifferをUSBに挿した状態で、WireSharkを起動したときにnRF Snifferが表示されるはずです。2つ表示されていますが、/dev/cu.SLAB_USBtoUARTを選び、何やら取れていれば動いていると思います。
  • nRF Sniffer用のツールバーを追加する
    赤で囲った部分のバーの追加方法です。

    メニューのView>Interface Toolbars>nRF Snifferを選択します(下の画面を参考にしてください)。

BLE Snifferの使い方

  • USBにSnifferを挿す
  • WireSharkを起動する
  • /dev/cu.SLAB_USBtoUARTをダブルクリック
  • 先程追加したツールバーのDeviceに通信を見たいペリフェラルデバイスを選択
    下の画像のようにDeviceの選択肢に表示されている一覧にはデバイスアドレスが表示されています。接続したいペリフェラルデバイスのデバイスアドレスを調べないと接続出来ません。調べる方法としては、Android版のnRF Connect for Mobileで確認するのが簡単です(Adafruitのドキュメントでも紹介されています)。Deviceを選択すると、Snifferの点滅の状態が変わります。
  • セントラルデバイス(スマホなど)でペリフェラルデバイスに接続します。
    しばらくして、上の画像のようにSourceのカラムがMaster_xxxxSlave_xxxxに変われば、これが取りたかったものになります。セントラルデバイスとペリフェラルデバイスの接続のときに、よくSnifferが落ちます(WireSharkのログが止まりLEDが点滅しなくなります)。公式ドキュメントのFAQにも書いてあります。

原文:

Q: When I connect to a Central device, I don't see any connection data, but when I disconnect I see the advertising packets again. How do I capture data with a connected peripheral?
A: This is a limitation of the sniffer firmware from Nordic. Advertising in Bluetooth Low Energy happens on three dedicated channels, each running at it's own frequency. For the sniffer to 'follow' the connection it needs to be looking at the right channel when the connection happens, and there is a 2/3 chance that it is looking at another channel at any given moment.
To capture the connection and see data exchanges post connection, you may need to connect several times until the channels are aligned between the sniffer and the BLE peripheral+central devices.

日本語訳:

Q:セントラルのデバイスに接続すると、接続データが表示されませんが、切断すると再びAdvertisingパケットが表示されます。接続した周辺機>器でデータをキャプチャするにはどうしたらいいですか?
A:これは、Nordic社のスニファーのファームウェアの制限です。 Bluetooth Low Energyのアドバタイジングは、3つの専用チャンネルで行われ、それぞれが独自の周波数で動作します。 スニッファーが接続を追跡するためには、接続が起こったときに正しいチャンネルを見ている必要があり、2/3の確率で別のチャンネルを見ている可能性があります。
接続を捕捉し、接続後のデータ交換を確認するためには、スニファーとペリフェラルデバイスとセントラルデバイスの間でチャンネルが揃うまで、何度か接続する必要があります。

接続に失敗したときのやり直し方ですが、セントラルデバイスとの接続を切って、もう一度接続するでOKです。スマホの場合は、完全にアプリを停止する(バックグラウンドにある場合は消す)、起動して接続するといった感じです。

BLE Snifferの点滅パターン

公式な資料は見つけられてませんが、経験上、このような感じで点滅しています。

  • PCのUSBに接続しただけの状態の点滅パターン
  • WireSharkを起動したときの点滅パターン
  • (ペリフェラル)Deviceを選択した状態での点滅パターン
  • セントラルデバイス(スマホとか)とペリフェラルデバイスがペアリング状態になったときの点滅パターン

Discussion