Как надежно определить, что устройство BLE находится вне диапазона, чтобы правильно отключить его, а затем снова подключить? - PullRequest
0 голосов
/ 13 апреля 2019

Я пишу приложение WPF, связывающееся с датчиком пальца по BLE. Обычно это работает просто отлично: я могу сканировать датчики, выбирать один, подключать, отключать и т. Д. Однако осталась одна проблема. Когда датчик выходит за пределы диапазона, приложение перестает получать уведомления об изменении значения, которые обычно приходят каждые 10 миллисекунд. Если я попытаюсь отключить его вручную через несколько секунд с помощью этого кода:

var result = await SelectedCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.None);
if (result == GattCommunicationStatus.Success)
{
    RemoveValueChangedHandler();
    res = true;
    NotifyUser("Successfully disconnected from the selected BerryMed sensor.", NotifyType.StatusMessage);
}
else
{
    NotifyUser("Error un-registering for value changed notifications.", NotifyType.ErrorMessage);
}

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

Так есть ли способ программно обнаружить потерю соединения (когда перестают поступать уведомления), а затем вызвать этот метод, чтобы отключиться вовремя?

Я пытался использовать специальный 500-миллисекундный таймер, чтобы отслеживать уведомления об изменении значения и определять, когда они перестают поступать. Требуется 1 секунда, чтобы обнаружить это и вызвать разъединение. Но проблема в том, что отключение работает только один раз. Если я снова подключусь без выхода из приложения и снова выйду из зоны действия, то это отключение не будет работать снова. Если я перезапускаю приложение, оно повторяется - успех при отключении после первого выхода из диапазона и сбой при последующем.

1 Ответ

0 голосов
/ 13 апреля 2019

Это неправильный способ отключения.
Результат вашего метода возвращает false, потому что вы не можете записать на устройство, когда оно недоступно, поэтому этот результат ожидается.
Используйте событие ConnectionStatusChangedобработчик, чтобы выяснить, потеряно ли соединение.Используйте результат этого события для отключения.
Способ сделать это в Windows состоит в том, чтобы удалить все ссылки на объект BluetoothLEDevice для устройства (и если ни у какого другого приложения в системе нет ссылки на устройство), сработаетавтоматическое отключение после небольшого периода ожидания.Просто позвоните: bluetoothLeDevice.Dispose ();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...