前言
在低功耗蓝牙(BLE)开发过程中,MTU(Maximum Transmission Unit)是一个关键的概念,它指的是在连接中可以传输的最大数据包大小。
注意:我们通常说的都是特指ATT层的MTU,L2CAP或者其它层不会单独拿出来讨论
依据 Core_5.4 Vol_3 Part_A 5.1 MTU 章节,LE的 MTU 最小值为23。在MTU交换中,请求的MTU值不能小于该值,如果小于最小值的话可能被对端设备拒绝甚至断开连接。
MTU的交换过程
MTU交互 format:参考Core_5.4 Vol_3 Part_F 3.4.2
MTU一般都是BLE连上后,ATT层的第一个交互,这样方便后续数据交互;如果在MTU交互之前,有数据传输,则默认使用 MTU=23(ATT 数据: opcode(1byte) + handle(2byte) + data(20byte) )。意味着上层应用单次有效数据交互只有20字节
MTU交互过程不是协商,是通知。交互之后,2者通信采用较小的RX MTU。
MTU的取值范围
在刚才已经了解到 min mtu = 23,这个是spec规定的;那最大呢?这个其实是取决于ble协议版本
BLE 4.0:MTU固定为23,
BLE 4.2: 支持最大MTU为247字节;
引入了DLE特性,也就意味着在LL层,PDU的有效载荷达到251字节;那ATT MTU <= 247 (251 - 4), 这4个字节是L2CAP的head(length+CID)
BLE 5.0: MTU 支持最大 517 字节;
包含了512字节的 payload(有效载荷), 5字节的ATT头部(部分ATT数据,head length = 5字节,如下图)
为什么需要MTU?
1、优化数据传输效率
在常见的嵌入式设备中(手表,戒指等)。MCU的能力还是可以的,可以每次处理超过 20字节 的数据(也有这个需要);如果双方交互了MTU能力,那多数情况下就不需要额外的进行分包组包了
2、兼容不同的设备
SIG并没有规定说MTU必须等于某个值,那对接不同的设备,双方肯定需要进行一个交互,否则通信肯定会出问题
3、降低功耗
这个详细下来涉及到很多;但是基本原理其实就是在射频模块工作的时候可以进行更多的数据交互,即相应的降低了功耗;
例如:如果你有很多数据需要交互;MTU = 23,那就会需要频繁的打开射频进行数据交互,而MTU = 517的话,可能仅仅只需要一个连接间隔就可以;