我正在开发一个使用BLE在设备之间交换数据的应用程序。

为了获得更好的性能,在连接两个设备之后,我正在协商增加MTU,以便通过BLE交换更大的数据包。

连接BluetoothDevice并读取所有服务和特性后,我请求使用以下方法增加MTU:

private void requestMtu() {
    //gatt is a BluetoothGatt instance and MAX_MTU is 512
    this.gatt.requestMtu(MAX_MTU);
}

之后,在BluetoothGattCallback实现上,我获得了MTU请求成功,并且新的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字节

关于android - BluetoothGatt : negotiating new MTU succeeds but new size cannot be used (3 bytes difference),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36435575/

10-11 00:09