Почему Android Bluetooth перестает получать байты через несколько минут? - PullRequest
0 голосов
/ 24 апреля 2018

У меня проблемы с поддержанием соединения Bluetooth (от Android до устройства, которое я разрабатываю) дольше, чем на несколько минут.

Сценарий:

  1. Устройство успешно сопряжено.
  2. Устройство передает на Android примерно от 1 до 7 минут (зависит от устройства или, возможно, версии Android).
  3. Android перестает получать байты, хотя устройство все еще передает.

Итак: почему Android BT перестает получать?

Это очень похоже на проблему / наблюдение, описанную в ответе bboydflo наэтот вопрос: Приложение, использующее профиль Bluetooth SPP, не работает после обновления с Android 4.2 до Android 4.3

Еще немного фона:

  • Устройство BT, на котором я работаюwith непрерывно испускает пакеты измерений, содержащие ~ 200 символов, один раз в секунду.Я уверен, что на стороне устройства все еще происходит передача, когда возникает проблема.
  • Этот симптом возникает в моем приложении на двух устройствах Android: планшете Android 5.0.1 Acer и Android 7.1.1 Moto Play X
  • Я тестировал приложение под названием Serial Bluetooth Terminal.Это приложение не испытывает ту же проблему;соединение стабильно до тех пор, пока я проверял.Поэтому эта проблема, вероятно, вызвана чем-то в моем коде приложения.
  • Я видел различные ответы на вопросы Android BT, предписывающие пользователю использовать асинхронные потоки, а не опрашивать полученные байты.Это, кажется, красная сельдь;если вы чувствуете, что в этом случае модель многопоточности вызывает проблему, пожалуйста, четко опишите, почему переход на асинхронный режим решит эту проблему.

Я бы хотел предупредить причины, по которым этот вопрос может бытьзакрыто:

  • Это не дубликат.Есть и другие вопросы, касающиеся SO, об обрыве BT-соединений (например, Потоковая передача данных Bluetooth SPP в реальном времени на Android работает только в течение 5 секунд ), но это не та проблема.Я уже добавил исходящий символ поддержки активности, передаваемый каждые 1 с, и моя проблема остается.
  • Я не спрашиваю о проблеме, специфичной для моего заявления;по крайней мере еще один пользователь в SO столкнулся с этой проблемой.
  • Я подробно рассмотрел документацию по Android Bluetooth и не вижу какой-либо очевидной причины для этого.
  • Iне спрашиваю мнения;Я прошу объективный ответ о том, почему байты перестают быть получены.

1 Ответ

0 голосов
/ 24 апреля 2018

Хорошо, у меня есть частичный ответ для этого. Во-первых, немного больше фона:

  • Я выполнял опрос потока BT в потоке, который выполнял исполняемый файл каждые 2 с
  • Буфер, используемый для чтения потока, имел длину 1024 элемента

У меня было подозрение, что это может быть какой-то фоновый буфер, заканчивающийся нехваткой места. Итак, Я изменил 2 с на 500 мс, а длину 1024 на 10024. Теперь у меня было около 20 минут подключения без каких-либо проблем (и все еще продолжалось).

Было бы неплохо найти для этого пистолет для курения. Сначала я думал, что stream.Available () будет достаточно, чтобы определить, заполняется ли буфер, но в этом случае stream.Available () фактически возвращает 0, когда устройство Android перестает получать. Поэтому я не совсем уверен, какую очередь проверять, чтобы доказать, что эта проблема связана с заполнением буфера.

...