Android 14 中默认 MTU 是否更改为 517 字节?如果是这样,这将导致与硬件、蓝牙堆栈、MTU 功能以及函数 requestMtu() 的正确使用相关的问题。
正如您在问题中所描述的,BluetoothGatt 自 API 21 起提供了 requestMtu 方法。但是,这在 Android 14 及更高版本中是不可能的:
第一个请求 MTU 的 GATT 客户端将 MTU 设置为 517
从 Android 14 开始,Android 蓝牙堆栈更加严格遵守 蓝牙核心规范 5.2 版和 BLE 请求 当第一个 GATT 客户端使用以下命令请求 MTU 时,ATT MTU 为 517 字节 BluetoothGatt#requestMtu(int) API,并忽略所有后续 该 ACL 连接上的 MTU 请求。
解决方法包括更改固件:
您的外围设备应响应 Android 设备的 MTU 请求具有合理的值,可以由 外围。最终协商的价值将是最小的 Android 请求的值和远程提供的值(即
)min(517, remoteMtu)
...或手动发送适当大小的数据包:
- 或者,根据外设已知支持值与接收到的 MTU 更改之间的最小值来限制 GATT 特征写入
- 提醒您应将标头支持的大小减少 5 个字节
- 例如:arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5