蓝牙 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 的最大数据包长度?的主要内容,如果未能解决你的问题,请参考以下文章

android蓝牙BLE(三) —— 广播

处理android 经典蓝牙发送文件时接收包的问题

TCP 、UDP包的最大长度是多少?

LE Audio 蓝牙协议规范--物理信道及PDU

浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

PING网络数据包为何只能65500