nRF Sniffer for Bluetooth LE でデータ解析

はじめに

BLE の通信データを容易に解析できる環境の構築方法についてまとめてみました。Nordic社製の BLE の開発キットとソフトウェアで実現できます。
より、複雑な通信データを解析するのであれば専用機で試してみて下さい。

【nRF Sniffer for Bluetooth LE について】
Nordic社から提供されている BLE Sniffer です。同社の開発環境に提供されているファームウェアと、Python で書かれているプログラムを使用することで BLE の通信データの解析を可能にします。また、BLE デバイスを安価な開発ボードで対応することができます。
Wireshark のプラグインとして提供されているため、Wireshark でのネットワーク通信データ解析と同じように BLE のデータの解析を可能にしています。
詳細については、以下の Nordic社の公式ページをご参照下さい。
https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Sniffer-for-Bluetooth-LE

動作環境

【PC】
PC は Windows / macOS / Linux 環境で動作します。今回は、macOS と Ubuntu での環境構築を記述しています。(※利用するには管理者権限が必要です)
【BLE ハードウェア】
Nordic社の BLE 開発キットを使用します。

https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Sniffer-for-Bluetooth-LE
ただし、サードパーティ製の互換ボードでも動作します。例えば、Adafruit社製の nRF51 Dongle 互換ボードの価格は 3,000円以下で、Sniffer のファームウェアが導入済みで販売されています。
https://www.adafruit.com/product/2269
【ソフトウェア】
Wiresharkをインストールし、加えて nRF Sniffer の動作環境となる Python3 とパッケージ(pySerial) が必要になります。

  • Wireshark
  • Python3 + pySerial
  • nRF Sniffer

nRF Sniffer は以下の公式サイトからダウンロードしてください。
https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Sniffer-for-Bluetooth-LE/Download#infotabs

BLE ハードウェアの準備

まず、BLE 開発キットに Sniffer のバイナリを書き込みます。
各 OS に対応している nRF Connect for Desktop をインストールしてください。
nRF Connect for Desktop (macOS)
https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF-Connect-for-Desktop/3-4-2/nrfconnect342.dmg
nRF Connect for Desktop (Linux)
https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF-Connect-for-Desktop/3-4-2/nrfconnect342x8664.AppImage

※ nRF Connect for Desktop は Nordic社の BLE, Cellular IOT 向けのクロスプラットフォーム開発環境です。Windows, macOS, Linux に対応していて、プラットホームを意識することなく開発を行うことを可能にしています。

次に、nRF Connect を起動して Programmer をインストールします。

“Install” をクリックするとインストールされボタンが Open に変わります。右の ▼ で詳細情報を表示、ショートカットの作成などができます。

※ Programmer は直接デバイスへバイナリを書き込みするツールです。nRF5x デバイスの flash を削除したり、書き込みやリセットしたりすることができます。また、GUI ベースで各アドレスに書き込みされているデータを読み込みすることもできるようになっています。

最後に、Programmer の ”Add HEX file” から開発キットに対応したバイナリファイルを書き込みます。

“Select device” をクリックしてデバイスを選択して、Erase & Write で書き込みを行います。詳細は開発キットをご参照下さい。DFU モードで起動して書き込む方法と、J-Link Lite に接続してデバッグピンから書き込む方法があります。

※ pcaXXXXX は開発キットのボード名です。ダウンロードした nRF Sniffer のファイル中に存在するバイナリファイル開発キットに書き込みして nRF Sniffer 対応デバイスを準備します。

PC ソフトウェアの準備

【macOS】
環境構築を容易にしたいので Homebrew を利用します。
下記の環境構築をスクリプトで実行します(これで環境一式を準備することが出来ます)。

  • Wireshark のインストール
  • pySerial のインストール
  • nRF Sniffer の必要ファイルを展開して Wireshark のプラグインの PATH へ配置

【Ubuntu 18】
環境構築を容易にしたいので Script を利用します。
下記の環境構築をスクリプトで実行します(これで環境一式を準備することが出来ます)。

  • Wireshark のインストール
  • pip3 のインストール、アップグレード
  • pySerial のインストール
  • ユーザーを dialout に追加
  • nRF Sniffer の必要ファイルを展開して Wireshark のプラグインの PATH へ配置

解析の実行方法

まず Wireshark を起動します。正しく認識した場合には “nRF Sniffer for Bluetooth LE” が表示されるので選択してください。

認識されていると上図の青くハイライトされているところのように “nRF Sniffer for Bluetooth LE:/dev/cu.SLAB_USBtoUART” と表示されます。

※ 下記のような問題があると認識されないので、Wiresharkで表示されない場合は確認してみて下さい。

  • 開発機キットが nRF Sniffer として動作していない
  • Python3, pySerialがインストールされていない
  • ユーザーに dialout の権限がない

次に、nRF Sniffer for Bluetooth LE Toolbar の設定を行います。
“View” から “Interface Toolbars” 配下の “nRF Sniffer for Bluetooth LE” を選択し、ツールバーを表示させます。


続いて、デバイス通信データを解析していきます。まず、ツールバーからデータを解析したいデバイスを選択します。


すると、CONNECT_REQ のデータが下記のように表示され、パケットデータを確認することができます。

選択されたデバイスはそれ以後、Master, Slave 間のやり取りとしてパケットデータを確認できます。
また、アナライザーでは以下の図のようにデータが表示されます(以下の図は Silicon Labs社の Thunderboard を接続した時のデータです)。

最後に

このように、Wireshark のブラグインのため容易にデータ解析を行うことができました。取得したいデータについてもWireshark のフィルタを利用すれば欲しいデータのみを摘出することが簡単に行えるので試してみて下さい。
一方、「多数のデバイスが存在している環境下では、対象のデバイス選択が行いにくい」という点や「時々、パケット取得できない場合がある」という点は注意が必要かもしれません。ちなみに、パケットが取得できなかった時は、ボードを再起動してみてください。
詳細については以下のリンク先にある Nordic社のドキュメントをご参照ください。
https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Sniffer-for-Bluetooth-LE

関連記事

  1. アジャイル ~壁を乗り越える~【第2回 改善のフレームワーク】

  2. アジャイル ~壁を乗り越える~【第3回 壁を乗り越える】

  3. Windows でも BLE を扱うことは可能か?〜できるかどうかやっ…

  4. Azure Functions に挑戦!(Node.js から SQL…

  5. まだ席空いてる?圧力センサーを使った空席確認システム

  6. 知識ゼロで Unity をはじめてみた【その4 -キー入力-】