蓝牙LE允许的最大ATT_MTU是多少?

问题描述

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

数据通道净荷的最大大小为251个字节(不带数据长度扩展的27个字节)。由于有4个字节的L2CAP标头,我们剩下的最大MTU为247。

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

解决方法

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

但是一个特征只能是512个字节,因此通常对于65535这样的大型mtu来说是没有用的。您必须使用“读取多个特征”或类似的方法来使用如此大的mtu。

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

,

是的,ATT_MTU与链路层的数据长度限制无关。顾名思义,ATT_MTU与可以在ATT层传输的最大数据量有关,而正常的数据包长度与可以在物理层发送的最大数据量有关。

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

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

属性值的最大长度为512个八位位组。

因此,ATT_MTU为515或更高肯定可以传输蓝牙规范允许的最大属性。

您也可以查看下面的链接以获取更多信息:-

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...