Я использую BluetoothLEAdvertisementWatcher
для поиска ближайших устройств BLE, и он работает хорошо. После их поиска я хочу подключать и читать/записывать данные через GATT. Но я не могу понять, как использовать API после получения BluetoothLEAdvertisement
(https://msdn.microsoft.com/de-de/library/windows/apps/windows.devices.bluetooth.genericattributeprofile).
public class Adapter
{
private readonly BluetoothLEAdvertisementWatcher _bleWatcher = new BluetoothLEAdvertisementWatcher();
public Adapter()
{
_bleWatcher.Received += BleWatcherOnReceived;
}
private void BleWatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
// how to connect?
// I know, it the wrong place to to this, but this is just an example
}
public void StartScanningForDevices(Guid[] serviceUuids)
{
_blewatcher.advertisementfilter.advertisement.serviceuuids.clear();
foreach (var uuid in serviceuuids)
{
_blewatcher.advertisementfilter.advertisement.serviceuuids.add(uuid);
}
_blewatcher.start();
}
}
Я нашел образцы, которые используют DeviceInformation.FindAllAsync
вместо BluetoothLEAdvertisementWatcher
, но они не работают/не находят какое-либо устройство.
UPDATE
После копания в течение некоторого времени я нашел следующий способ. Но, к сожалению, спаривание терпит неудачу. Устройство - это просто Arduino с экраном BLE. Я могу определенно подключиться к Android и iOS. Поэтому это возможно с UWP.:/
private void BleWatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
// dev.DeviceInformation.Pairing.CanPair is true
// dpr.Status is Failed
DevicePairingResult dpr = await dev.DeviceInformation.Pairing.PairAsync(DevicePairingProtectionLevel.None);
var service = await GattDeviceService.FromIdAsync(dev.DeviceInformation.Id);
}
ОБНОВЛЕНИЕ # 2
Теперь я могу обнаружить и установить пару (нестабильный, но нормально пока), но
var service = await GattDeviceService.FromIdAsync(args.Id);
выбрасывает следующее исключение
System.IO.FileNotFoundException: Система не может найти указанный файл. (Исключение из HRESULT: 0x80070002)
Я не знаю, почему.