Обратный вызов Android BLE OnWriteCallback останавливается через несколько секунд
Я пытаюсь записать следующий пакет синхронно на основе условия обратного вызова OnCharacteristicWrite для достижения максимальной пропускной способности. Но по какой-то причине он перестает запускать обратный вызов OnCharacteristicWrite на начальном этапе через 1-2 секунды, и он никогда не вызывается, даже если я пересылаю пакеты. Это хорошо работает, если я добавляю задержку на пакет, но я не хочу добавлять задержку для достижения максимальной пропускной способности.
Есть ли способ, которым я мог бы достичь максимальной пропускной способности без добавления задержки?
Кроме того, что именно означает отправка нескольких пакетов за интервал соединения (и есть ли способ, которым я мог бы добиться этого через периферийное устройство)?
1 ответ
Если вы используете "Запись без ответа" (см. https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html), вы сможете отправлять несколько пакетов за интервал подключения.
Android KitKat, к сожалению, нарушил управление потоком, когда вы отправляете несколько пакетов с "Write Without Response". Если вы попробуете на более новом устройстве Android, оно должно работать правильно.
Если метод writeCharacteristic возвращает true, это просто означает, что он передал ваш пакет процессу Bluetooth. Точную логику вы можете увидеть в исходном коде по адресу https://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081. По сути, он возвращает true, если у характеристики есть свойство write, объект gatt действителен, и в настоящий момент не выполняется никакой другой ожидающей операции GATT.
Обратный вызов onCharacteristicWrite отправит статус =0, когда получен ответ на запись (для ответа с записью) или стек Bluetooth готов и имеет место в буфере для приема нового пакета (для записи без ответа).
Недавно я написал пост о том, что вы можете прочитать здесь: onCharacteristicWrite и onNotificationSent вызываются слишком быстро - как получить реальные скорости исходящих данных?,
Если вы хотите простой обходной путь для KitKat, вы можете записать 10 пакетов как "Запись без ответа", а затем 11-й пакет как "Запись с ответом", а затем начать заново с "Запись без ответов". Это должно дать вам достойную производительность.