Подтвердить что ты не робот

Android обнаруживает Bluetooth-разъединение сразу Макс. 2 секунды

Я ищу способ обнаружить отсоединение устройства Bluetooth сразу после его возникновения (максимум 2 секунды), как правило, в сценарии "слишком далеко" или аккумулятор устройства разрядился. В настоящее время я могу обнаружить его с помощью BroadcastReceiver, получив BluetoothDevice.ACTION_ACL_DISCONNECTED, но требуется около 16-20 секунд для запуска.

  • Есть ли способ получить уведомление за 2 секунды Макс.
  • Я использовал BroadcatReceiver, но он недостаточно быстр, чтобы получить оповещение в течение 2 секунд Max, так что есть какой-либо другой подход, позволяющий быстро получать уведомление о том, что Bluetooth отключен.
  • Я использую this createRfcommSocketToServiceRecord (UUID); для подключения сопряженного устройства, и я буду использовать его с помощью UUID.

Я посетил множество ссылок по этой проблеме, но никто не соответствует моим потребностям. Поэтому любая помощь будет оценена по достоинству.

спасибо.

4b9b3361

Ответ 1

Я думаю, что единственный способ, которым вы можете надежно ощущать потерю соединения быстро (в течение двух секунд), - это ваш собственный протокол приложений, который вы используете по Bluetooth-соединению. Например, ваш протокол приложения может выполнять биение, которое происходит каждые 500 мс. Если вы не видите биения в течение двух секунд, вы можете вызвать свое собственное событие.

Bluetooth - это потоковый протокол на основе сокетов, который предназначен для работы над ненадежным носителем (т.е. радио), и поэтому должен допускать ошибки в (или потерях) пакетов. По этой причине вам потребуется значительно больше, чем за 2 секунды до того, как ваш стек Bluetooth объявит, что он отказался и отключил устройство, как вы уже нашли.

У меня есть приложение на Play, которое предназначено для общения с автомобильным ECU через Bluetooth, и моя стратегия обнаружения отключения в точности такая же, как и в первом абзаце.

Обновление 20 июня 14

Я вижу в своем комментарии о бонусе, а также ваш комментарий ниже, что вы просите пример кода, но мне сложно предоставить его, не зная ничего о протоколе приложения, которое вы используете через соединение сокета, Или, говоря другим способом, что именно происходит с моим первым абзацем (т.е. Предложением сердцебиения), что вы не понимаете или не можете создать код для себя? Концепция использования сердечного ритма на самом деле довольно проста. Вы определяете определенный тип сообщения в своем протоколе приложения, который представляет сообщение с биением. Один конец соединения периодически посылает это сообщение, повторяя каждую секунду. Другой конец соединения проверяет, что это сообщение сердцебиения принимается каждую секунду или около того, и прекращает соединение после двухсекундного тайм-аута. Невозможно быть более конкретным, чем это, потому что я не вижу ваш существующий код, и я не знаю, какие сообщения вы сейчас обмениваете на сокет.

Ответ 2

После того, как ничего не обойдется! У меня есть две вещи, чтобы выполнить мою работу.

  • Мне нужно проверить, что мой Bluetooth-разъем не используется (Отправка приема) до 2-5 секунд. Я отключу это, и когда пользователь хочет отправить данные на устройство-приемник, я снова подключу это.

  • Или я попытаюсь подключить сокет через 2-5 сек, чтобы, если он не готов к подключению, он уже подключен, иначе он будет подключен, и я обновляю предыдущие ссылки на сокеты.

но первый вариант более ценен, чтобы отлично работать в моей проблеме.

Ответ 3

Это проблема со старым bluetooth и большим количеством аппаратного обеспечения, чем с программным обеспечением.

Если вы хотите заметить, что соединение нарушено, вам нужно сделать опрос (сердцебиение), что-то вроде "вы живы? вы живы?"... Это плохо для батареи, поэтому... пользователи будут наконец, удалите свое приложение.

Я рекомендую вам перейти на BTLE (низкая энергия bluetooth), такие устройства, как Nexus 5, имеют это. С BTLE у вас есть профиль близости, который может рассказать вам о качестве сигнала, поэтому вы можете угадать расстояние (вблизи, далеко, вне пределов диапазона), и поэтому вы также можете узнать, отсоединены ли устройства.

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

Проверьте это: https://developer.bluetooth.org/TechnologyOverview/Pages/PXP.aspx

С другой стороны, Apple изобрела концепцию iBeacons, устройств, которые дистанционно осведомлены, и хорошо, что есть также реализация iBeacons для Android: http://developer.radiusnetworks.com/ibeacon/android/