Как обращаться с «кэшем» наблюдателя устройств старых устройств при запуске?
У меня есть одно приложение 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.