Bluetooth通信データ解析

既製品のスマートウォッチとスマートフォンの間では、どのような通信がされているか不明なため、解析を行なった. 解析したのは、スマートウォッチとそのメーカーが出しているアプリ間での通信ログ.

Bluetooth通信のイメージ

Bluetoothで通信する場合に、必要な情報は

  • デバイスのMACアドレス
  • サービスのUUID
  • キャラクタリスティックのUUID

の3つで、これらが分かればFlutterのBluetooth通信パッケージで通信ができる.

データのやりとり

スマートフォン→デバイス

  • データを送る場合はスマートフォンからwrite requestを送る.

デバイス→スマートフォン

  • データを送ってほしい場合は、スマートフォンからread requestを送ることで、デバイスからのread responseでデータを得ることができる.
  • デバイスのキャラクタリスティックをnotifyに設定することで、read requsetを送らなくても、端末からデータを定期的に得ることができる.

解析手順

  1. スマートフォンでBluetoothのログを取れるように設定する.
  2. ログ収集開始
  3. 測定したい機能を使用する. (今回は心拍測定モード)
  4. 通信ログの回収と解析

Bluetooth通信ログの取り方

今回はAndroidスマートフォンとMac PCを利用して通信ログを取得した.

Androidの設定

  1. 設定>システム>詳細設定>開発者向けオプション の中のBluetooth HCIスヌープログを有効にする. (Androidによっては開発者向けオプションが表示されていないことがある.その場合説明書に従って表示されるようにする.)
  2. その後Bluetoothをonにする. (既にonになっている場合は一度offにする)

Mac PCの設定

  1. Android Studioのインストールを行う.(https://developer.android.com/studio)
  2. adbコマンドを使えるようにするために、パスを通す.
    Android Studioのインストールをデフォルト設定で行なっている場合は、
    /Users/ユーザ名/Library/Android/sdk/platform-tools
    のパスを通せばよい.
  3. ターミナルでadbと入力しadbコマンドが使用できることを確認する.

Wiresharkのインストール

  • androidが収集したBluetooth通信ログはそのままでは見ることが出来ないので、Wiresharkを使用してログを確認する.
  • Wiresharkのダウンロード(https://www.wireshark.org/download.html)

スマートフォンとスマートウォッチでBluetooth通信を行う

  • 通信する時には解析したい通信が起こるように操作を行う.
    今回は心拍数のデータを得たかったので心拍数測定モードを起動して、心拍数を測定し、スマートフォンで心拍数が表示されるようにした.

adbコマンドの実行

  1. ターミナルで
      adb bugreport
    と入力し、スマートフォンからBluetooth通信ログを持ってくる
  2. コマンドを実行すると、実行したディレクトリ下にzipファイルが生成されるので、それを展開する.
  3. 展開したディレクトリ>FS>data>misc>bluetooth>logs に拡張子がcfaのファイルがある. これがbluetoothの通信ログとなる.
  4. cfaファイルをWiresharkで開き、通信ログを確認する.

通信ログの見方

protocolがATTでBluetoothデバイスのMACアドレスと通信しているログを探す.
そのログをクリックして通信内容を確認する.
重要となるのは

  • UUID : 通信データを管理するID. サービスとキャラクタリスティックでそれぞれUUIDが必要となる
  • value : 通信データの内容
  • 通信の種類

の3つであり、これらを見れば通信を理解できる.

重要な通信の種類

write requestデータの送信要求スマートフォンからデバイスにデータを送る場合に使用される
read response返信デバイスからスマートフォンにデータを送る場合に使用される(スマートフォンが欲しいデータを送る)
handle value notificationデータ送信デバイスからスマートフォンにデータを送る場合に使用される(デバイスからスマートフォンに一方的にデータを送る)

スマートウォッチのログ解析例

Wiresharkを使用した場合、以下のような結果が得られる.

通信ログの赤枠内に注目すると、スマートウォッチの通信は

  1. スマートフォン(AQUOS)からスマートウォッチ(ID205)にwrite request
  2. スマートウォッチからスマートフォンにwrite response
  3. スマートウォッチからスマートフォンにhandle value notification

となっている. 今回使用したスマートウォッチはこの通信手順で情報をやりとりしている.

続いて通信ログの青枠内に注目する. 青枠内はスマートウォッチのwrite requestのATT protocolの内容を示しており、重要なのは

  • service UUID 0x0af0
  • UUID 0x0af6
  • value 02a0

である. この情報がサービスのUUIDとキャラクタリスティックのUUIDであり、このUUIDを使用して送信したデータがvalueの0x02a0である. (これらの値は16進数で著されていることには注意が必要)

そしてhandle value notificationを見ると以下のようになっている.

青枠内に注目すると

  • service UUID 0x0af0
  • UUID 0x0af7
  • value 02a00000000000000000000000000000000045 

となっている.
この情報を使用し、他の通信ログと相違点を見つけ、スマートウォッチとの通信ログの解析を行なった.
その結果以下のように通信していることが分かった.

この解析結果を利用し、Flutterでアプリケーションの開発を行なった.

コメントする