Получать уведомления BLE ›20 байт на Android

После установления соединения с периферийным устройством CC2652 BLE приложение Android, которое я использую, отправляет запрос на обновление MTU.

requestMtu (65)

Обновляет ли это размер MTU только для исходящих данных (приложение для Android)? Или я должен теперь получать уведомления размером до 65 байт?

Я могу получать уведомления только размером менее 20 байт, даже после запроса обновления MTU.

P.S: Я проверил, что одно и то же периферийное устройство может отправлять уведомления размером более 20 байт на другое центральное устройство CC2652 BLE.


person sdmello    schedule 15.03.2019    source источник
comment
Возможно, вы столкнулись с ограничениями, вытекающими из спецификации (BLE 4.0), которые потребовали бы переключения на многопакетную передачу. Обычно объекты, которые передают данные через уведомления об изменении характеристик, перемещают только 20 байтов за итерацию.   -  person Chris Stratton    schedule 15.03.2019
comment
Вы проверили полученный mtu в обратном вызове onMtuChange? В любом случае, даже если у вас большой MTU, отправляющее устройство, конечно, все еще может отправлять нужные ему маленькие пакеты.   -  person Emil    schedule 15.03.2019
comment
Также необходимо убедиться, что удаленное устройство может поддерживать атрибуты размером более 20 байт. Если другое устройство имеет данные только в 20-байтовом блоке, вы всегда будете получать 20 байтов, даже если ATT_MTU составляет +240 байтов.   -  person Youssif Saeed    schedule 16.03.2019
comment
У вас есть сниффер Bluetooth? Было бы интересно проанализировать трафик между обеими CC.   -  person maze    schedule 27.03.2019


Ответы (1)


У нас также была эта проблема в проекте, и мы обнаружили, что на нормальную передачу данных влияет размер MTU, в то время как размер уведомлений остается равным 20 байтам.

В спецификации Bluetooth Том 3, Часть F, Раздел 3.4.7.1 указан (спасибо за комментарий Эмиля):

Сервер может отправить уведомление о значении атрибута в любое время. Размер значения атрибута от 0 до (ATT_MTU-3)

Но под таблицей также указано:

Примечание: чтобы клиент мог получить атрибут long, он должен использовать запрос на чтение большого двоичного объекта после получения этого уведомления.

Мне это кажется немного запутанным. Что подразумевается под «длинным»? Больше, чем размер MTU по умолчанию? Или больше, чем согласованный размер MTU?

В конце концов, мы попробовали, но у нас ничего не получилось. Теперь мы используем уведомление в качестве триггера, а затем нашему приложению необходимо активно читать характеристику.

Обратите внимание, что на Android вам также необходимо активно установить размер MTU из вашего приложения. В противном случае телефон останется на 20 байтах. iPhone делает это автоматически.

person maze    schedule 27.03.2019
comment
Нет, это неправильно. Это также указано где-то в спецификации BT. Пожалуйста, определите эту информацию и прочтите ее, прежде чем что-то делать. Если вы прочитаете раздел 3.4.7.1 в главе «Протокол атрибутов (ATT)», то вы ясно увидите, что уведомленное значение находится между 0 и (ATT_MTU-3) байтами. Поэтому, если у вас MTU 515, вы можете отправить уведомление размером 512 байт, если хотите. - person Emil; 27.03.2019
comment
Спасибо. Я исправлю свою запись и еще раз посмотрю на спецификацию. - person maze; 27.03.2019
comment
Если я прочитал часть 3 тома F, раздел 3.4.7.1, я также увидел, что там указано: Примечание: чтобы клиент получил длинный атрибут, он должен был бы использовать запрос на чтение большого двоичного объекта после получения этого уведомления. Это поведение Я описал выше думаю. - person maze; 27.03.2019
comment
Длинный означает больше, чем может быть передано в одном пакете из-за текущего MTU. Таким образом, если текущий MTU равен 103, длинный атрибут здесь означает атрибут длиной более 100 байт. - person Emil; 27.03.2019
comment
Или на самом деле, согласно 3.2.9, длинный атрибут - это атрибут, размер которого превышает (ATT_MTU-1) байтов. Но очевидно, что это относится к запросу на чтение, поскольку там значение может быть до ATT_MTU-1. Но для уведомлений я бы сказал, что длинный атрибут - это атрибут длиннее, чем ATT_MTU-3, поскольку это имеет наибольший смысл. - person Emil; 27.03.2019
comment
Мне интересно, как ваши платформы CC делают это друг с другом. Вы уверены, что его не читают активно? Мой CC Central получает одно уведомление, а я распечатываю его содержимое только один раз. Итак, я уверен, что большое уведомление не фрагментировано. - person sdmello; 27.03.2019