Bluetooth LE 允许的最大值 ATT_MTU 是多少?

What is the maximum ATT_MTU allowed by Bluetooth LE?

使用 Bluez 的 DBus API 编写用作 Gatt 服务器的应用程序时,通过调用 ReadValueAcquireNotify 命令给出的 MTU 将 MTU 报告为 517。

数据通道有效负载的最大大小为 251 字节(没有数据长度扩展时为 27)。由于 4 字节 L2CAP header,我们剩下的最大 MTU 为 247。

ATT_MTU是否独立于link层的数据长度限制?数据是否分散在较低级别,如果是,最大值是多少 ATT_MTU?

是的,ATT_MTU 独立于 link 层的数据长度限制。顾名思义,ATT_MTU与ATT层可以传输的最大数据量有关,而普通包长度与物理层可以发送的最大数据量有关。

正如您所建议的,这意味着如果 ATT_MTU 大于最大物理数据包长度,则数据在较低(物理)层中被分段。例如,如果最大 ATT_MTU 是 517 而最大块 BLE 块是 251,这意味着您发送的数据将被分成 251 字节的块。这就是为什么理想的 ATT_MTU/packet 长度组合通常是 ATT_MTU 247 和数据包长度 251。

至于最大值 ATT_MTU,我认为这不是蓝牙规范指定的,因此应该取决于芯片。蓝牙规范确实提到属性的最大长度应为 512(蓝牙核心规范 5.2,第 3 卷,F 部分,第 3.2.9 节长属性值):-

The maximum length of an attribute value shall be 512 octets.

因此ATT_MTU515以上肯定能够传输蓝牙规范允许的最大属性。

您还可以查看下面的 link 了解更多信息:-

ATT_MTU是一个16位的数字,因此它最多可以是65535。但是ATT_MTU是在两个设备之间协商的,将被设置为两个设备的最大值中的最小值ATT_MTU.

但是一个特征只能是 512 字节,所以通常像 65535 这样大的 mtu 是没有用的。你必须使用“读取多个特征”或类似的方法来利用这么大的 mtu。

ATT_MTU完全独立于link层数据长度,由hci和link层自动分片。 L2CAP 主机是通常重组数据包的主机。