BluetoothGatt:协商新的 MTU 成功但无法使用新的大小(3 字节差异)
BluetoothGatt: negotiating new MTU succeeds but new size cannot be used (3 bytes difference)
我正在开发一款使用 BLE 在设备之间交换数据的应用程序。
为了获得更好的性能,在连接两个设备后,我正在协商增加 MTU,以便通过 BLE 交换更大的数据包。
连接蓝牙设备并读取所有服务和特征后,我请求增加 MTU 使用:
private void requestMtu() {
//gatt is a BluetoothGatt instance and MAX_MTU is 512
this.gatt.requestMtu(MAX_MTU);
}
之后,在 BluetoothGattCallback
实现中,我成功获得了 MTU 请求,并且新的 MTU 与我请求的匹配:
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
super.onMtuChanged(gatt, mtu, status);
if (status == BluetoothGatt.GATT_SUCCESS) {
this.supportedMTU = mtu;
}
}
问题是,当我尝试发送一个 512 字节的数据包时,在另一端 (onCharacteristicWriteRequest:
) 我得到了 509 字节。
有什么想法吗?
MTU 大小表示可在 ATT 负载中使用的最大字节数。 ATT 写入请求负载(为特征写入发送)如下所示:
1 字节属性操作码
2 字节属性句柄
N 字节属性值
由于 MTU 大小为 512 字节,因此 N 的最大大小为 512 - 3 = 509 字节
我正在开发一款使用 BLE 在设备之间交换数据的应用程序。
为了获得更好的性能,在连接两个设备后,我正在协商增加 MTU,以便通过 BLE 交换更大的数据包。
连接蓝牙设备并读取所有服务和特征后,我请求增加 MTU 使用:
private void requestMtu() {
//gatt is a BluetoothGatt instance and MAX_MTU is 512
this.gatt.requestMtu(MAX_MTU);
}
之后,在 BluetoothGattCallback
实现中,我成功获得了 MTU 请求,并且新的 MTU 与我请求的匹配:
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
super.onMtuChanged(gatt, mtu, status);
if (status == BluetoothGatt.GATT_SUCCESS) {
this.supportedMTU = mtu;
}
}
问题是,当我尝试发送一个 512 字节的数据包时,在另一端 (onCharacteristicWriteRequest:
) 我得到了 509 字节。
有什么想法吗?
MTU 大小表示可在 ATT 负载中使用的最大字节数。 ATT 写入请求负载(为特征写入发送)如下所示:
1 字节属性操作码 2 字节属性句柄 N 字节属性值
由于 MTU 大小为 512 字节,因此 N 的最大大小为 512 - 3 = 509 字节