В моем приложении UWP я хочу прочитать имя устройства других устройств BLE. Итак, я пытаюсь прочитать характеристику это с устройств. Я могу найти рекламный UUID устройства и адрес bluetooth, но не могу найти с него сервисы GATT по умолчанию. Вот мой код для получения услуги:
if (ulong.TryParse(deviceAddress, out ulong address))
{
BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(address);
var genericAccessId = ConvertFromInteger(0x1800);
GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesForUuidAsync(genericAccessId);
if (result?.Status == GattCommunicationStatus.Success)
{
var genericAccess = result.Services.FirstOrDefault(s => s.Uuid == genericAccessId);
// genericAccess is always null
if (genericAccess != null)
{
var deviceNameId = ConvertFromInteger(0x2A00);
var deviceName = await genericAccess.GetCharacteristicsForUuidAsync(deviceNameId);
if (deviceName?.Status == GattCommunicationStatus.Success)
{
var c = deviceName.Characteristics.FirstOrDefault(x => x.Uuid == deviceNameId);
if (c != null)
{
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);
}
}
}
}
}
}
public static Guid ConvertFromInteger(int i)
{
byte[] bytes = new byte[16];
BitConverter.GetBytes(i).CopyTo(bytes, 0);
return new Guid(bytes);
}
Any idea where the problem is?
Скорее всего метод ConvertFromInteger
неверный. Вместо этого попробуйте GattDeviceService.ConvertShortIdToUuid
, например. GattDeviceService.ConvertShortIdToUuid(0x1800)
.
Это было именно так. Хотя мне предложили вместо этого использовать BluetoothUuidHelper.FromShortId
, так как GattDeviceService.ConvertShortIdToUuid
устарело. Если вы опубликуете это как ответ, я приму это.
Устройство, службы и характеристики BLE имеют 128-битный UUID для идентификации. Для стандартизированных услуг и характеристик существует также 16-битная короткая версия, например. 0x1800 для Общий доступ.
Чтобы преобразовать 16-битный UUID в 128-битный, 16-битные значения должны быть заполнены следующим UUID в байтах 2 и 3 (в порядке прямого байта:
0000xxxx-0000-1000-8000-00805F9B34FB
Таким образом, 0x1800 преобразуется в:
00000018-0000-1000-8000-00805F9B34FB
В Windows есть функция, которая сделает это за вас: BluetoothUuidHelper.FromShortId
var uuid = BluetoothUuidHelper.FromShortId(0x1800);
В предыдущей версии Windows вместо этого вы использовали бы GattDeviceService.ConvertShortIdToUuid.
Поэтому замените свою функцию ConvertFromInteger
на указанную выше. Ваша функция заполняет все 0 вместо указанного выше значения UUID.
Что означает я не могу найти? Возникает ошибка? Или где выполнение пропускает остальную часть кода?