报文种类
有两类报文:广播报文和数据报文。
广播报文:发现连接其他设备。
数据报文:建立连接后开始使用数据报文。
报文通用数据包格式
无论是广播报文还是数据报文,链路层只使用一种数据包格式。
2.1 Preamble 前导
报文最开始的 8bits 是 01010101 或者 10101010 序列。
接收机可以用·它来配置自动增益控制,以及确定"0" 、 "1" 比特所使用的频率。
2.2 Access Address
广播报文接入地址为: 0x8E89BED6
数据报文接入地址为: 32bits 随机数
数据报文规则:
- 不能出现 6 个连续的"0" 或"1" ;
- 不等于 0x8E89BED6;
- 与"0x8E89BED6" 不能只有一位不同
- 4 个字节不能相等;
- 不能有超过 24次比特翻转;
- 最后 6 比特至少有 2 次比特翻转。
符合规则的大概有 231 个。
2.3 PDU 报文
PDU报文分为两种,广播报文与数据报文。(本章第3节,第4节 有详细介绍)。
CRC 校验
- PDU被加密,然后在执行PDU加密之后计算CRC。
- 24 位 CRC 校验可以检测所有奇数位错误,以及 2 位或 4 位错误。
生成多项式如下:
CRC=x24+x10+x9+x6+x4+x3+x1+x0
PDU 报文—广播报文
3.1 广播报文结构(PDU)
Header 结构:
3.2 广播报文之PDU Type
3.2.2 PDU类型
状态 |
PDU类型 |
PDU格式 |
说明 |
Advertising |
ADV_IND |
AdvA(6 octets) |
connectable undirected advertising event,用于常规的广播,可携带不超过31bytes的广播数据,可被连接,可被扫描: |
|
ADV_DIRECT_IND |
AdvA(6 octets) |
connectable directed advertising event,专门用于点对点连接,且已经知道双方的蓝牙地址,不可携带广播数据,可被指定的设备连接,不可被扫描: |
|
ADV_NONCONN_IND |
AdvA(6 octets) |
和ADV_IND类似,但不可以被连接,不可以被扫描。 |
|
ADV_SCAN_IND |
AdvA(6 octets) |
和ADV_IND类似,但不可以被连接,可以被扫描。 |
Scanning |
SCAN_REQ |
ScanA(6 octets) |
当接收到ADV_IND或者ADV_SCAN_IND类型的广播数据的时候,可以通过该PDU,请求广播者广播更多的信息: |
|
SCAN_RSP |
AdvA(6 octets) |
广播者收到SCAN_REQ请求后,通过该PDU响应,把更多的数据传送给接受者。 |
Initiating |
CONNECT_REQ |
InitA (6 octets) |
当接收到ADV_IND或者ADV_DIRECT_IND类型的广播数据的时候,可以通过该PDU,请求和对方建立连接: |