BLE デバイスを使ったシステムを開発していると、BLE デバイスがどんな状態かを確認したいことが時々あります。アドバタイズメントを出しているかは LightBlue などのツールでも確認できますが、通信状態の詳細はわかりませんし、接続後の状態は接続しているデバイス側でデバッグ用の対応を入れる必要があります。
そこで今回は、 BLE Sniffer を使ってみました。BLE Sniffer を使うと周囲のBLEデバイスの通信状況を確認することができますし、 Wireshark と連携することでさらに詳しくパケットを確認することができます。
今回使ったのは Adafruit の Blueftuit LE Sniffer です。
Bluefruit LE Sniffer - Bluetooth Low Energy (BLE 4.0) - nRF51822 - v3.0
https://www.adafruit.com/product/2269
スイッチサイエンスにも掲載はありましたが在庫切れだったので、 mouser で購入しました。
ユーティリティのインストールなど
基本的な使用手順は下記のイントロダクションページで紹介されています。
Introducing the Adafruit Bluefruit LE Sniffer
https://learn.adafruit.com/introducing-the-adafruit-bluefruit-le-sniffer
Windowsユーザの方であれば上記ページにて紹介されている手順通りに Nordic の公式ユーティリティをインストールして使用できるのですが、 Mac には対応していないので、 Mac ユーザ向けのページが別途用意されています。
OS X Support
https://learn.adafruit.com/introducing-the-adafruit-bluefruit-le-sniffer/os-x-support
上記ページで Roland King さん提供の OS X 用のユーティリティが紹介されていますので、こちらを使用します。
nrf-ble-sniffer-osx
https://sourceforge.net/projects/nrfblesnifferosx/
インストール手順や使用方法は上記プロダクトの Wiki ページに記載されていますので、そちらに従います。
https://sourceforge.net/p/nrfblesnifferosx/wiki/ble_sniffer/
インストールはプロダクトのページからパッケージインストーラをダウンロードして実行するだけです。
ble-sniffer-osx Download
https://sourceforge.net/projects/nrfblesnifferosx/files/latest/download
Wireshark のインストール
BLE Sniffer 単体で利用してもある程度の利用状況はわかるのですが、パケットアナライザを使うことでより詳細にパケットの状況を確認することができます。 Bluefruit LE Sniffer では Wireshark と連携することができるようになっています。
上記サイトからダウンロードしてインストールするのですが、 Bluefruit LE Sniffer の OS X Support ページには下記のように記載があります。
Be sure to download Wireshark version 2.0.x NOT the new 2.2.7 that was released June 2017
Wireshark の新しいバージョンではなく、 2.0系を使うようにということなので、下記から過去のバージョンを探します。
Wireshark All Versions
Index of /pub/network/security/wireshark/osx/all-versions
2.0系の最新バージョンは 2.0.16 のようなので、こちらをダウンロードしてインストールします。
Wireshark 2.0.16 Intel 64.dmg
http://ftp.yz.yamagata-u.ac.jp/pub/network/security/wireshark/osx/all-versions/Wireshark%202.0.16%20Intel%2064.dmg
下記のように tshark コマンドが使えるようになっていれば正しくインストールされています。
$ tshark -v TShark (Wireshark) 2.0.16 (v2.0.16-0-gd60ab50 from refs/heads/master-2.0) Copyright 1998-2017 Gerald Combs <gerald@wireshark.org> and contributors. License GPLv2+: GNU GPL version 2 or later <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled (64-bit) with libpcap, without POSIX capabilities, with libz 1.2.5, with GLib 2.36.0, with SMI 0.4.8, with c-ares 1.12.0, with Lua 5.2, with GnuTLS 3.4.17, with Gcrypt 1.7.7, with MIT Kerberos, with GeoIP. Running on Mac OS X 10.13.3, build 17D102 (Darwin 17.4.0), with locale C/UTF-8/C/C/C/C, with libpcap version 1.8.1 -- Apple version 79.20.1, with libz 1.2.11, with GnuTLS 3.4.17, with Gcrypt 1.7.7. Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz (with SSE4.2) Built using llvm-gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00).
スニッフィング実行
必要なもののインストールが終わったので、スニッフィングを実行してみたいと思います。ユーティリティは Applications ディレクトリ内で下記のようなアイコンで表示されますので、起動します。
BLE Sniffer を接続していないと下記のような表示になります。
ここで BLE Sniffer を接続します。接続して少し待つとスニッフィングが始まり、アドバタイズメントを出しているデバイスのリストが表示されます。項目としては、デバイス名、MACアドレス、電波強度(RSSI)、アドバタイズ用の3つのチャネルそれぞれでのインターバルが表示されます。
デバイスリストの中から特定のデバイスについて詳しく見たい時には、そのデバイスを選択して Sniff Device
をクリックします。
すると「Currently Sniffing」というフィールドの表示が追加になり、スニッフィング中のデバイスの情報が表示されます。
デバイスの情報までは確認できたので、パケットの状況を詳しく見るために、 Wireshark と連携してみます。 Capture to Wireshark
ボタンをクリックします。
すると Wireshark が起動し、 スニッフィングしたパケットが Wireshark で表示されます。
起動時のデフォルトでは時系列で並んだ一番古いパケットの部分が表示されていますが、メニューの下記ボタンを押すことで常に最新のパケットが表示されるようにスクロールされます。
下側のペインではBLEパケットのさらに詳しい情報が表示されます。一つ目はフレームの詳細です。
二つ目は BLE Sniffer のメタデータです。
三つ目はデータリンク層の情報です。
まとめ
BLEデバイスを使うサービスを開発するときは、BLEデバイス側に問題があるのか、アプリ側に問題があるのかの切り分けが難しい場合がありますが、このツールを使うことでアドバタイズメントの状況や詳しいパケットの情報が見られるので、問題の切り分けがしやすくなりそうです。BLEでどういったパケットがどういう順番でやり取りされるかを知らないと見てもわからない部分もありますが、逆にそれを理解するためにもこういったツールは有効かと思います。