Android BT HCI分析简介

    对于蓝牙开发者来说,通过HCI log可以帮助我们更好地分析问题,理解蓝牙协议,就好像网络开发一定要会使用Wireshark分析网络协议一样。

    本篇主要介绍HCI log的作用、如何抓取一份HCI log,并结合一个实际的例子来说明如何分析HCI log。

1.HCI log介绍

1.1 HCI log作用

HCI log是用来分析蓝牙设备之间的交互行为是否符合预期,是否符合蓝牙规范。在日常的开发中,通常使用HCI log来做这样几件事:

  • 分析Bug:蓝牙打开后搜索不到设备,或者搜索到的设备没有名称只有蓝牙地址;Android手机不能向苹果手机传输文件
  • 需求分析:手机需要适配一款蓝牙自拍杆来控制拍照,通过HCI log可以观察竞品在实现这个功能时,使用的是什么Bluetooth Profile?只要知道了使用的Bluetooth Profile,我们就有了实现这个功能的思路。
  • 蓝牙协议学习:通过HCI log辅助学习蓝牙协议,就好像学习TCP/IP时,通过wireshark抓包来学习TCP协议

1.2蓝牙核心系统架构

说了这么多HCI log的用处,要想更好地理解HCI log,我们需要先来看下HCI在整个蓝牙核心系统架构中所处的位置。为了理解起来更简单,我这边将蓝牙核心系统架构抽象为3层:

  • User Application(Host):User Application即应用层,也被称为Host,我们调用Bluetooth API就属于应用层,例如,BluetoothAdapter中提供的接口。
  • HCI (Host controller Interface):上层在调用蓝牙API时,不会直接操作蓝牙底层(Controller)相关接口,而是通过HCI下发对应操作的Command给Controller,然后底层执行命令后返回执行结果,即Controller发送Event给HCI,HCI再通知给应用层,HCI起到了一个中间层的作用。
  • Controller:Controller是在最底层,可以理解为我们手机上的蓝牙芯片。

抽象后的蓝牙架构

完整的蓝牙核心系统架构比较复杂,这里我们就不再深入,感兴趣的同学可以参考蓝牙规范Core_v4.2.pdf,里面有详细的定义和介绍。我们后面在分析HCI log时,也会参考这个规范中定义的内容。

完整的蓝牙架构

2.如何抓取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

3.HCI log分析工具

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

  • Air sniff log

Android 设备上抓取的HCI log 只能分析Host 和 Controller 之间的问题,当 Host 和 Controller之间交互是正常的,那就可能就是传输的过程中(Air Interface)出了问题,此时就需要分析 Air sniff log,Air sniff log 能够抓取两个蓝牙设备在数据传输过程中的空中包,抓取 Air sniff log需要专门的设备。

Air sniff log

4.HCI log 案例分析过程,后面单独列出来。

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:以下为主流安卓手机品牌以及iOS手机HCI日志抓取教程(亲测有效) Android HUAWEI/Honor 进入应用程序—>设置—>关于手机,连续点击版本,提示打开发者模式,并打开USB调试;进入“系统和更新”点击“开发者选项”菜单,打开“开启蓝牙HCI信息收集日志” ;尝试复现问题,关闭手机系统蓝牙;手机连接PC,保证adb可正常使用;执行 adb pull /data/log/bt <PC本地路径>;adb pull执行完成后,PC本地目标目录下产生bt文件夹;进入bt目录,按时间排序获取对应hci文件,命名格式:btsnoop_hci_xxxxxxxx.log; OPPO 进入设置,打开手机的开发者模式;在拨号界面*#80 0#,进入异常反馈界面,选择蓝牙异常项;点击红框设置项,改为开发者模式,然后返回点击开始抓取,选择为不重启方式抓取;此时开始复现问题,(抓取会自动关闭手机蓝牙,需手动再次打开),执行完毕选择结束抓取;等待生成日志文件,连接到电脑上,在如下目录查找 “.caf”后缀hci文件; \内部共享存储空间\oppo_log\ \内部共享存储空间\Android\data\com.coloros.logkit\files\Log\ MIUI 。 引用\[2\]:安卓手机抓取Btsnoop文件方法 安卓手机端设置 打开开发者选项:设置-系统-关于手机-点击版本号,直到手机提示已处于开发者模式进入开发人员选项,打开USB调试,仅充电模式下允许ADB调试,开启蓝牙HCI信息手机日志重新开关蓝牙,即可抓取HCI信息 。 引用\[3\]:准备工作 一台安卓手机(应该不需要root权限)wiresharkFrontline ComProbe Protocol Analysis System(CPAS) log文件获取 打开HCI侦听选项 在Android手机 设置->开发人员选项中开启USB调试并打开HCI侦听选项,如下图所示: 使用手机蓝牙和设备通讯 使用手机和蓝牙设备正常调试,这个时候的数据包会被记录到btsnoop_hci.log日志文件中,一般情况下在手机存储的根目录下 将该文件拷贝到PC上就可以使用专用软件分析log文件分析 。 三星手机抓取HCI的方法与其他安卓手机品牌类似。首先,您需要打开三星手机的开发者选项。您可以通过进入设置-关于手机-连续点击版本号来打开开发者模式。然后,进入开发者选项,打开USB调试和HCI侦听选项。接下来,重新开关蓝牙,手机会开始记录HCI信息。您可以通过连接手机到电脑上,将记录的HCI信息文件拷贝到电脑上进行分析。一般情况下,这些文件会保存在手机存储的根目录下,文件名可能是btsnoop_hci.log。您可以使用专用的软件来分析这些日志文件。 #### 引用[.reference_title] - *1* [手机HCI日志抓取教程](https://blog.csdn.net/rainyLYJ/article/details/128631231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [安卓手机抓取Btsnoop文件方法](https://blog.csdn.net/m0_52840067/article/details/121495727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [使用Android手机抓取蓝牙HCI包](https://blog.csdn.net/u014421520/article/details/109705204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值