蓝牙 LE 的最大数据包长度?
Posted
技术标签:
【中文标题】蓝牙 LE 的最大数据包长度?【英文标题】:Maximum packet length for Bluetooth LE? 【发布时间】:2016-08-12 08:47:54 【问题描述】:我想知道低功耗蓝牙的最大数据包长度是多少。 example hereexample here
"BLE 允许您传输的最大值为 20 字节。"
“您说得对,BLE 规范不允许写操作超过 20 个字节。”
但是,阅读蓝牙核心规范,我们可以看到 ATT_MTU 值是用 2 个字节写入的,这意味着它可以达到 65535 个字节。
这一切背后的真相是什么?
【问题讨论】:
【参考方案1】:规范总是正确的!
在蓝牙 4.0 中,引入了 BLE,最大有效载荷为 33 个字节(不包括访问地址和 CRC 字段)。协议栈中的每一层都各取所需:
2 字节的数据包头(类型和长度), 4 字节用于 MIC(启用加密时), 4 个字节用于 L2CAP 标头(通道 ID 和数据包长度), ATT 协议剩下 23 个字节,这是 ATT 协议的默认和最小 MTU。对于一个 ATT 写请求(或通知),3 个字节用于命令类型和属性 ID,20 个字节用于属性数据。
在 ATT 级别,这个限制可以通过两种方式扩大:
在 L2CAP 级别使用分片:
L2CAP 会将 ATT PDU 拆分为 27 个字节的片段(第一个片段为 23 个)。
缺点:
两边都需要内存, 它不太可靠,因为某些实现可能会丢失数据包(即使规范没有提到 L2CAP 级别的数据包丢失,它也会发生)使用蓝牙 4.2 中引入的数据包长度扩展:
无线电级别最多 251 个字节(MIC 为 255 个),因此 242 个字节可用于属性数据。
缺点:
还是新的,需要硬件支持,所以没有在所有地方实现(即使宣布支持 BLE 4.2),
传输时间越长的数据包就越有可能被卡住,因此更长的数据包意味着更多的重传。
如果同时使用这两种方法,L2CAP 可能会使用更大的片段。
无论 ATT PDU 的低级拆分如何,属性值长度被 3.F 3.2.9 限制为 512。
【讨论】:
谢谢。那么,虽然 ATT_MUT 参数编码为 2 个字节,但它不能达到 65535 吗?并且超过 238 字节的特征是碎片化的? 关于属性值长度,3.F 3.2.9 指定:The maximum length of an attribute value shall be 512 octets.
ATT_MTU 可以在设备之间协商以实现更高的吞吐量,当然,它不会影响 L2CAP 级别的 MTU(其中 MTU 由 LE 数据包扩展控制)。作为 BLE 新手,这让我感到困惑,因为不清楚哪个 MTU 是各种文章的主题,以及即使没有 BLE 4.2 也如何修改它。
也许我错了,但最大 238 听起来不正确(带数据包长度扩展)。规范规定有效载荷字段的长度应小于或等于 251 个八位字节(v4.2 [第 6 卷,B 部分],2.4 数据通道 PDU),其中有效载荷是指数据通道 PDU 的一部分。如果有效负载由操作码(1 个字节)、属性句柄(2 个字节)和通道/长度(4 个字节)组成,则剩下 244 个字节用于实际数据。我可以通过发送一些实际数据来确认这一点。
@mateusz:看来你是对的。 251 字节没有 MIC(255 有),所以我们得到 242 字节的 ATT 数据。编辑了我的答案。以上是关于蓝牙 LE 的最大数据包长度?的主要内容,如果未能解决你的问题,请参考以下文章