Для меня это решило то, что вместо того, чтобы пытаться найти мою услугу / характеристику по обратному вызову нажатия кнопки, я нахожу их в обратном вызове myBluetoothLEAdvertisementWatcher.Received
:
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
bool isMyDevice = false;
// figure out if isMyDevice should be true by checking the advertised service uuids
if (isMyDevice)
{
var bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
var serviceId = new Guid(My_Service_UUID);
var result = await bluetoothLeDevice.GetGattServicesForUuidAsync(serviceId);
if (result?.Status == GattCommunicationStatus.Success)
{
var service = result.Services.FirstOrDefault(s => s.Uuid == serviceId);
if (service != null)
{
Log?.Invoke("service found!");
var characteristicId = new Guid(My_Characteristic_UUID);
var characteristic = await service.GetCharacteristicsForUuidAsync(characteristicId);
if (characteristic?.Status == GattCommunicationStatus.Success)
{
var c = characteristic.Characteristics.FirstOrDefault(x => x.Uuid == characteristicId);
if (c != null)
{
Log?.Invoke("characteristic found");
var v = await c.ReadValueAsync();
if (v?.Status == GattCommunicationStatus.Success)
{
var reader = DataReader.FromBuffer(v.Value);
byte[] input = new byte[reader.UnconsumedBufferLength];
reader.ReadBytes(input);
// Utilize the data as needed
string str = System.Text.Encoding.Default.GetString(input);
Log?.Invoke(str);
}
}
}
}
}
}
}
Этот инструмент также действительно полезен для всех, кто разрабатывает с BLE:
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BluetoothLE
Это позволяет вам читать услуги / характеристики любого соседнего устройства BLE. Может сильно помочь с тестированием. Приложение nRF Connect также хорошо работает для тестирования.