BLE链路层的空中数据包格式非常简单。 其所有的空包均遵循下图所示的格式:
从上图可以看出,BLE Air包由4部分组成。 他们是:
前导码占1字节,访问地址占4字节,PDU占2~257字节,CRC占3字节,完整的空包大小在10字节~265字节之间。
LSB(The Least Significant)表示最低有效位; MSB(The Most Significant)表示最高有效位。 最低有效位首先由链路层发送到空中,最高有效位最后发送。 也就是说,先发出前导码,然后是访问地址空包,然后是PDU,最后是CRC。
前言
前导码占用8位。 所有广播信道中,空中数据包的前导码为10101010b; 在数据通道中,空中数据包的前导码为10101010b或01010101。
从层次上看,前导实际上是一个高低变化的矩形波。 接收器可以使接收电路的频率与矩形波的频率同步。 这就是所谓的接收机频率同步机制。 通俗地说,接收器可以利用它来估计一个比特的起始位置和一个比特的宽度,从而可以准确地接收到后续的每个有效比特。
同时,前导码标记了有效空中数据包的起始位置,以避免空中无效数据的干扰。
访问地址
广播通道和数据通道的访问地址不同。 广播通道的访问地址固定为0x8E89BED6; 数据通道的访问地址由发起方确定。 所以简单的理解就是,从访问地址上,我们首先可以区分这个空中包是广播包还是连接数据包。
如上所述,数据信道的前导码为10101010b或01010101b。 其实就是看数据通道中访问地址的最低有效位是0还是1,如果是1,则前导码为01010101b,否则为10101010b
当发起者向广播者发起连接请求时,它会将访问地址的值放入连接请求的相应字段中。 当链路层连接成功建立后,双方都进入连接状态,双方都会收到后续的空中数据包。 使用此访问地址进行通信。
可见,访问地址也与特定的链路层连接绑定。 例如,一台设备与多台设备建立了链路层连接,这意味着一台设备同时维护着多条链路。 当设备收到空包时,只需访问地址即可获知该空包。 该包属于哪个连接?
协议数据单元
协议数据单元是空中数据包的有效负载部分。 不同类型的空中数据包有不同的PDU。 它们大致可以分为广播通道PDU和数据通道PDU。
BLE 使用跳频机制。 链路层共有40个通道,其中3个通道是广播通道,另外37个通道是数据通道。
当设备处于广播状态或发起状态时,设备发送或接收广播通道的PDU; 当设备与另一个设备建立链路层连接时,双方都进入连接状态,并发送或接收数据通道的PDU。
广播通道 PDU
广播通道PDU的结构由两部分组成空包,分别是Header和Payload,如下图所示:
从上图可以看出,Header大小为16位,也就是2个字节。 Payload 的长度由 Header 中的 Length 字段决定。 那么首先看一下Header字段的组成,如下图所示:
Header字段由以下6部分组成:
广播报文的类型如下表所示:
PDU 类型数据包名称
0000
可连接的非定向广播 (ADV_IND)
0001
可连接的定向广播 (ADV_DIRECT_IND)
0010
不可连接的广播 (ADV_NONCONN_IND)
0011
扫描请求(SCAN_REQ)
0100
扫描响应(SCAN_RSP)
0101
连接请求(CONNECT_REQ)
0110
可扫描指示 (ADV_SCAN_IND)
0111-1111
预订的
这里我不会介绍每个包的类型,但会在以后的博文中详细介绍。
数据通道PDU
数据通道 PDU 包含 16 位标头和可变长度有效负载,还可能包含
MIC(Message Itegrity Check:消息完整性检查),数据通道PDU格式如下图所示:
Header的结构如下图:
标头由 6 部分组成:
LLID:
2个字节,指示该包是LL Data PDU(链路层数据包)还是LL Control PDU(链路层控制包)。 其可能的取值如下:
内森:
下一个数据包的序列号
序列号:
航空包装序列号
医学博士:
更多数据意味着,由于 BLE 是低功耗蓝牙,因此它本质上使用睡眠唤醒机制。 它在唤醒时发送和接收空中数据包。 如果MD字段设置为1,则意味着发送方将来会有更多的空中数据包。 发送该数据包,通知接收方不要进入休眠状态,继续数据传输; 如果该字段设置为0,则表示发送方没有更多数据要发送,可以进入休眠状态。
CRC
CRC是关于PDU部分的数据完整性校验
以上内容均来自网络搜集,如有侵权联系客服删除