ATT层MTU大小
文章目录
- 📊 不同蓝牙版本的MTU限制
- 🔍 实际应用中的MTU
- 🚀 如何利用大MTU提升效率
- 🧪 操作建议
MTU是ATT层可以传输的最大数据包大小,MTU决定了一次传输中有效数据载荷的多少🎯。
📊 不同蓝牙版本的MTU限制
BLE的MTU最大值主要取决于你所使用的蓝牙协议版本以及设备的支持情况。下面的表格汇总了关键信息:
蓝牙版本 | 理论ATT_MTU最大值 (字节) | 典型有效数据载荷 (约算) | 备注 |
---|---|---|---|
BLE 4.0/4.1 | 23 | 20 | 默认值,有效数据为ATT_MTU减去3字节开销 |
BLE 4.2 | 247 | 244 | 引入了DLE(数据长度扩展)功能 |
BLE 5.0+ | 517 / 512 | 512 (或更小) | 有效载荷增大,但实际支持度因设备而异 |
-
有效数据载荷:ATT层传输的有效数据量通常为 ATT_MTU - 3 字节。这3字节开销包括1字节的OpCode(操作码)和2字节的Attribute Handle(属性句柄)。因此,即使MTU为23字节时,一次能发送的有效用户数据通常为20字节。
-
BLE 5.0+的说明:虽然协议上可以支持到512甚至517字节,但实际能达到的值需要终端设备(手机、从设备等)硬件和软件的支持。
🔍 实际应用中的MTU
理论上MTU可以很大,但在实际应用中,真正能使用的MTU大小由连接双方(中央设备如手机,和外围设备如手环)共同决定:
1.MTU交换过程:连接建立后,双方会通过一个“MTU交换”过程告知对方自己所能接收的最大MTU值。最终通信采用的MTU将是双方声明的最大值中较小的那个。这个过程更像是一个“通知”而非“协商”。
2.设备支持差异:
-
iOS设备:通常自动使用双方支持的较大MTU,但其上限一般认为是185字节。开发者无法通过公开API请求更改一个更大的值。
-
Android设备:相对灵活,应用可以通过 BluetoothGatt.requestMtu(int mtu) 方法主动请求设置更大的MTU(例如512),但最终生效的值取决于手机硬件和外围设备是否支持。
-
外围设备:蓝牙芯片(从机)也需要支持并配置相应的MTU大小,才能响应主机的MTU交换请求。
3.默认与兼容性:在MTU交换完成之前,或者如果双方不支持更大的MTU,通信会使用默认的ATT_MTU,即23字节(有效数据20字节)
🚀 如何利用大MTU提升效率
若你希望提升BLE数据传输速率,可以考虑:
-
确认设备支持:确保你的中央设备(如手机)和外围设备(如蓝牙模块)都期望的蓝牙协议版本(建议至少BLE 4.2以上)并且支持更大的MTU。
-
主动请求MTU:在Android开发中,在建立连接并发现服务后,适时调用 requestMtu() 来尝试请求一个更大的MTU值。
-
理解提升效果:增大MTU意味着单个连接事件内可以传输更多数据,减少了分包和协议开销,从而提高传输效率并可能降低整体功耗。
-
平衡与兼容:设置过大的MTU可能会因某些设备不支持而导致连接问题。选择一个大小时,也要考虑兼容性。有资料提及,2020年后的手机很多能支持128字节或更大,但测试很关键。
🧪 操作建议
进行BLE应用开发时,若关心MTU:
1.查询设备能力:查阅手机等中央设备和你的外围设备的硬件规格,了解其支持的蓝牙协议版本及MTU能力。
2.在代码中请求并确认:对于Android,使用 requestMtu() 方法,并在 onMtuChanged() 回调中确认实际设置的MTU值。
3.进行实际测试:在不同设备上进行测试,以确定实际可达到的MTU大小和数据传输效果。