0%

【蓝牙】分析仪使用及基本蓝牙数据包解析

未完待续…


前言

本文以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
2
3
4
5
6
7
8
9
10
11
extern u8 *get_last_device_connect_linkkey(u16 *len);
#ifdef CONFIG_DEBUG_ENABLE
extern u8 *get_last_device_connect_linkkey(u16 *len);
u8 *test_linkkey;
u16 test_linkkey_len = 16;
test_linkkey = get_last_device_connect_linkkey(&test_linkkey_len);
if(test_linkkey){
printf("test_linkkey================\n");
put_buf(test_linkkey, test_linkkey_len);
}
#endif

将以上代码粘贴到sdk的任一可触发调用的位置即可(如通过按键触发调用),在蓝牙连接后,调用上述代码,则会打印当前最新连接设备对应的LinkKey。

上位机配置LinkKey解密:暂略

蓝牙数据抓包质量要求

如何为有效数据包?

需要从连接过程、回连过程抓起

保证数据包解包正确,无错包。如何判断为有效解密?

一个正确的蓝牙抓包解密示例如下:
alt text

蓝牙数据包简单说明

蓝牙基带数据包格式与类型解析

问:什么是协议栈?
答曰:协议栈其实就是一堆代码。

所有的蓝牙通信(无论高层配置文件、低层控制等),通过层层封装,最终都是通过 Packet 包的形式进行发送和接收,从而实现空中数据传输。

从软件角度来看,蓝牙抓包分析,即通过这些空中数据包,逆向推导并分析双方的软件设计流程。

包结构组成:ACCESS CODE + HEADER + PAYLOAD

  • ACCESS CODE:蓝牙数据包的前导部分,用于同步接收方的时钟,并标识一个新数据包的开始。
  • HEADER:指示数据包的类型,例如连接请求、断开连接、数据传输等;指示数据包的有效载荷(Payload)的长度;包含发送方和接收方的地址信息;包含如流量控制、错误检测等控制信息。
  • PAYLOAD:有效载荷(Payload)是数据包的实际数据部分,携带实际的内容,如音频流、文件传输、控制命令等。
ACCESS CODE HEADER PAYLOAD
68/72 字节 54 字节 0~2745 字节

alt text

基带数据包有数据分组、语音分组、公共分组

其中,公共分组包含如下几种类型包:

  • 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。

如下图所示,通过抓包分析,确认为手机自身软件设计不当导致的兼容性问题:

VIVO手机回复siri异常抓包分析

进一步确认手机兼容性软件设计行为后,可以尝试考虑从设备端来规避,从而达到目的。

但更多情况下,设备端是不可能完美适配所有手机的,那么需要从抓包分析中拿出证据说明理论不可行性

如果对比样机可行,那么需要抓包样机发掘差异,分析我们的软件设计流程或者分析是否有遗漏

关HFP配置,设备与手机同时回连异常

蓝牙分析仪及设备端软件修改流程,

暂略

蓝牙发射器播歌-接收器音频卡顿/异常

当经过初步排查发射器本身的音频流数据源无异常,需要进一步界定问题音频节点时,可通过蓝牙抓包空中音频数据,可以界定以下情况:

  • 蓝牙空中链路正常,发包间隔、丢包率等正常,则可以说明数据在发射前就已经异常;基于这一点可以接着排查蓝牙编码节点前后的数据流,确认是在编码前数据存在异常,还是编码后出现的音频异常
  • 数据流正常,蓝牙空中包出现严重丢包、发包异常等,说明蓝牙发射异常

无法明确问题出现在音频流程还是蓝牙流程时,可以通过蓝牙抓包快速界定范围

注册RFCOMM-UUID不断开SDP通道,导致PBAP无法使用

具体在蓝牙抓包上是如何体现的?暂略

PBAP,即电话本,基于RFCOMM的高层配置文件

如,在汽车carplay中,需要在eir扩展服务中注册新uuid,用于标识车机服务,如苹果carplay、谷歌安卓auto

设备端设计不当,注册并连接完成后,须主动关闭SDP通道

思考与拓展

蓝牙分析仪如何抓包BLE数据包?是如何分析的?

如何配置解密的?与经典蓝牙抓包差异?等等,暂略

以下图示指示处为LE数据包概览
alt text

蓝牙分析仪如何抓包TWS主从交互数据包?是如何分析的?通常什么场景下需要?

蓝牙抓包分析中,需要关注跳频、蓝牙时隙这些概念吗?有什么用?

跳频是:1600次/s,蓝牙时隙为:1/1600=625us

这些概念对抓包分析起到什么作用?

参考站点