背景

针对APP的蓝牙通信,客户要求对应出现的BUG,获取HCI log并进行分析

简介

蓝牙的 HCI Log(Host Controller Interface Log)是一个用来记录蓝牙通信过程中的底层信息和事件的日志文件。

它对开发者和调试人员来说非常重要,帮助他们了解蓝牙设备在通信过程中的内部状态和操作。

HCI概述

HCI(Host Controller Interface)(主机控制接口)是蓝牙协议的一种,
它是蓝牙协议栈与蓝牙芯片之间的协议。

虽然它与空中传输的封包不同,但无需昂贵的分析仪,也能进行一定程度的解析。

HCI是蓝牙协议栈中主机(Host)和控制器(Controller)之间的通信接口。它提供了主机与蓝牙硬件之间进行数据交换和控制的机制。具体来说,HCI分为两个部分:

  1. HCI命令:主机通过这些命令向控制器发送请求,控制器根据请求执行相应操作(如设备连接、断开连接、设备扫描等)。

  2. HCI事件:控制器在执行操作时,向主机发送事件,告知主机操作的结果和当前状态。

为了理解起来更简单,将蓝牙核心系统架构抽象为3层:

  1. User Application(Host)

User Application即应用层,也被称为Host,我们调用Bluetooth API就属于应用层,例如,BluetoothAdapter中提供的接口。

  1. HCI (Host controller Interface)

上层在调用蓝牙API时,不会直接操作蓝牙底层(Controller)相关接口,而是通过HCI下发对应操作的Command给Controller,然后底层执行命令后返回执行结果,即Controller发送Event给HCI,HCI再通知给应用层,HCI起到了一个中间层的作用。

  1. Controller

Controller是在最底层,可以理解为我们手机上的蓝牙芯片。

HCI Log 的作用

HCI Log 是记录和分析这些命令和事件的一种工具。

在分析Android应用程序与Bluetooth设备连接问题时,这个工具非常有用。

应用程序通常无法明确显示Bluetooth连接断开的详细原因,或者无法判断是从哪一方断开的连接。

在这种情况下,使用该工具来识别断开的原因和断开源非常方便。

HCI Log 记录的内容

HCI Log 会记录以下类型的信息:

  1. HCI命令:包括命令的发送时间、命令类型、参数等信息。

  2. HCI事件:包含事件的发生时间、事件类型、相关数据(如连接状态、设备地址、信号强度等)。

  3. 数据包交换:记录从主机到控制器、控制器到主机的数据包,帮助分析数据传输的可靠性。

  4. 错误信息:如果在蓝牙通信过程中发生错误,HCI Log 会记录相关的错误代码和描述。

HCI Log 的使用场景

  • 调试:当蓝牙设备出现连接问题、通信中断或设备不响应时,开发者可以查看 HCI Log 来排查问题,找出发生错误的原因。

  • 性能分析:开发者可以通过 HCI Log 评估蓝牙设备的性能,例如连接时间、数据传输速度等。

  • 设备兼容性:HCI Log 可以帮助检测设备之间的兼容性问题,例如不同厂商的蓝牙设备在通信时是否存在不兼容的情况。

获取 HCI Log

获取 HCI Log 的方式取决于使用的操作系统和工具。常见的获取方式有:

  • Android 设备上,开发者可以通过启用开发者选项中的蓝牙日志来获取 HCI Log。

  • Linux 上,使用 hcidumpbluetoothd 等工具来抓取 HCI Log。

  • WindowsmacOS 中,可以通过蓝牙开发工具或特定的调试工具(如Wireshark)来获取相关的 HCI 数据。

获取 HCI Log(Android)

  1. 进入【设置】 > 【设备信息】 > 连续点击【版本号】7次,即可进入开发者模式。

  1. 将 Bluetooth HCI 嗅探日志开启

[设置] > [系统] > [开发者选项]

选择开启 Bluetooth HCI 嗅探日志。

注意! 请务必选择“有效”!

选择“有效(已过滤)”时,设备之间的数据发送接收日志会被过滤掉,重要的通信部分的日志将无法查看。

例如,在蓝牙低能耗(Bluetooth Low Energy)情况下,GATT通信部分(如写入/通知/指示等)会被过滤掉,无法查看。

  1. 重启蓝牙模块

将蓝牙关闭后再打开。
这样可以启用HCI嗅探日志。

  1. 进行蓝牙操作以获取日志

使用Android终端和蓝牙设备进行操作,以获取所需的日志。

  1. 生成错误报告

选择 [设置] > [系统] > [开发者选项] > [错误报告]

选择“对话型报告”(完全报告也可以,但需要等更久)


スクリーンショット 2023-05-20 18.48.34.png
这将花费一些时间,稍等2到3分钟。

image.png

完成生成错误报告后,请点击此通知并分享(如通过电子邮件等)。

image.png

解压后进入路径

/FS/data/misc/bluetooth/logs

使用Wireshark解析

打开 btsnoop_hci.log 文件并使用 Wireshark 进行日志分析。

关于详细的分析方法,请参考 Bluetooth SIG 发布的规格文档。

参考文章

https://qiita.com/KentaHarada/items/42ed619e8f571d1de845https://qiita.com/KentaHarada/items/8eeb7ada6ae974e44a3b

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