对于蓝牙开发者来说,通过HCI log可以帮助我们更好地分析问题,理解蓝牙协议,就好像网络开发一定要会使用Wireshark分析网络协议一样。
本篇主要介绍HCI log的作用、如何抓取一份HCI log,并结合一个实际的例子来说明如何分析HCI log。
HCI log是用来分析蓝牙设备之间的交互行为是否符合预期,是否符合蓝牙规范。在日常的开发中,通常使用HCI log来做这样几件事:
说了这么多HCI log的用处,要想更好地理解HCI log,我们需要先来看下HCI在整个蓝牙核心系统架构中所处的位置。为了理解起来更简单,我这边将蓝牙核心系统架构抽象为3层:
抽象后的蓝牙架构
完整的蓝牙核心系统架构比较复杂,这里我们就不再深入,感兴趣的同学可以参考蓝牙规范Core_v4.2.pdf,里面有详细的定义和介绍。我们后面在分析HCI log时,也会参考这个规范中定义的内容。
完整的蓝牙架构
在开发者选项中打开启用蓝牙HCI信息收集日志开关,Android系统就开始自动地收集HCI log并保存到手机上。
启用蓝牙HCI信息收集日志
不同的平台存放HCI log的路径会不一样,MTK 存放HCI log的路径为 /data/misc/bluetooth/logs/BT_HCI_2023_1130_111738.cfa
如果上面提到的路径下都没有HCI log,我们还可以通过手机上的蓝牙配置文件bt_stack.conf来查看路径,bt_stack.conf位于/system/etc/bluetooth/bt_stack.conf 路径下。HCI log路径通过BtSnoopFileName=/sdcard/btsnoop_hci.log来进行设置的
而bt_stack.conf是通过Android源码中的/system/bt/conf/bt_stack.conf来配置的。
将抓取到的HCI log pull出来,直接用记事本打开,看到的都是乱码。我们还需要一个HCI log分析工具:Frontline ComProbe Protocol Analysis System
Frontline ComProbe Protocol Analysis System是Frontline提供的一款蓝牙协议log分析工具,Frontine这家公司主要是做抓取蓝牙Air sniff log设备的,我们后面再来说下什么是Air sniff log。购买他们的抓包工具就会附带log分析工具,也可以在Frontine官网上下载,下载的时候需要填一些信息,觉得麻烦的同学可以去其他非官网途径进行下载。
安装完成后,在开始菜单中找到Frontline ComProbe Protocol Analysis System,使用Capture File Viewer可以打开HCI log
ComProbe Protocol Analysis System
Step 1. 首先,选择要打开的HCI log,并选择log类型为BtSnoop Files,即以*.log结尾的文件。
还有一种方式是将btsnoop_hci.log的后缀修改为btsnoop_hci.cfa,就可以直接用Capture File Viewer打开。
Step 1. 打开的HCI log
选择log类型
Step 2. 打开log文件后,选择Frame Display就可以看到我们抓取的HCI log了
Setp2. 选择Frame Display
Frame Display 主界面
Step3. Frame Display 窗口中有很多Tab,将协议栈中各类协议分类显示,例如:HCI相关的log放在HCI的Tab中,Hands-Free(HFP)属于应用层的Bluetooth Profile,和HFP相关操作的log都放在Hand-Free这个Tab中。
调试蓝牙音频的时候,需要分析A2DP和AVRCP等
Frame Display
Android 设备上抓取的HCI log 只能分析Host 和 Controller 之间的问题,当 Host 和 Controller之间交互是正常的,那就可能就是传输的过程中(Air Interface)出了问题,此时就需要分析 Air sniff log,Air sniff log 能够抓取两个蓝牙设备在数据传输过程中的空中包,抓取 Air sniff log需要专门的设备。
Air sniff log