Как увеличить MTU в RxAndroidBle?

Я пытаюсь создать передачу данных между пользовательским периферийным устройством BLE и коммуникационной библиотекой Android, реализованной с помощью RxAndroidBle (1.4.1). У меня он работает с MTU по умолчанию (23 байта), так что Android передает только 20 байт за раз. Связь работает с MTU 23, но хотелось бы более быстрой связи.

Наше устройство поддерживает DLE и запрашивает больший MTU (158 байт) в начале связи и получает его практически со всеми мобильными телефонами. После этого устройство начинает отправлять данные размером до 155 байт за раз. Из-за этого связь между устройством и мобильным телефоном достаточно быстрая и работает нормально. Однако на стороне Android вызов getMtu() RxAndroidBle всегда возвращает 23 (даже если библиотека и тестовое приложение были созданы с minsdk = 21 и работают на Android 7.1.1). Я попытался добавить вызов RxBleConnection.requestMtu(512) после установления соединения, но это не приводит к обратным вызовам, а getMtu() по-прежнему возвращает 23.

Я попробовал это, просто вызывая setMaxBatchSize(155) для createNewLongWriteBuilder и наблюдая, что происходит. Результатом стало более быстрое общение без каких-либо проблем! (В журналах устройств я подтвердил, что в то время мы действительно получали> 20 байт). Однако, чтобы избежать неприятных сюрпризов, если устройство не поддерживает большие MTU, мне бы очень хотелось, чтобы библиотека использовала фактическое значение MTU, а не "большая догадка".

Итак, каков реальный способ получить текущий MTU в RxAndroidBle? Есть ли ошибка, которая мешает ему работать или что-то в этом роде?


person PetriL    schedule 13.10.2017    source источник
comment
Кажется, что RxBleConnection.getMtu() возвращает правильное значение только в том случае, если MTU был запрошен центральным (Android) или вообще не изменился. Похоже на ошибку в библиотеке.   -  person Dariusz Seweryn    schedule 13.10.2017
comment
Конечно выглядит так. Я попытался декомпилировать RxAndroidBle и прочитать код и нигде не смог найти код, который бы обновлял RxBleConnectionImpl.currentMtu, если requestMtu не был вызван. Что меня удивило, так это то, что requestMtu(512) тоже не помог. Возможно, изменений не было, так как соединение уже имело максимальное значение, которое может поддерживать устройство (158)...   -  person PetriL    schedule 13.10.2017
comment
Добавлено для отслеживания: github.com/Polidea/RxAndroidBle/issues/293.   -  person Dariusz Seweryn    schedule 13.10.2017
comment
Не могли бы вы попробовать версию библиотеки 1.4.2-SNAPSHOT и проверить, работает ли она у вас? Он должен вернуть правильное значение MTU   -  person Dariusz Seweryn    schedule 24.10.2017


Ответы (1)


Описанное вами поведение на самом деле является ошибкой RxAndroidBle версии 1.4.1. Значение MTU, полученное RxBleConnection.getMtu(), обновляется только тогда, когда согласование MTU начинается центральным устройством через RxBleConnection.requestMtu(int).

Существует выпуск 1.4.2, в котором эта проблема исправлена, поэтому значение MTU обновляется также, когда периферийное устройство начинает согласование.

person Dariusz Seweryn    schedule 25.10.2017