BLE中GAP层的广播数据格式
BLE中GAP层的广播数据格式
数据结构
广播包数据结构比较简单,示例结构如下:
Length | Type | Value |
---|---|---|
0x02 | 0x01 | 0x06 |
0x03 | 0x19 | 0x123456 |
......... | ......... | ......... |
0x04 | 0x08 | 0x54455354 |
为了方便理解,我们换个形式:
数据长度 | 类型 | 值 |
---|---|---|
2个字节 | 广播类型 | 可连接非定向广播 |
3个字节 | 服务UUID | 0x123456 |
......... | ......... | ......... |
4个字节 | 广播名 | "TEST" |
这里就看出来,每一层的{长度、类型、值}基本的格式组成了数据单位,一个广播数据包中通过多个这种数据组合而成。
这里要注意,Length算的是Type+Value的长度
总长度计算
在Legacy广播中,广播包长度固定为31个字节。这里的计算是要包括数据包所有内容的,计算方法为:
一个数据(1+Length个字节)=Length(1个字节)+Type(1个字节)+Value(Length-1个字节)
这里有一种快速计算广播数据长度的方法就是将每一层的Length的值加起来,再加上有多少层就可以得出总的广播数据长度,这个值要小于等于31字节。要注意这里是只算广播数据长度,如果你用某些手机软件直接搜蓝牙,读到的广播包数据超过了31个字节,而类型却还是属于legacy。那就说明他包含了扫描响应包的数据。
Type定义
对于Advertising data type,他的具体定义不在core specification里,而是在Core Specification Supplement(CSS)文件中定义,他的序号分配在Assigned Numbers文件中划分。
在Assigned Numbers文件中2.3 Common Data Types,他的部分划分如下:
在CSS文件中Part A 1 DATA TYPES DEFINITIONS AND FORMATS中,对上面这些数据类型进行了说明。我们与Type值为0x01,代表Flag的类型举例:
像上面举的例子,当Flags的值为0x06时,则Bit1和2置位,说明这个蓝牙广播属于LE广播,而且不支持BR/EDR。