如何找出蓝牙低功耗(BLE)中MTU与最大特征尺寸之间的关系?
我有一个BLE开发板,正在运行一个回声'程序 - 所以无论收到什么,它都会立即回复。
在我的Android设备上,如果我请求一个247字节的MTU(成功)然后写一个247字节的特性,它将作为两个数据包发送:一个包含242个字节,另一个包含5个字节。任何尝试写入超过244个字节的特性都会导致2个数据包 - 第一个包含242个字节,第二个包含剩余的字节。不知道为什么第一个数据包长242个字节而不是244个,但它确实存在。
相反,如果我请求一个100字节的MTU,则会发生同样的事情,但是当特征长度超过97字节时,数据包会被分割,而第一个数据包总是95字节长。
所以很明显,在这个特定的Android设备上,最大数据包长度比MTU值短3个字节。我在iOS上看过有关MTU的网页,其中数据包长度比MTU值短3个字节。
在所有移动设备和所有BLE实施中,我保证MTU和最大特征长度之间的差异是3个字节吗?
答案 0 :(得分:2)
几乎。 ATT头由一个字节操作码和两个字节组成,用于ATT句柄。如果你使用"写长特征值"还有一个双字节偏移参数。如果你使用"签名写没有响应"过程(没有人使用,几乎没有堆栈支持),还有一个12字节的签名。
另请注意,最大特征长度为512字节。但是,允许的最大MTU为65535字节。无论你的MTU有多大,你都不能写出大于512字节的特征值。
如果您对ATT协议的低级细节感兴趣,可以在https://www.bluetooth.com/specifications/bluetooth-core-specification,第3卷F部分阅读蓝牙核心规范。