android - 蓝牙网关 : negotiating new MTU succeeds but new size cannot be used (3 bytes difference)

标签 android bluetooth-lowenergy gatt

我正在开发一款使用 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 与我请求的匹配:

@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 - 蓝牙网关 : negotiating new MTU succeeds but new size cannot be used (3 bytes difference),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36435575/

相关文章:

c++ - 使用 Qt 阅读 Central Role 上的 BLE 广告

安卓应用 : Connecting to GATT server using UUIDs

Android:Google SSO - OAuth 或 AccountManager?或两者?

java - 无法解析符号 'FragmentCompat' - Camera2VideoJava - 目标为 API 29

android - BLE <-> Android, iOS设备通信是否需要Bonding?

android - 列出 BLE 设备 Android - Kotlin

android - 您如何在后台通过iPhone应用程序流音频/将其杀死到网络上?

java - 在 android 中重绘位图的更快方法?

java - 获取自己的日、年和月

java - 从字节数组序列中读取行