安卓BLE MTU大小

6

我在我的安卓应用程序中使用BluetoothGatt.requestMtu(512)。第一次使用时它可以正常工作,但之后MTU自动更改为23(默认值)。

我不知道问题出在哪里...

这是一个日志:

`D/BluetoothGatt: setCharacteristicNotification() - uuid: 0000fff1-0000-1000-8000-00805f9b34fb enable: true
D/BluetoothGatt: configureMTU() - device: 74:F0:7D:C0:CB:68 mtu: 512
D/BluetoothGatt: onConfigureMTU() - Device=74:F0:7D:C0:CB:68 mtu=23 status=0
D/BluetoothGatt: discoverServices() - device: 74:F0:7D:C0:CB:68
D/BluetoothGatt: onSearchComplete() = Device=74:F0:7D:C0:CB:68 Status=0
I/gattSuccess: gattSuccess`

这段代码在onMtuChanged()方法中,因此会导致无限循环。


2
你的日志没有显示你成功将 MTU 设置为 512。onConfigureMTU 返回了一个 MTU 值为 23 的实际值。你只能请求 MTU,因此名为 requestMtu,并且设备将选择适用于双方的最大值。如果你的外围设备只允许 MTU 为 23,那么你永远无法将其增加到更高的值。 - Michael Kotzjan
1
谢谢。在你的回答后,我尝试将我的缓冲区更改为23字节并进行分离。 - hungly
2个回答

8
正如M. Kotzjan所指出的,这与其他设备支持的MTU有关。根据Bluetooth规范v5.2,Vol 3,Part G,Section 4.3.1(Exchange MTU)中的说明:

此子过程由客户端用于将ATT_MTU设置为 当客户端支持大于默认ATT_MTU的值时可以同时支持的最大可能值, 用于属性协议。此子过程仅应在连接期间启动一次。

换句话说,如果您请求512的MTU值,而远程设备回复23(最小的MTU值),则连接的MTU将是23。如果您请求512个并且远程设备回复100,则连接的MTU将为100。如果您请求200个,并且远程设备回复512,则连接的MTU将为200。
请查看以下链接以获取更多信息:

0

你可以简单地取byteArray的大小并减去3,这将给出数据数组的大小。

如果(len < 0) {len = buffer.size - 3}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接