BluetoothGatt: согласование нового MTU прошло успешно, но новый размер использовать нельзя (разница в 3 байта)

Я работаю над приложением, которое обменивается данными между устройствами с помощью 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 байт.

Любые идеи?


person Omer    schedule 05.04.2016    source источник


Ответы (1)


Размер MTU представляет собой максимальное количество байтов, которое может быть использовано в полезной нагрузке ATT. Полезная нагрузка запроса записи ATT (которая отправляется для характеристической записи) выглядит следующим образом:

1 байт Код операции атрибута 2 байта Обработчик атрибута N байт Значение атрибута

Поскольку размер MTU составляет 512 байт, максимальный размер N может быть равен 512 - 3 = 509 байт.

person chrisc11    schedule 09.04.2016