У нас есть телефонное приложение, на котором размещен сервер GATT с сервисом и характеристиками. В настольном приложении мы пытаемся найти его с помощью UWP API с помощью DeviceWatcher.
var deviceWatcher = DeviceInformation.CreateWatcher(
BluetoothLEDevice.GetDeviceSelectorFromPairingState(false),
new List<string>(),
DeviceInformationKind.AssociationEndpoint);
Затем мы пытаемся получить обслуживание с устройства
var serviceResult = await device.GetGattServicesForUuidAsync(ServiceId);
Но такой подход очень нестабилен. На поиск устройства и подключение к нему требуется 30-60 секунд. Иногда он не находит устройство или находит устройство, но не может получить обслуживание.
Также мы пытались связать устройство с ПК и проверять только сопряженные или подключенные устройства.
var deviceWatcher = DeviceInformation.CreateWatcher(
BluetoothLEDevice.GetDeviceSelectorFromPairingState(true),
new List<string>(),
DeviceInformationKind.AssociationEndpoint);
Но этот наблюдатель ничего не нашел. Мы пробовали разные фильтры AQS и получили те же результаты.
Также мы попытались использовать 32feet lib, чтобы получить только сопряженные подключенные устройства.
var client = new BluetoothClient();
var paired = client.DiscoverDevices(5, true, true, false);
foreach (var bluetoothDeviceInfo in paired)
{
var addressBytes = bluetoothDeviceInfo.DeviceAddress.ToByteArray();
var addr = BitConverter.ToUInt64(addressBytes, 0);
var device = await BluetoothLEDevice.FromBluetoothAddressAsync(addr));
var serviceResult = await device.GetGattServicesForUuidAsync(ServiceId);
}
Он работает быстро и находит телефон, но найденное устройство не содержит нашу службу GATT, а его адрес bluetooth отличается от устройств, обнаруженных DeviceWatcher. Похоже, что на одном телефоне есть два устройства bluetooth: первое устройство имеет нашу службу BLE, второе сопряжено, но не имеет службы.
Есть ли способ подключить правильное устройство BLE и выполнять поиск только в паре?