BLE Sniffer + Wireshark で BLE パケットをスニッフィングする

 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

f:id:akanuma-hiroaki:20180407194943j:plain:w450

 スイッチサイエンスにも掲載はありましたが在庫切れだったので、 mouser で購入しました。

https://www.mouser.jp/ProductDetail/Adafruit/2269?qs=%2fha2pyFadujCcMq4sbQCcNuQKfV2ZrTBUyTuH62%2f2DAJK9B%252b%2f1bGJ3muPYq2CyZ9

www.switch-science.com

ユーティリティのインストールなど

 基本的な使用手順は下記のイントロダクションページで紹介されています。

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 と連携することができるようになっています。

Wireshark · Go Deep.

 上記サイトからダウンロードしてインストールするのですが、 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 ディレクトリ内で下記のようなアイコンで表示されますので、起動します。

f:id:akanuma-hiroaki:20180403072004p:plain

 BLE Sniffer を接続していないと下記のような表示になります。

f:id:akanuma-hiroaki:20180403000143p:plain

 ここで BLE Sniffer を接続します。接続して少し待つとスニッフィングが始まり、アドバタイズメントを出しているデバイスのリストが表示されます。項目としては、デバイス名、MACアドレス、電波強度(RSSI)、アドバタイズ用の3つのチャネルそれぞれでのインターバルが表示されます。

f:id:akanuma-hiroaki:20180403010717p:plain

 デバイスリストの中から特定のデバイスについて詳しく見たい時には、そのデバイスを選択して Sniff Device をクリックします。

f:id:akanuma-hiroaki:20180407191901p:plain

 すると「Currently Sniffing」というフィールドの表示が追加になり、スニッフィング中のデバイスの情報が表示されます。

f:id:akanuma-hiroaki:20180403010958p:plain

 デバイスの情報までは確認できたので、パケットの状況を詳しく見るために、 Wireshark と連携してみます。 Capture to Wireshark ボタンをクリックします。

f:id:akanuma-hiroaki:20180407192235p:plain

 すると Wireshark が起動し、 スニッフィングしたパケットが Wireshark で表示されます。

f:id:akanuma-hiroaki:20180403011507p:plain

 起動時のデフォルトでは時系列で並んだ一番古いパケットの部分が表示されていますが、メニューの下記ボタンを押すことで常に最新のパケットが表示されるようにスクロールされます。

f:id:akanuma-hiroaki:20180407192436p:plain

 下側のペインではBLEパケットのさらに詳しい情報が表示されます。一つ目はフレームの詳細です。

f:id:akanuma-hiroaki:20180403011538p:plain

 二つ目は BLE Sniffer のメタデータです。

f:id:akanuma-hiroaki:20180403011601p:plain

 三つ目はデータリンク層の情報です。

f:id:akanuma-hiroaki:20180403011625p:plain

まとめ

 BLEデバイスを使うサービスを開発するときは、BLEデバイス側に問題があるのか、アプリ側に問題があるのかの切り分けが難しい場合がありますが、このツールを使うことでアドバタイズメントの状況や詳しいパケットの情報が見られるので、問題の切り分けがしやすくなりそうです。BLEでどういったパケットがどういう順番でやり取りされるかを知らないと見てもわからない部分もありますが、逆にそれを理解するためにもこういったツールは有効かと思います。