Android/Java. Необходимо ли на стороне Android запрашивать обновление MTU?

Я написал прошивку для устройства BLE, и при получении пакета оно ожидает 40 байт.

Мой вопрос: необходимо ли получать событие onMtuChanged() для моего устройства Android, чтобы отправить более 23 байт? Другими словами, ПОЗВОЛЯЕТ ли этот обратный вызов моему устройству отправлять более 23 байтов?

Во-вторых, есть ли способ установить размер MTU внутри Android, чтобы мне не приходилось запрашивать обмен MTU? Мои устройства BLE отключаются после получения данных (часть ячеистой сети), поэтому мне приходится обмениваться запросами MTU каждый раз, когда я отправляю данные. Это значительно замедляет передачу.


person Community    schedule 25.02.2018    source источник


Ответы (2)


Чтобы разрешить передачу больше, чем MTU по умолчанию, необходимо согласовать новый MTU. Отправка больших пакетов без обмена большим MTU запрещена согласно спецификации. Вы можете либо инициировать изменение MTU со стороны Android (как вы уже выяснили), либо со стороны периферии (в этом случае Android не даст вам никакого обратного вызова).

Если вам не нравится дополнительная передача туда и обратно, которая требуется для этого, почему бы вам просто не отправить два пакета «Запись без ответа»? Это будет соответствовать 40 байтам и может быть отправлено во время одного события соединения.

person Emil    schedule 25.02.2018
comment
Я не могу отправить 2 пакета, так как устройство BLE отключается после получения сообщения, чтобы отправить сообщение через ячеистую сеть. - person ; 26.02.2018
comment
Тогда вы могли бы просто рассмотреть возможность изменения прошивки, чтобы вы могли принимать несколько небольших пакетов? - person Emil; 26.02.2018

Это позволяет отправлять более 23 байтов.

Вы можете использовать фрагмент:
gatt.requestMtu(MTU);//MTU is that you want to send bytes

Обратный вызов onMtuChanged(BluetoothGatt, int, int) укажет, была ли эта операция успешной.

Если вы не обмениваетесь запросами MTU каждый раз, вам следует переподключаться официальным способом, который сохраняет gatt, а не null каждый раз, когда вы хотите снова отправить байты.

person Tommy    schedule 26.02.2018
comment
Спасибо за ваш ответ, но это был скорее концептуальный вопрос, я уже знаю, как обменивать MTU. Кроме того, я работаю с более чем 50 нодами, поэтому мне приходится обнулять свой гатт каждый раунд. - person ; 26.02.2018