air interface packets --- 蓝牙广播包

Core_v5.4 参考目录

LE 物理层类型

一共有三种,分别是LE Uncoded PHYs (LE 1M and LE 2M) 、LE Coded PHY,本文主要讲解LE 1M

报文格式

前导码

所有链路层数据包都有一组前导码,前导码被接收机用于执行频率同步、符号时序预估和自动增益控制(AGC)训练。前导码为固定的0和1交替二进制序列。对于在LE 1M物理层上发送的数据包前导码为8比特;对于在LE 2M物理层上发送的数据包前导码为16比特。LE 1M和LE 2M物理层数据包前导码的第一个比特(按发送顺序)应当与存取地址的最低有效位相同。LE Coded物理层数据包的前导码由10组二进制序列'00111100'构成,合计为80比特。 

接入地址

用于区分不同连接或者不同周期性广播的32位识别码,接收机可以通过接入地址的值确定为广播包。所有主广播物理信道数据包均统一使用蓝牙核心规范中指定的专用存取地址- 0x8E89BED6。

协议数据单元

用于装载需要传输的数据,广播PDU和数据PDU格式不同。

PDU Type

指示广播包的类型

Length

指的是 payload 的长度,

payload

对于广播包,长度是37字节,其中6字节是MAC,其他是数据

广播包中的数据域使用LTV的格式进行定义,即 length + type + value
length表示(type + value)的总长度

蓝牙协议已经规定了一部分type,比如0x09是设备名,如下

注:图片来自 Assigned_Numbers.pdf

0xFF 是用户自定义类型

循环冗余校验码

24位CRC,基于PDU计算产生,用于校验数据包PDU的正确性

抓取广播包验证

使用wireshark对广播包进行抓包分析,如下为所抓实际数据:

注意:

广播数据为小段模式,即低字节在前,如接入地址4byte为0X8E89BED6,在广播数据中的存在格式为 “d6 be 89 8e” 。
广播1byte前导是在接收时被底层处理掉,不会存在抓包后的广播数据中显示的。
wireshark抓到的广播数据除了蓝牙本身数据外,还会增加软件自己的头信息。另我们去掉wireshark软件自带的头信息。我们去掉wireshark自带的数据信息,实际广播数据是从4byte接入地址开始的,即 “d6 be 89 8e”。

根据广播包格式,在4byte接入地址后,为1byte的报头 + 1byte 的数据长度,这2byte组成了抓包数据中的Packet Header,如下:

Packet Header的数据解析格式如下:

根据解析格式,我们可以0x2520值解析如下:

RxAddr和TxAddr位均为0,表示使用的是Public address地址

PDU Type为0000,表示使用的广播模式为通用广播

Length为37,表示广播数据域长度为37byte

然后我们来看看37byte数据域的内容:
前面我们说过,广播包必须带6byte的MAC地址,这里的Advertising Address为 34:85:18:b8:35:82,即为广播设备的MAC地址。

还剩31byte的实际数据如下:

第1个LTV数据组合为L = 2,T = 0x01,V = ‘0000 0110’
L = 2, 表示T+V的数据长度为2bytre
T = 0x01, 表示数据类型为ESP_BLE_AD_TYPE_FLAG ,表示设置广播标志
在ESP32中是这么定义广播标志的:

#define ESP_BLE_ADV_FLAG_LIMIT_DISC         (0x01 << 0)
#define ESP_BLE_ADV_FLAG_GEN_DISC           (0x01 << 1)
#define ESP_BLE_ADV_FLAG_BREDR_NOT_SPT      (0x01 << 2)
#define ESP_BLE_ADV_FLAG_DMT_CONTROLLER_SPT (0x01 << 3)
#define ESP_BLE_ADV_FLAG_DMT_HOST_SPT       (0x01 << 4)
#define ESP_BLE_ADV_FLAG_NON_LIMIT_DISC     (0x00 )

 

V = ‘0000 0110’,表示使用ESP_BLE_ADV_FLAG_GEN_DISC 和 ESP_BLE_ADV_FLAG_BREDR_NOT_SPT ,即使用通用广播发现模式,不支持BR/EDR。

依次类推:
第2个TLV数据组合为L = 3,T = 0x19, V = 0x0040 ,设置蓝牙外观显示。可以设置为手表、手机等等外观形式,这里设置成手机外观。
第3个TLV数据组合为L = 13,T = 0x09, V = CcBle-123456,为蓝牙名称
第4个TLV数据组合为L = 3, T = 0x03, V = 0x00ee, 为2byte广播UUID
第5个LTV数据组合为L = 5, T = 0x12,V = 6和16, 表示表示从机连接最小间隔和最大间隔时间。实际时间为 值*1.25毫秒

到此,一共5个LTV数据组合全部解析完成。
一共为5byte + L总长度(2+3+13+3+5) = 31byte,刚好与我们前面解析出来的31byte实际数据长度对应。

最后是3byte的CRC值。

 

posted @ 2024-03-23 17:38  流水灯  阅读(103)  评论(0编辑  收藏  举报