泰凌TLSR9系列芯片支持经典蓝牙和低功耗蓝牙5.3 各项核心规范,目前开发者可以基于泰凌提供的协议栈和参考设计,开发各种音频相关产品,其中包括:双模低延时TWS耳机、双模低延时头戴式耳机,双模蓝牙音响,双模蓝牙手表和穿戴类产品等。本文以泰凌双模低延时头戴式耳机为例,介绍开发产品时如何抓取、过滤、分析经典蓝牙相关Profile(以SPP为例),其他Profile也可通过类似分析SPP的方法进行分析。
在调试开发经典蓝牙相关产品的时候,往往需要分析Profile流程是否正确,发出的数据包格式是否正常。而市面上抓取BR/EDR数据的仪器往往比较昂贵,不像LE可以使用普通的Sniffer抓取。此时我们可以通过BT master 设备成生的HCI log 调试经典蓝牙。
1抓取HCI log
不同系统获取HCI log的方式有差异,手机可直接在调试模式下生成。本文主要介绍在Windows 环境下通过USB 蓝牙适配器抓取HCI log的方法。建议使用外部USB 蓝牙适配器,在禁用主板上的蓝牙适配器后,再使用Wire shark抓取外部的USB 蓝牙适配器。
为方便演示,我们在编译双模低延时Headset工程前(以下统称Headset),需要先使能 MY_BT_SPP_ENABLE,再将SPP的Service class ID设置为 0x1101(修改为图1所示即可)。
(图1)
修改完成后,将生成好的固件烧录到EVB(C1T213A20_V1.3),再进行如下动作:
1、打开Wire shark,将USBPcap1 设置为“Capture from newly connected device”;
2、插上USB 蓝牙适配器;
*注意:这两步很关键,否则可能抓取的数据无法解析,或者解析不完整。
执行完如上两步,可以看到蓝牙适配器已枚举完成(图2)。
(图2)
此时我们再双击 EVB上的SW5让Headset成为可发现状态,在蓝牙的搜索界面中,可以发现一个“Game Headset”的耳机设备。 连接完成后就可以在蓝牙设置中看到 Game Headset “Telink Serial_Port Service”(如图3)。
(图3)
在连接上设备,枚举到SPP串口后,可使用串口助手进行数据收发包。 对应的串口号为上(图3)所示COM8。
在进行音频播放、录音等一系列操作后,可以通过Wire shark 获取到完整的HCI log。 在正常使用时,一般是直接导出手机中的HCI log,此处仅为演示方便。
2过滤HCI log
抓取到HCI log后,使用Wire shark查找对应Profile的日志,我们可以用到Wire shark的过滤器过滤Profile。 常用的过滤关键字有 bta2dp、btatt、btavctp、btavdtp、btavrcp、bthfp、btsdp、btspp 等。
以HFP为例,当需要查看HFP中AG与HF的AT命令流程,可以通过 “bthfp” 过滤。 如下(图4)所示,在过滤器中输入“bthfp”再回车,即可显示“HFP”相关的所有数据包。
(图4)
由于HFP都是基于rfcomm的,如果我们也同时希望查看rfcomm 协议,只需要在过滤器里面将 HFP与rfcomm通过 “||” 连接即可。 更详细的使用方法可查看Wire shark的过滤器官方文档说明。
3分析HCI 数据包
Wire shark中所抓取的HCI CMD 、EVENT、 ACL、Synchronous 、ISO 等,都在 Core spec上有具体的规范(详可参考BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 4, Part E ),以其中一条为例,如(图5)所示:
(图5)
可以看到这是一包HCI ACL包,通过Core spec中描述的可知HCI数据包的前4个字节为ACL data packet的相关参数(图6)。
(图6)
而ACL packet Data部分的内容为L2CAP数据包,通过 DATA packet format(如图7)(BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 3, Part A page 1034 ) 可知HCI ACL data部分前两个字节为Length,后两个字节为Channel ID。Channel ID是在L2CAP Connect时分配的,可以看到Wire shark已提示这是建立的PSM为RFCOMM的L2CAP。而基于L2CAP的上层协议,Wire shark此时也已经解析完整了。
(图7)
关于Core spec、Profile、Protocol相关的更多内容可以通过如下链接获取到相关文档。
4使用HCI log 调试SPP
对于SPP的调试,可以通过如下方式进行:
1、在电脑连接上Headset后,通过(图3)得知SPP的串口号是 “COM8”;
2、使用串口工具打开“COM8”,波特率可以选择 1000000或115200;
3、使用串口工具发送几次“Telink SPP HCI debug Demorn”;
同时,我们也可以在TDB调试日志里面看到Headset收到的数据内容为:
这里的16进制数据转换为ASCII码后就是如上字符串。
4、抓取完HCI数据包后,通过 btrfcomm.channel == x 来过滤SPP包。这里的x是我们SPP的rfcomm channel,通过SDK代码“#define SPP_CFG_SERVER_CHANNEL 0x04”得知 channel为4;
5、过滤后得到的数据如下(图8)所示:
(图8)
综上,在对规范性文档有一定了解的基础上,配合HCI log,可以协助我们进行蓝牙协议相关的开发工作。 最为简单的就是流程对比,如果通过流程对比无果,再利用规范文档对流程进行正确性判断。 如何使用HCI log调试经典蓝牙的方法就讲到这里,欢迎大家评论指正!
审核编辑:汤梓红