既製品のスマートウォッチとスマートフォンの間では、どのような通信がされているか不明なため、解析を行なった. 解析したのは、スマートウォッチとそのメーカーが出しているアプリ間での通信ログ.
Bluetooth通信のイメージ
Bluetoothで通信する場合に、必要な情報は
- デバイスのMACアドレス
- サービスのUUID
- キャラクタリスティックのUUID
の3つで、これらが分かればFlutterのBluetooth通信パッケージで通信ができる.
データのやりとり
スマートフォン→デバイス
- データを送る場合はスマートフォンからwrite requestを送る.
デバイス→スマートフォン
- データを送ってほしい場合は、スマートフォンからread requestを送ることで、デバイスからのread responseでデータを得ることができる.
- デバイスのキャラクタリスティックをnotifyに設定することで、read requsetを送らなくても、端末からデータを定期的に得ることができる.
解析手順
- スマートフォンでBluetoothのログを取れるように設定する.
- ログ収集開始
- 測定したい機能を使用する. (今回は心拍測定モード)
- 通信ログの回収と解析
Bluetooth通信ログの取り方
今回はAndroidスマートフォンとMac PCを利用して通信ログを取得した.
Androidの設定
- 設定>システム>詳細設定>開発者向けオプション の中のBluetooth HCIスヌープログを有効にする. (Androidによっては開発者向けオプションが表示されていないことがある.その場合説明書に従って表示されるようにする.)
- その後Bluetoothをonにする. (既にonになっている場合は一度offにする)
Mac PCの設定
- Android Studioのインストールを行う.(https://developer.android.com/studio)
- adbコマンドを使えるようにするために、パスを通す.
Android Studioのインストールをデフォルト設定で行なっている場合は、
/Users/ユーザ名/Library/Android/sdk/platform-tools
のパスを通せばよい. - ターミナルでadbと入力しadbコマンドが使用できることを確認する.
Wiresharkのインストール
- androidが収集したBluetooth通信ログはそのままでは見ることが出来ないので、Wiresharkを使用してログを確認する.
- Wiresharkのダウンロード(https://www.wireshark.org/download.html)
スマートフォンとスマートウォッチでBluetooth通信を行う
- 通信する時には解析したい通信が起こるように操作を行う.
今回は心拍数のデータを得たかったので心拍数測定モードを起動して、心拍数を測定し、スマートフォンで心拍数が表示されるようにした.
adbコマンドの実行
- ターミナルで
adb bugreport
と入力し、スマートフォンからBluetooth通信ログを持ってくる - コマンドを実行すると、実行したディレクトリ下にzipファイルが生成されるので、それを展開する.
- 展開したディレクトリ>FS>data>misc>bluetooth>logs に拡張子がcfaのファイルがある. これがbluetoothの通信ログとなる.
- cfaファイルをWiresharkで開き、通信ログを確認する.
通信ログの見方
protocolがATTでBluetoothデバイスのMACアドレスと通信しているログを探す.
そのログをクリックして通信内容を確認する.
重要となるのは
- UUID : 通信データを管理するID. サービスとキャラクタリスティックでそれぞれUUIDが必要となる
- value : 通信データの内容
- 通信の種類
の3つであり、これらを見れば通信を理解できる.
重要な通信の種類
write request | データの送信要求 | スマートフォンからデバイスにデータを送る場合に使用される |
read response | 返信 | デバイスからスマートフォンにデータを送る場合に使用される(スマートフォンが欲しいデータを送る) |
handle value notification | データ送信 | デバイスからスマートフォンにデータを送る場合に使用される(デバイスからスマートフォンに一方的にデータを送る) |
スマートウォッチのログ解析例
Wiresharkを使用した場合、以下のような結果が得られる.
通信ログの赤枠内に注目すると、スマートウォッチの通信は
- スマートフォン(AQUOS)からスマートウォッチ(ID205)にwrite request
- スマートウォッチからスマートフォンにwrite response
- スマートウォッチからスマートフォンに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でアプリケーションの開発を行なった.