AndroidBluetoothでbtsnoop.logを表示および分析する方法



How View Analyze Btsnoop



多くの人がBLEを実行する過程でこれらの問題に遭遇しました:

1)リモートデバイスから送信されたメッセージを受信しなかったのはなぜですか?



2)リモートデバイスから送信されたメッセージが、受信したメッセージと異なるのはなぜですか?

3)メッセージが公開されるのはなぜですか?



などなど。従来のlogd(汎用printf)に加えて、AndroidBluetoothに非常に重要なデバッグ方法がbtsnoop.logである理由を知りたい。

このログは、ホストとコントローラー間の通信の内容全体を記録し、Bluetoothプロトコルスタックの各層のメッセージ通信グラフを一覧表示します。このログはプロトコルスタック自体によって生成されるため、プロトコルスタックによって送受信されたメッセージのみが一覧表示されることに注意してください。 UARTドライバーのパケット損失による問題など、他の理由による場合は、他のログツールを使用して理由を見つける必要があります(uartスニファーなど)。

スヌープログはBluetoothで作成されたものではなく、SUNが発明したログ形式で、主にIEEE802のさまざまなログに適用されます。他のファイル、JPEG、MP3などと同様に、形式は固定されています。



興味のある学生は、以下のリンクにアクセスして、スヌープログの形式を確認できます。

http://www.fte.com/webhelp/FTS4BT/Content/Technical_Information/BT_Snoop_File_Format.htm

と同様

https://www.rfc-editor.org/rfc/pdfrfc/rfc1761.txt.pdf

おおまかに次のようになります。
画像

スヌープログファイル自体の形式については詳しく説明しません。これらの形式を知っていると、実際にbtsnoopパーサーを自分で作成できますが、別のホイールを作成する必要はありません。

WiresharkとFTEキャプチャファイルビューアの両方を使用して、btsnoopログを表示できます。

Wiresharkソフトウェアは次のWebサイトからダウンロードできます。

https://www.wireshark.org/download.html

効果は次のとおりです。
Wireshark btsnoop
または、BPA500のキャプチャファイルビューアソフトウェアをfteWebサイトからダウンロードして表示します。

http://www.fte.com/products/BPA500-download.aspx

効果は次のとおりです(最前線のビューアソフトウェアはもう少し直感的に見えます)。
最前線のbtsnoop
btsnoopを開くときは、右下隅のファイル形式を開くオプションを* .log形式にする必要があることに注意してください。
*。ログ

すべての準備が完了しました。btsnoopログがAndroid携帯からどのように取得されるかについて話しましょう。まず、携帯電話の開発者モードをオンにし(開く方法がわからない場合は、検索エンジンを使用して検索できます。Androidのいくつかのバージョンで連続クリックが何回必要かを覚えています)、開くことを選択しますBluetoothHCIログ。たとえば、作者はサムスンギャラクシー携帯電話を使用しています:
HCI(bluedroid btsnoop log)

この設定をオンにすると、通常の携帯電話はbtsnoopログを生成します。 ADBまたはファイルマネージャーに接続して、このファイルを検索できます。携帯電話の保管場所は、携帯電話のブランドやモデルによって異なります。

重要な質問は、このファイルの内容をどのように表示するかです。

まず、HCIの理論的知識を確認します。

HCIは厳密にはレイヤーの概念ではなく(L2CAPやRFCOMMなどと比較して)、ホストとコントローラー間のインターフェイスであり、これら2つのインターフェイス間で渡されるメッセージはHCIパケットと呼ばれることがあります。 HCIの「純粋な」データ形式は、データのフロー、つまりホストからコントローラーへ、またはその逆を定義しません。

ホストとコントローラーがメッセージを転送すると、各HCIパケットの前に、HCIデータのタイプを示すインジケーターが表示されるため、その方向を知ることができます。
HCIインジケーター

ここでは、1〜4のデータ型についてのみ説明します。

HCIコマンドパケット:ホストはコントローラーに送信します。主にHCIコマンドですが、データではなくコマンドであることに注意してください。

HCIイベントパケット:コントローラーはそれをホストに送信します。コマンドパケットに対応します。

HCI ACLデータパケット:ホストはコントローラーに送信します。その逆も同様です。これは主にL2CAPによって送受信されるデータです。上層のすべてのデータ。このタイプを介して渡されるのはコマンドではなくデータであることに注意してください。

HCI同期データパケット:音声(SCO)データの送信に使用されます。 SCOデータは通常PCMインターフェースを介して送信されることに注意してください。

名前の設定、マシンのBluetoothアドレスの読み取りなどの一部のコマンドの場合、これらはすべてHCIコマンドパケットを介して実行されます。次に例を示します。
HCI
コントローライベント
送受信される上位層のデータはすべて、ACLデータパケットタイプを介して行われます。次に例を示します。
GATTハンドル0a-0eハンドル
UUID

したがって、スタック自体によって送信されたデータ(実際にはコントローラーに送信しようとしている)、アプリからスタックに送信したデータ、スタックによって受信されたデータ、およびスタックに送信されたデータを前後に知ることができます。アプリ。それらが一貫しているかどうか、および欠落があるかどうか。

上記の2つのソフトウェアは、HCI、L2CAP、ATT、GATTの各層のコマンドとデータを明確にリストしています。これは、問題がどこにあるかを確認するのにも非常に便利です。

同様に、HFやPBAPなどのAndroidBluetoothの他のプロファイルをデバッグすると非常に便利です。

もちろん、これには、ログを理解できるように、プロトコルスタックの各層の基本的な理解が必要です。