Отключение периферии, вызывающее неожиданное поведение

Используя Android 4.3 / Samsung BLE 2.0 SDK, наблюдается, что при отключении периферии SDK будет принимать onConnectionStateChange (DEVICE_DISCONNECTED) либо сразу, либо после задержки ~ 20 с. По моему опыту это зависит от периферийной реализации, некоторые из них попытаются сообщить, что они отключены, а некоторые просто нет, поэтому SDK должен ждать ~ 20 секунд для таймаута.

Чтобы удалить это поведение, я попытался использовать таймер, чтобы проверить, могу ли я прочитать определенный признак. Если время ожидания будет отключено, я вызову disconnect (Android 4.3) / cancelConnection (Samsung), чтобы завершить соединение. Сам вызов является успешным, и обратный вызов onConnectionStateChange возвращает статус GATT_SUCCESS. Затем я включил периферийное устройство и сразу же подключился к нему, обнаружил службы и столкнулся с проблемой, когда пытался читать / писать / уведомлять о любом уведомлении. Используя LightBlue в iOS, я могу подтвердить, что периферийное устройство не подключено.

Через ровно 20 секунд от выключения периферийного устройства я получаю обратный вызов DEVICE_DISCONNECTED. После этого я снова подключаюсь, и все работает отлично.

Есть два вопроса: 1. Должны ли мы подключаться к периферии в течение 20-секундной задержки? 2. Есть ли способ получить уведомление, когда периферийное устройство отключено?

Заранее спасибо.

  1. Должны ли мы подключаться к периферии в течение 20-секундной задержки? Нет. Похоже, из-за того, что ОС выполняет некоторые действия в телефоне для управления DEVICE_CONNECTED или DEVICE_DISCONNECTED , это может быть вызвано несколькими причинами, такими как архитектура устройства, причины безопасности или сам обратный вызов, задерживается для экономии энергии

  2. Есть ли способ получить уведомление, когда периферийное устройство отключено? Нет, я так не думаю. Событие, полученное для любого действия, транслируется так, что его ждет сигнал от устройства, но он не получает его, единственное, что вы можете здесь сделать, – отправить его через какую-либо другую трансляцию (или HTTP Запрос) с другого конца устройства для его достижения