Я пытаюсь разработать приложение Windows UWP, и я пытаюсь подключиться к устройству BLE без необходимости явного сопряжения.
Чтобы убедиться, что проблема не на стороне устройства BLE, я подтвердил, что могу подключиться к устройству BLE с опцией «Just Works» через приложение NRF connect на Android и iOS.
Некоторая информация о моей настройке и о том, что я сделал до сих пор :
У меня в манифесте включены возможности Bluetooth. Я проверил, что Bluetooth работает при непосредственном сопряжении с отдельным устройством, использующим BLE, например, с некоторыми наушниками. Я убедился, что Bluetooth включен. Я могу подключиться к своему устройству BLE, когда использую опцию сопряжения, однако он каждый раз отображает всплывающее окно, и мне не нужно это всплывающее окно, я хочу, чтобы оно просто работало без какого-либо взаимодействия. Если PairAsyn c не используется, результатом FromBluetoothAddressAsyn c или FromIdAsyn c будет «Отключено». Я использую Windows 10 1909 18363.900. Я должен отметить, что раньше это работало на 1803. Все мои драйверы bluetooth обновлены. Я попробовал это на другом ноутбуке, и он не работал без всплывающего окна сопряжения.
Вот мой код:
private string DEVICE_ADDRESS_TEST = "C7:9C:0C:EE:EA:D1";
// Create BLE watcher
var bleWatcher = new BluetoothLEAdvertisementWatcher() { ScanningMode = BluetoothLEScanningMode.Active };
// add received callback
bleWatcher.Received += async (BluetoothLEAdvertisementWatcher w, BluetoothLEAdvertisementReceivedEventArgs btAdv) => {
try
{
/// SCAN FIND DEVICE
ulong longAgain = ulong.Parse(this.DEVICE_ADDRESS_TEST.Replace(":", ""), System.Globalization.NumberStyles.HexNumber);
if (btAdv.BluetoothAddress != longAgain)
{
Logging.info($"Found device: {btAdv.BluetoothAddress}");
return;
}
else
{
Logging.info($"Found BLE device [{DEVICE_ADDRESS_TEST}]");
bleWatcher.Stop();
}
// This causes a popup to appear! I don't want this.
//DevicePairingResult result = await di.Pairing.PairAsync(DevicePairingProtectionLevel.Encryption);
// This causes a popup to appear! I don't want this.
//DevicePairingResult result = await di.Pairing.PairAsync(DevicePairingProtectionLevel.None);
/// CONNECT TO DEVICE
Logging.info("Connecting...");
var device = await BluetoothLEDevice.FromBluetoothAddressAsync(longAgain);
var log1 = $"Connection state: [{device.ConnectionStatus}]";
Logging.info(log1);
if (device.ConnectionStatus != BluetoothConnectionStatus.Connected)
{
throw new Exception("FromBluetoothAddressAsync did not connect successfully.");
}
/// GET ALL SERVICES
Logging.info("Getting services..");
// 2) SERVICES!!
var result = await device.GetGattServicesAsync();
if (result.Status != GattCommunicationStatus.Success)
{
throw new Exception($"GetGattServicesAsync failed with result: status[{result.Status}], error[{result.ProtocolError}]");
}
Logging.info($"[{result.Services.Count}] services found");
}
catch (Exception e)
{
Logging.error(e.Message);
}
};
bleWatcher.Start();
Что я делаю не так? Должен быть способ подключаться к устройствам без необходимости взаимодействия с всплывающими окнами. Мне не хватает нового API? Пожалуйста, помогите!
ОБНОВЛЕНИЕ:
Я обнаружил, что выполнение GetGattServicesForUuidAsyn c или GetGattServicesAsyn c приводит к подключению устройства, однако оба они возвращают статус «Недоступен. '. Это странно, потому что я вижу свет, который показывает, подключено устройство или нет. Опять же, я должен повторить, что такое поведение наблюдается только на оконной платформе, поскольку я могу легко подключаться и получать услуги, используя «просто работающие» на android и ios.
ОБНОВЛЕНИЕ:
Вот сопряжение SS: введите описание изображения здесь