再来说说另外一种空中包:数据包
蓝牙数据通道空中包(数据包)
与蓝牙广告包相对应的,蓝牙数据包是另一种BLE包。蓝牙数据包是蓝牙数据通道空中包的简称,也就是说空中包只在蓝牙数据通道上传输,也就是除了37/38/39之外的其它37个通道。从格式上来说,蓝牙数据包分为空包和普通数据包两种,空包格式如下。
从图中可以看出,空包整个payload都是空的,因此得名空包。
正常数据包的格式如下:
数据头(Data header)又称LL头,在数据包中定义如下:
链路层支持以下控制PDU:
我们来分析一下数据包#3。#3是主机发送给从机的。那么#3的NESN和SN是怎么确定的呢?其实#3的NESN和SN是通过比较#1和#2的NESN/SN值来确定的。主机传输完#1之后,会记录下数据包#1的NESN和SN,也就是表格右边的NESNꞌ和SNꞌ。然后主机会将SNꞌ和#2的NESN进行比较。如果二者不相等,说明从机已经收到数据包#1,期待主机发送新的数据包给它。此时主机会将SNꞌ加1,形成数据包#3的SN,表示这个数据包是新的数据包,然后发送出去;如果二者相等,说明从机没有收到数据包#1,主机需要重发。主机也会将NESN和#2的SN进行比较。 如果二者相等,说明#2包是新发的包。那么主设备就会将NESN加1,组成#3包的NESN发送出去,告诉从设备,#2包我已经收到了,期待你的下一包。如果二者不相等,说明#2包是重发的包。注意:从上表可以发现一个规律,就是同方向的两个相邻数据包的NESN和SN和另外一个包的NESN和SN是相反的,比如#3的NESN = #1,#3的SN = #1,而#2和#4的NESN和SN是相反的。
我们可以用下面的流程图来描述上述过程。
Payload Length 或 Data Length,BT4.0/4.1 定义如下,这也是为什么蓝牙 4.0/4.1 每包只能传输 20 个字节的原因。
BT4.2 之后,payload 长度全部 8 位都用来表示长度,这样最大 payload size 可以达到 251 字节(255 – MIC size)。BLE 连接建立后,可以动态改变数据长度(默认 27 字节),这个特性叫数据长度扩展(DLE)。DLE 通过链路层命令 LL_LENGTH_REQ 和 LL_LENGTH_RSP 实现。
L2CAPlength空包,2字节,表示后面的信息载荷的长度。信息载荷的最大长度除了受L2CAP长度字段的约束,还受MTU的约束。MTU,即最大传输单元,是ATT层和L2CAP层之间可以交换的数据的最大长度,或者说是Client和Server之间可以交换的最大长度。
总结一下,蓝牙规范定义了两个长度字段:LL 数据长度和 L2CAP 长度。ATT 层还定义了一个 MTU,用于限制 ATT PDU 的最大长度。LL 数据长度可以通过 LL_LENGTH_REQ 和 LL_LENGTH_RSP 动态更改,MTU 大小可以通过后面讨论的 Exchange MTU Request 和 Exchange MTU Response 更改。但是 L2CAP 长度不能动态更改,即不能超过 65535(这个对于经典蓝牙和低功耗蓝牙应该是一样的)。
L2CAP CID空包,长度2字节,逻辑通道的ID。BLE使用固定的通道号。也就是说,虽然蓝牙规范也允许BLE使用面向连接的通道,但是大多数BLE协议栈在实现时都使用固定的通道号。通道号定义如下:
BLE L2CAP信令通道仅支持三种PDU命令:
安全管理器协议(SMP)用于实现配对和密钥分发。SMP支持以下PDU命令:
属性协议(ATT)是我们经常使用的应用层,应用数据遵循ATT命令,ATT支持以下命令列表:
到此为止BLE空中数据包的分析就告一段落了,接下来就是应用层数据的分析了,这个不是空中数据包的范畴,是GATT和profile需要定义的,我会再写一篇文章专门讲一下GATT层协议。
以下是真实数据包的完整示例。注意:BLE 空中数据包采用小端模式。
以上内容均来自网络搜集,如有侵权联系客服删除