0x00 前提
BLE5.0物理层设计2Mpbs的码元率,实际我们的数据传输速率远远到不了这个级别,主要原因就是我们没有办法直接单次发送1M或者1K数据,必须按照我们知道的ATT_MTU
作为最大值进行拆包发送,不断拆包的过程中导致整体蓝牙有效数据吞吐量下降。
0x01 BLE PHY 包格式
BLE PHY 包格式由以下组成,排除 前导码、访问地址、CRC地址 对于BLE4.0/BLE4.1 上层协议(LL)最大可以包含39字节长度的PDU(协议数据单元)。
注意: 39字节是广告数据包达到的最大 LL PDU 大小(2字节头,6字节设备地址,31字节 AD)。对于数据包,最大 PDU 大小为33字节(2 Header + 4 L2CAP + 23 ATT + 4 MIC)。
但是更新后的BLE4.2/BLE5.0 直接升级硬件,将这一长度扩展到257。但是默认了兼容BLE4.0/4.1还是采用了上面的39设计。
注意: PHY 的数据包最大长度直接由硬件决定,也是限制我们BLE 数据包大小的根本原因。
拓展:
preamble
(前导帧)为1个字节,根据Access Address第一个Bit,有两种取值情况:0x55
或者0xAA
- 0b010101010
- 0b101010101
Access Address用来标示接收者ID或者空中包身份,BLE只有一种packet格式,根据Access Address的不同,又区分两种Packet类型:广播包和数据包:
- 广播包Access Address 固定为
0x8E89BED6
,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输(注:从蓝牙5.0开始广播包可以在其它信道上传输)。广播包发送给附近所有的observer(扫描者)。 - 数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。
- 蓝牙数据包又分空包(empty packet)和普通数据包(data packet)两种.空包整个payload为空,故名空包。
逻辑链路层再往上就是L2CAP------逻辑链路控制适配协议,如下的Basic L2CAP Header+Information Payload
组成我们这里的基本帧(B-frame)。
L2CAP协议再上就是我们操作特征值的ATT层,这一层数据长度被 最大传输单元 ATT_MTU限制,ATT_Payload = Attribute OPCode + Attribute Parames + Authentication Signature(可选)
组成。排除12字节可选的认证签名,和一个字节属性操作码。
对于我们这里的写属性值,其 Attribute Parameters = 其 Attribute Handle(2) + Attribute Value, Attribute Value 就是我们操作属性的值,其最大长度 = ATT_MTU - Attribute OPCode(1) - Attribute Handle(2) = ATT_MTU - 3。
对于读操作属性,主要包含在 ReadResponse 操作码。最大长度 = ATT_MTU - Attribute OPCode(1) = ATT_MTU - 1。
以上,读写属性值最大有效数据长度直接由ATT_MTU决定,但是根本收LL PDU 大小限制。
0x02 LE Data Length Extension
BLE4.2/5.0 新增功能 DLE 数据长度扩展(LE Data Length Extension)功能允许LE控制器在连接状态下发送具有高达251字节的PDU。在连接期间的任何时刻,主从设备可以协商该PDU大小。
对比与BLE4.0/4.1的控制器数据通道最大有效载荷为27字节。使能数据扩展功能后的BLE4.2/BLE5.0能够达到251,数据速率提高了大约2.5倍。
- 如果PDU大小和传输时间都被设置为默认值(即TX和RX都为27B,328us),则LL_LENGTH_REQ不发送。如果对等连接的主从设备发送LL_LENGTH_REQ,此时对等设备同样以默认大小LL_LENGTH_RSP回应。
- 如果PDU的大小收发双方或者有一方不是默认值,则设备的LE控制器将使用LL_LENGTH_REQ和LL_LENGTH_RSP控制PDU协商一个PDU的较大的有效负载大小。
0x03 小结
- BT4.2之后,Payload length 8 bits全部用来表示长度,这样的话,payload size最大可达251字节(255 -- MIC size)。
- BLE连接建立之后,可以动态更改data length长度(默认为27字节),这个特性叫做Data Length Extension(DLE),DLE是通过Link layer命令:LL_LENGTH_REQ和LL_LENGTH_RSP来实现的。
- Data length直接跟蓝牙芯片的射频能力有关,如果PHY层已经做死了,无法扩展。
- L2CAP length,2字节长度,表示后面information payload的长度,information payload最大长度除了受这个L2CAP length字段约束,同时还受MTU的限制。
- MTU,Maximum Transmission Unit,是ATT层与L2CAP层可以交互的最大数据长度,或者说是Client与Server可以交互的最大长度。MTU size则可以通过后面要讲到的Exchange MTU Request和Exchange MTU Response来改变,而L2CAP length无法动态改变,也就是说不能超过65535。
0x04 示例数据包
AAAB5D65501E08040004001B130053D550F6
AA
-- 前导帧(preamble)0x50655DAB
-- 访问地址(access address)1E
-- LL帧头字段(LL header)08
-- 有效数据包长度(payload length)04000400
-- ATT数据长度,以及L2CAP通道编号1B
-- notify command0x0013
-- 应用数据handle0x53
-- 真正要发送的应用数据0xF650D5
-- CRC24值