【Android】Bluetooth HCIスヌープログの取り方

# はじめに
BluetoothのHCIスヌープログを取得する方法をまとめました。確認はPixel 4a(Android 13)で行いました。他のOSバージョン、他の機種では画面や手順が異なる場合がありますのご注意ください。

Linuxで取得する方法もあります → https://qiita.com/KentaHarada/items/8eeb7ada6ae974e44a3b

# Bluetooth HCIスヌープログとは？
HCI(Host Controller Interface)はBluetoothのプロトコルの一種で
BluetoothプロトコルスタックとBluetoothのチップ間のプロトコルです。
エアーを飛んでいるパケットとは違いますが、高価なアナライザー不要である程度の解析ができます。

<img width="726" alt="スクリーンショット_2020-05-04_15_30_20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/62ab7869-086e-c4f3-eab7-732ffd4c2e63.png">

# どんな時に使うの？
AndroidアプリとBluetoothデバイスの接続不良など、問題の解析に使うことが多いです。アプリではBluetoothの細かい切断理由や、どちら側から切断されたのか？が分からないことがあります。そういった時に、切断理由や切断元を特定するために用いると便利です。

# 確認環境
- MacBook Pro (13-inch, 2020) macOS Monterey 12.6.1
- Pixel4a(Android 13)
- Wireshark Version 3.2.3

# 1. Wiresharkをインストールする
Wiresharkでログを解析するので、先にインストールしておきます。
[Wireshark の使い方](https://qiita.com/nlog2n2/items/06f7604ea9e34424b401)

# 2. Android端末の開発者モードをONにする
[設定] > [デバイス情報] > [ビルド番号] を 7 回タップすると開発者モードに入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/a4feda6c-1a20-0de8-5350-17b8a1988286.png)

# 3. Bluetooth HCIスヌープログをONにする
[設定] > [システム] > [開発者向けオプション]
`Bluetooth HCIスヌープログをON`を選択する。
![スクリーンショット 2023-05-20 18.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/f8cdfcb6-dcf8-3929-5080-f7ec47b4e295.png)

次のダイアログで `有効` を選択する。
![スクリーンショット 2023-05-20 18.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/4739019a-961f-e0c7-cdd6-3913d7739ce9.png)

**注意！** 必ず`有効`を選択してください。
`有効(フィルタ済み)`を選択するとデバイスとのデータ送受信のログがフィルタリングされて肝心の通信部分のログが見えません。
例えば、Bluetooth Low Energyの場合はGATT通信部分(Write/Notify/Indicate等)がフィルタリングされて見えなくなります。


# 4.Bluetoothをオフ・オンする
Bluetoothを一度オフしてからオンにします。
こうすることでHCIスヌープログが有効になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/9c4768ad-9449-ea08-bbcf-cdfb19179dc4.png)


# 5. ログを取りたいBluetoothの操作を行う

Android端末とBluetooth機器を使って目的のログを取るための操作を行います。

# 6. バグレポートを生成する
[設定] > [システム] > [開発者向けオプション] > `[バグレポート]`を選択する。
![スクリーンショット 2023-05-20 18.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/c6ae09d0-72c1-ecc8-0910-500a4738d4ed.png)

`対話型レポート`を選択する。(完全レポートでもOKみたいです)
![スクリーンショット 2023-05-20 18.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/3e764212-70ff-78f2-f0de-d9b4bf65a30c.png)

`生成中`の通知が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/e007c8d6-924e-9324-0a8a-2c32436802c2.png)

しばらく時間がかかるので、２〜３分待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/f45783b5-751d-65a7-30c9-74edbaf45c76.png)

バグレポートの生成が完了したら、この通知をタップして共有(メール等)します。




# 7.バグレポートのZIPファイルを展開する
HCIスヌープログは `FS/data/misc/bluetooth/logs` に入っています。
![スクリーンショット 2020-05-04 15.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/702793b2-2538-64a3-e32e-e6edb5562e1f.png)


# 8. Wiresharkでログを解析する
`btsnoop_hci.log`をWiresharkで開いてログを解析します。
細かい解析方法についてはBluetooth SIGが公開しているスペックを参照してください。
![スクリーンショット 2020-05-04 15.17.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102273/bc8d3a1c-a744-6f76-57cf-362b3bba65b2.png)

# 参考
https://source.android.com/docs/core/connect/bluetooth/verifying_debugging?hl=ja
https://developer.android.com/studio/command-line/dumpsys?hl=ja