未完待续…
前言
本文以EllisysBluetoothAnalyzer
工具为基础,主要介绍蓝牙数据包抓包分析。
学习使用蓝牙分析仪以及能够进行基本的数据包解析,有助于加快问题诊断与解决
- 分析蓝牙空中数据包流程,判断蓝牙实际状态是否符合程序设计预期
- 识别、排查通信问题,如丢包、重传、延迟等
- 界定问题对象,通过抓包分析是手机还是设备端的流程/兼容设计问题;比如音乐无声、音量同步、SIRI开关等
蓝牙分析仪工具配置与使用
主要分为以下几点:
- 硬件接好线后,上位机软件执行
Record
开始搜索监听 - 上位机配置过滤、选择指定目标设备进行监听
- 通过设备端或者手机端等方法,获取到目标设备蓝牙链路的Linkkey,在上位机
Security->Link Key
选项卡中输入Linkkey完成解密 - 保证正确解密以及抓包数据质量,通常需要抓取到设备之间从断开->连接->执行相应复现操作的全过程。
搜索、过滤与监听
配置工具搜索监听目标设备
添加监听的目标,设备与手机
暂略
Linkkey的获取与配置解密
经典蓝牙的数据包在传输过程中通常是加密的,以防止数据被未经授权的第三方窃听。在进行蓝牙通信问题的诊断时,需要查看具体的通信数据包内容,以确定问题的原因。例如,如果出现丢包、重传、延迟等问题,通过解密后的数据包可以更准确地定位问题。因此,需要使用 Linkkey 来解密数据包,从而获取明文内容。
Linkkey 是经典蓝牙用于加密和认证的重要安全参数,长度为16个字节(128位),用于保护蓝牙设备之间的通信安全。
示例如:01 23 45 67 89 AB CD EF 01 23 45 67 89 AB CD EF
Linkkey的获取:
从手机端获取 /data/misc/bluedroid/bt_config.conf
从设备端获取,根据厂商设计,可以通过调试接口获取。
比如,杰理方案的LinkKey
串口打印获取如下:
1 | extern u8 *get_last_device_connect_linkkey(u16 *len); |
将以上代码粘贴到sdk的任一可触发调用的位置即可(如通过按键触发调用),在蓝牙连接后,调用上述代码,则会打印当前最新连接设备对应的LinkKey。
上位机配置LinkKey
解密:暂略
蓝牙数据抓包质量要求
如何为有效数据包?
需要从连接过程、回连过程抓起
保证数据包解包正确,无错包。如何判断为有效解密?
一个正确的蓝牙抓包解密示例如下:
蓝牙数据包简单说明
蓝牙基带数据包格式与类型解析
问:什么是协议栈?
答曰:协议栈其实就是一堆代码。
所有的蓝牙通信(无论高层配置文件、低层控制等),通过层层封装,最终都是通过 Packet
包的形式进行发送和接收,从而实现空中数据传输。
从软件角度来看,蓝牙抓包分析,即通过这些空中数据包,逆向推导并分析双方的软件设计流程。
包结构组成:ACCESS CODE + HEADER + PAYLOAD
- ACCESS CODE:蓝牙数据包的前导部分,用于同步接收方的时钟,并标识一个新数据包的开始。
- HEADER:指示数据包的类型,例如连接请求、断开连接、数据传输等;指示数据包的有效载荷(Payload)的长度;包含发送方和接收方的地址信息;包含如流量控制、错误检测等控制信息。
- PAYLOAD:有效载荷(Payload)是数据包的实际数据部分,携带实际的内容,如音频流、文件传输、控制命令等。
ACCESS CODE | HEADER | PAYLOAD |
---|---|---|
68/72 字节 | 54 字节 | 0~2745 字节 |
基带数据包有数据分组、语音分组、公共分组
其中,公共分组包含如下几种类型包:
- ID Packet:用于蓝牙设备的寻呼、查询与响应。只有ACCESSCODE的packet。inquiry msg就是一个ID Packet。
- NULL Packet:只有ACCESS CODE和HEADER。一般来说他是用来返回链路信
息的,比如什么rx buffer状态,或者ARQN之类的。他不需要对端的确认。 - POLL Packet:和NULL Packet类似,比较大的差别就在于它需要对端回确认信息。注意tws从机不能回POLL Packet?。比如,设备在手机端音频停止后,可能会一直发POLL包,确认手机端情况,但会增加功耗?
- FHS Packet:包含了发送的clk信息和address信息,在page等开始的同步过程中起到了很大的作用
- DM1 Packet:所有逻辑链路的控制信息都需要允许这种包,也能传输数据,仅限于ACL链路中。可以认为是一种ACL的包。
---
链路控制层LC(位于RF射频物理层的上一层)
为基带数据分组提供物理连接方式为:
ACL(无连接)、SCO(面向连接)
面向连接的话音分组只需经过基带传输,而不到达L2CAP
ACL适用于数据分组包
ACL分组:表示为
D(M|H)(1|3|5)
;D:数据分组;M:中等速率,2:3比例FEC编码;H:高速率,无FEC编码;数字1、3、5:分组占用的时隙数DM1、DH1、DM3、DH3、DM5、DH5、AUX1、2-DH1,2-DH3,2-DH5以及3-DH1,3-DH3和3-DH5
SCO分组:表示为
HV(1|2|3)
;HV:高质量语音分组;数字 1、2、3:纠错编码方式分别是DV和HV的packet。差别在于:HV没有CRC并且不重传,DV在data域有CRC,但是在同步数据域没有,data域的数据应当重传。(通话数据包)
eSCO分组:表示为
EV(1|2|3|4|5|6)
;EV:扩展高质量语音分组;数字 1、2、3、4、5、6 :分组类型和纠错编码方式EV3、EV4、EV5、2-EV3、2-EV5、3-EV3、3-EV5。(通话数据包)
蓝牙数据包层次说明
对于所抓取的蓝牙空中数据包,在EllisysBluetoothAnalyzer
->Application
分为以下几个layer
层次:
Baseband:
LC:链接控制层
LMP:负责链路的建立、鉴权和加密等
L2CAP:提供数据的分段和重组,支持多种高层协议。
SMP:
SDP:
以下为应用层数据包
RFCOMM:串行数据
SCO/eSCO Audio:
AT:HFP指令
HID:人机交互指令
Audio/Vedio(音视频):A2DP、AVRCP,基于AVDTP/AVCTP
SDP服务发现协议
暂略
发现对端所支持蓝牙配置文件
另,注册经典蓝牙uuid,比如车机用到EIR扩展服务,需要SDP通道发现、、、
LMP链路管理协议
LMP:位于基带层之上,负责链路管理。
在这一层上,有哪些明显的蓝牙通信节点?暂略,通过此层界定蓝牙问题是高层软件流程或者是蓝牙底层配置?
L2CAP逻辑链路控制与适配协议
L2CAP:位于 LMP 之上,负责数据传输服务。
L2CAP(Logical Link Control and Adaptation Protocol)是蓝牙协议栈中的一个关键协议,位于基带层(Baseband)之上,为上层协议(如 RFCOMM、SDP、ATT 等)提供数据传输服务。L2CAP 的主要作用是将基带层提供的低层连接抽象化,为高层协议提供更灵活、更高效的传输机制。
首次配对与回连过程
HFP-AT命令集
AT Exchange 是指通过 AT 命令进行的通信交换。
AT 命令(Attention Command)是一组用于控制调制解调器和其他通信设备的标准命令。
在蓝牙设备中,特别是支持 HFP(Hands-Free Profile)的设备,AT 命令用于控制各种功能,如接听电话、挂断电话、调整音量、开启或关闭 SIRI 等。
命令 | 描述 | 备注 |
---|---|---|
AT + BVRA=1\r |
打开SIRI | |
AT + BVRA=0\r |
关闭SIRI | |
+CIEV=<event>,<value> |
报告事件类型及对应的值 | 涉及通话状态事件变化较多 |
AT + VTS=123\r |
发送DTMF音 | |
AT + CLIP=1\r |
开启来电显示 | |
AT + BTRH=1\r |
设置耳机音量为最大 | |
AT + BTRH=0\r |
设置耳机音量为最小 | |
AT + CHUP\r |
挂断电话 | |
AT + CHLD=0\r |
接听电话 | |
AT + CHLD=1\r |
呼叫等待 | |
AT + CHLD=2\r |
呼叫保持 | |
AT + CHLD=3\r |
切换通话 | |
AT + CNUM\r |
查询当前通话号码 | |
AT + CMER=3,0,0,1\r |
开启事件报告 | |
AT + VGS=15\r |
设置麦克风增益 | |
AT + VGM=15\r |
设置扬声器增益 | |
AT + BIA=1,1,1,1,1\r |
设置电池状态报告 | |
AT + BCS=1\r |
设置连接状态报告 | |
AT + BCC\r |
断开连接 |
经典蓝牙数据包节点分析
蓝牙搜索与配对、连接过程
Inquiry、paging、加密、获取厂商
抓包对应蓝牙上层业务的事件为哪些?
通过蓝牙分析LMP Start Encryption Request
命令,初步界定是底层连接,还是协议层的问题。如下所示:
蓝牙回连过程
Paging
ID Packet
FHS Packet
LMP Features Exchange
可能在此流程中产生的问题、差异有哪些?(如回连失败、两端同时对连失败等问题
蓝牙高级音频过程
高级音频链路正常播放示意:
高级音频音量控制示意如下:
高级音频暂停、上下曲示意如下:
另外,音频停止后,可能会一直发POLL包确认对端状况,此设计下功耗大。 可以通过分析抓包确认
排查蓝牙播放 远/近 端声音异常问题时,在蓝牙分析仪软件上抓包可以直接听歌,由此初步确认空中数据音频是否正常,再行debug。
:高级音频哪些包对应蓝牙上层业务的事件有哪些?
蓝牙通话过程相关节点
来电时、播放来电号码时、挂断时、键盘输入、调节通话音量时,在蓝牙抓包上的体现是怎样的
HSP HFP
SCO/eSCO
抓包对应蓝牙上层业务的事件为哪些?
音量控制与同步
不同手机的音量同步范例:首次连接同步音量过程、回连时同步音量过程
从蓝牙抓包分析角度,了解不同品牌手机的蓝牙音量同步设计差异
比如说,苹果手机,在加密认证或者HFP建立之前,发送音量是无效的? 等等
暂略
应用业务设计-蓝牙抓包问题分析实例
音量同步-手机兼容性
查看蓝牙包中的 音量同步命令,以及相关配置文件通道连接包 时序的先后关系,
如:通过蓝牙抓包分析,可以看出在何种情况上,设备向手机发送音量同步指令是无效的(比如说,在a2dp通道建立之前)
在一定程度上,说明该手机端的软件设计是忽略a2dp建立之前的音量同步指令。
设备端可以针对这种情况,在相关条件建立、满足之后,主动再发一次音量同步即可。或其它。
或其它情况,暂不列举。通过蓝牙抓包分析,正确推导、整理不同手机厂商的软件设计差异
SIRI语音助手-手机兼容性
标准的蓝牙hfp-at指令,是at+bvra=1是打开siri,=0是关闭。 对于苹果是适用的。
- 存在部分安卓手机 发bvra=1打开,=0关闭不了。 再发一次at+bvra=1,才关闭。
- 另,如vivo手机,收到at+bvra=1后打开了siri,然后回复ok,接着马上又回复了at+bvra=0。 导致了设备马上回调了 siri状态为0。
如下图所示,通过抓包分析,确认为手机自身软件设计不当导致的兼容性问题:
进一步确认手机兼容性软件设计行为后,可以尝试考虑从设备端来规避,从而达到目的。
但更多情况下,设备端是不可能完美适配所有手机的,那么需要从抓包分析中拿出证据说明理论不可行性。
如果对比样机可行,那么需要抓包样机发掘差异,分析我们的软件设计流程或者分析是否有遗漏
关HFP配置,设备与手机同时回连异常
蓝牙分析仪及设备端软件修改流程,
暂略
蓝牙发射器播歌-接收器音频卡顿/异常
当经过初步排查发射器本身的音频流数据源无异常,需要进一步界定问题音频节点时,可通过蓝牙抓包空中音频数据,可以界定以下情况:
- 蓝牙空中链路正常,发包间隔、丢包率等正常,则可以说明数据在发射前就已经异常;基于这一点可以接着排查蓝牙编码节点前后的数据流,确认是在编码前数据存在异常,还是编码后出现的音频异常
- 数据流正常,蓝牙空中包出现严重丢包、发包异常等,说明蓝牙发射异常
无法明确问题出现在音频流程还是蓝牙流程时,可以通过蓝牙抓包快速界定范围
注册RFCOMM-UUID不断开SDP通道,导致PBAP无法使用
具体在蓝牙抓包上是如何体现的?暂略
PBAP,即电话本,基于RFCOMM的高层配置文件
如,在汽车carplay中,需要在eir扩展服务中注册新uuid,用于标识车机服务,如苹果carplay、谷歌安卓auto
设备端设计不当,注册并连接完成后,须主动关闭SDP通道
思考与拓展
蓝牙分析仪如何抓包BLE数据包?是如何分析的?
如何配置解密的?与经典蓝牙抓包差异?等等,暂略
以下图示指示处为LE数据包概览
蓝牙分析仪如何抓包TWS主从交互数据包?是如何分析的?通常什么场景下需要?
蓝牙抓包分析中,需要关注跳频、蓝牙时隙这些概念吗?有什么用?
跳频是:1600次/s,蓝牙时隙为:1/1600=625us
这些概念对抓包分析起到什么作用?