Как обращаться с «кэшем» наблюдателя устройств старых устройств при запуске?

У меня есть одно приложение BLE. Когда я запускаю сканирование устройств, событие немедленно вызывается и показывает ранее подключенные устройства, которые в настоящее время выключены. Но в DeviceWatcher.Removedсобытие будет очищено.

Как я могу предотвратить эту ситуацию. В моем приложении я пытаюсь подключить устройство немедленно, когда когда-либо есть устройство, указанное в DeviceWatcher.Addedмероприятие. Я не хочу ждать, пока DeviceWatcher.EnumerationCompletedмероприятие.

Из-за этой реализации API подключения BluetoothLEDevice bluetoothLEDevice = BluetoothLEDevice::FromIdAsync(GetId()).get();возвращает успех. И в сервисном API сканирования GattDeviceServicesResult result = m_BluetoothLEDevice.GetGattServicesAsync(BluetoothCacheMode::Uncached).get();я получаю GattCommunicationStatus::Unreachableстатус.

Мне нужен этот статус в начальный момент сканирования. Или есть другой способ проверить, недоступно устройство или нет?

1 ответ

Образец, написанный здесь, написан на C#, вы можете найти замену C++ на docs.microsoft.com.

  • Вы можете получить все сопряженные устройства BLE, подобные этому.
      var pairedBleDevices = await DeviceInformation.FindAllAsync(BluetoothLEDevice.GetDeviceSelectorFromPairingState(true)); # Return all the paired Bluetooth LE devices

Теперь, если вы хотите удалить сопряжение определенного устройства, вы можете пройтись по парным BleDevices и найти устройство для удаления, сопоставив определенное свойство, скажем, имя или адрес устройства.

      foreach (var device in pairedBleDevices )
{
    if (!device::Name.Contains("myDevice")) continue;
    await device.Pairing.UnpairAsync();
    break;
}
  • Теперь, когда у вас есть все ранее сопряженные устройства LE со свойствами, как предложил Майк, вы можете использовать BluetoothLEAdvertisementWatcher для обнаружения устройств BLE и фильтрации рекламы, сопоставляя BluetoothAddress(с сопряженного устройства). Если вы найдете новое устройство, подключите его или выполните операцию GATT и начните общение.

  • Вы получаете GattCommunicationStatus::Unreachable, вероятно, устройство, с которым вы пытаетесь связаться, находится в спящем режиме. Таким образом, лучший способ — сначала захватить рекламу с помощью BluetoothLEAdvertisementWatcher, а затем инициировать сопряжение или операцию GATT.

Другие вопросы по тегам