Почему Android Bluetooth перестает получать байты через несколько минут?
У меня проблемы с поддержанием соединения Bluetooth (от Android до устройства, которое я разрабатываю) дольше, чем на несколько минут.
Сценарий таков:
- Устройство успешно подключено.
- Устройство передает на Android где-то между 1-7 минутами (зависит от устройства или, возможно, версии Android).
- Android перестает получать байты, хотя устройство все еще передает.
Итак: почему Android BT перестает получать?
Это очень похоже на проблему / наблюдение, описанную в ответе bboydflo на этот вопрос: Приложение, использующее профиль Bluetooth SPP, не работает после обновления с Android 4.2 до Android 4.3
Еще немного предыстории:
- Устройство BT, с которым я работаю, постоянно генерирует измерительные пакеты, содержащие ~200 символов, один раз в секунду. Я уверен, что сторона устройства все еще передает, когда возникает проблема.
- Этот симптом встречается в моем приложении на двух устройствах Android: планшете Android 5.0.1 Acer и Android 7.1.1 Moto Play X
- Я проверил с приложением под названием Последовательный терминал Bluetooth. Это приложение не испытывает ту же проблему; соединение стабильно до тех пор, пока я проверял. Поэтому эта проблема, вероятно, вызвана чем-то в моем коде приложения.
- Я видел различные ответы на вопросы Android BT, предписывающие пользователю использовать асинхронные потоки, а не опрашивать полученные байты. Это, кажется, красная сельдь; Если вы чувствуете, что в этом случае модель многопоточности вызывает проблему, пожалуйста, четко опишите, почему переход к асинхронному режиму может решить эту проблему.
Я хотел бы предупредить причины, по которым этот вопрос может быть закрыт:
- Это не дубликат. Есть и другие вопросы, касающиеся SO, об обрыве BT-соединений (т.е. потоковая передача данных Bluetooth SPP в реальном времени на Android работает только в течение 5 секунд), но это не та проблема. Я уже добавил исходящий символ поддержки активности, передаваемый каждые 1 с, и моя проблема остается.
- Я не спрашиваю о проблеме, определенной для моего заявления; по крайней мере еще один пользователь в SO столкнулся с этой проблемой.
- Я подробно рассмотрел документацию по Android Bluetooth и не вижу очевидной причины для этого.
- Я не спрашиваю мнения; Я прошу объективный ответ о том, почему байты перестают быть получены.
1 ответ
Хорошо, у меня есть частичный ответ для этого. Во-первых, немного больше предыстории:
- Я выполнял опрос потока BT в потоке, который выполнял работающий каждые 2 с
- Буфер, используемый для чтения потока, имел длину 1024 элемента.
У меня было подозрение, что это может быть какой-то фоновый буфер, исчерпывающий пространство. Итак, я изменил 2 с на 500 мс, а 1024-длину на 10024. Теперь у меня было около 20 минут подключения без каких-либо проблем (и все еще продолжается).
Было бы неплохо найти для этого пистолет для курения. Сначала я думал, что stream.Available() будет достаточно, чтобы определить, заполняется ли буфер, но в этом случае stream.Available() фактически возвращает 0, когда устройство Android перестает получать. Поэтому я не совсем уверен, какую очередь проверять, чтобы доказать, что эта проблема связана с заполнением буфера.