Обратный вызов Android BLE OnWriteCallback останавливается через несколько секунд

Я пытаюсь записать следующий пакет синхронно на основе условия обратного вызова OnCharacteristicWrite для достижения максимальной пропускной способности. Но по какой-то причине он перестает запускать обратный вызов OnCharacteristicWrite в самом начале через 1-2 секунды периода, и он никогда не вызывается, даже если я повторно отправляю пакеты. Это работает хорошо, если я добавляю задержку для каждого пакета, но я не хочу добавлять какую-либо задержку для достижения максимальной пропускной способности.

Можно ли как-то добиться максимальной пропускной способности без добавления каких-либо задержек?

Кроме того, что именно означает отправка нескольких пакетов за интервал соединения (и есть ли способ добиться этого через периферийное устройство)?


person Nikhil Shinde    schedule 17.05.2017    source источник
comment
Какое у вас устройство Android / версия ОС?   -  person Emil    schedule 18.05.2017
comment
Android 4.4.2 киткат   -  person Nikhil Shinde    schedule 18.05.2017
comment
@Emil Также моя версия BLE 4.2. Но я не понимаю, как отправлять несколько пакетов за интервал соединения. Я отправляю пакеты один за другим в зависимости от того, когда для каждого пакета получен обратный вызов onCharacteristicWrite. Но после определенного периода (примерно после 300 пакетов с успешным статусом обратного вызова onCharacteristicWrite 0) обратный вызов внезапно останавливается и никогда не запускается даже при повторной отправке пакета. Поэтому я добавляю задержку 8 мс между двумя пакетами, которая успешно записывает все пакеты со статусом обратного вызова 0, но на самом деле это снижает пропускную способность. Есть ли лучший способ реализовать это?   -  person Nikhil Shinde    schedule 18.05.2017
comment
@Emil Android 4.4.2 киткат   -  person Nikhil Shinde    schedule 18.05.2017
comment
Функция @Emil My Gatt WriteCharacteristic возвращает логическое значение true, когда я отправляю любой пакет. В чем разница между этим возвратом true и между статусом обратного вызова OnWriteCharacteristic -0 успешно после отправки каждого пакета??   -  person Nikhil Shinde    schedule 18.05.2017


Ответы (1)


Если вы используете запись без ответа (см. https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setWriteType(int)), вы сможете отправлять несколько пакетов за интервал подключения.

Android KitKat, к сожалению, нарушил управление потоком, когда вы отправляете несколько пакетов с «Запись без ответа». Если вы попробуете более новое устройство Android, оно должно работать правильно.

Если метод writeCharacteristic возвращает значение true, это просто означает, что он передал ваш пакет процессу Bluetooth. Вы можете увидеть точную логику в исходном коде по адресу https://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081. В основном он возвращает true, если характеристика имеет свойство записи, объект gatt действителен и в настоящее время нет другой ожидающей операции GATT.

Обратный вызов onCharacteristicWrite отправит статус = 0, когда придет ответ на запись (для записи с ответом) или стек Bluetooth готов и имеет место в буфере для приема нового пакета (для записи без ответа).

Недавно я написал сообщение об этом, которое вы можете прочитать здесь: #43744888">onCharacteristicWrite и onNotificationSent вызываются слишком быстро - как получить реальную скорость исходящих данных?.

Если вам нужен простой обходной путь для KitKat, вы можете записать 10 пакетов как «Запись без ответа», а затем 11-й пакет как «Запись с ответом», а затем начать заново с «Запись без ответов». Это должно дать вам достойную производительность.

person Emil    schedule 18.05.2017
comment
Спасибо за подробную информацию. Я могу записывать пакеты без ответа в течение короткого периода времени, но для проверки целостности данных я зацикливаю свои контакты Tx и Rx BLE и проверяю, получают ли те же данные, которые я получаю после обратного вызова OnCharacteristicChange и чтения той же характеристики. Я отправляю следующий пакет на основе этого сравнения данных. Но чтение пакета на основе OnCharacteristicChanges с той же характеристикой кажется очень медленным процессом. Также могу ли я использовать две разные характеристики: одну для записи/отправки, а другую для чтения и как? Спасибо! - person Nikhil Shinde; 19.05.2017