【发布时间】:2016-08-12 08:47:54
【问题描述】:
我想知道低功耗蓝牙的最大数据包长度是多少。 example hereexample here
"BLE 允许您传输的最大值为 20 字节。"
“您说得对,BLE 规范不允许写操作超过 20 个字节。”
但是,阅读蓝牙核心规范,我们可以看到 ATT_MTU 值是用 2 个字节写入的,这意味着它可以达到 65535 个字节。
这一切背后的真相是什么?
【问题讨论】:
我想知道低功耗蓝牙的最大数据包长度是多少。 example hereexample here
"BLE 允许您传输的最大值为 20 字节。"
“您说得对,BLE 规范不允许写操作超过 20 个字节。”
但是,阅读蓝牙核心规范,我们可以看到 ATT_MTU 值是用 2 个字节写入的,这意味着它可以达到 65535 个字节。
这一切背后的真相是什么?
【问题讨论】:
规范总是正确的!
在蓝牙 4.0 中,引入了 BLE,最大有效载荷为 33 个字节(不包括访问地址和 CRC 字段)。协议栈中的每一层都各取所需:
对于一个 ATT 写请求(或通知),3 个字节用于命令类型和属性 ID,20 个字节用于属性数据。
在 ATT 级别,这个限制可以通过两种方式扩大:
在 L2CAP 级别使用分片:
L2CAP 会将 ATT PDU 拆分为 27 个字节的片段(第一个片段为 23 个)。
缺点:
使用蓝牙 4.2 中引入的数据包长度扩展:
无线电级别最多 251 个字节(MIC 为 255 个),因此 242 个字节可用于属性数据。
缺点:
还是新的,需要硬件支持,所以没有在所有地方实现(即使宣布支持 BLE 4.2),
传输时间越长的数据包就越有可能被卡住,因此更长的数据包意味着更多的重传。
如果同时使用这两种方法,L2CAP 可能会使用更大的片段。
无论 ATT PDU 的低级拆分如何,属性值长度被 3.F 3.2.9 限制为 512。
【讨论】:
The maximum length of an attribute value shall be 512 octets.