Как настроить DeviceInformation.createWatcher () для фильтрации по службам BTLE? - PullRequest
0 голосов
/ 25 апреля 2019

Попытка обнаружить устройства с низким энергопотреблением Bluetooth с помощью C ++ / winRT UWP и применить разумный фильтр.В примере с git hub приведен следующий код:

    hstring aqsAllBluetoothLEDevices = L"(System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\")";

    auto requestedProperties = single_threaded_vector<hstring>
        ({ L"System.Devices.Aep.DeviceAddress", L"System.Devices.Aep.Bluetooth.Le.IsConnectable",
            L"System.Devices.Aep.IsPresent" });

    deviceWatcher = DeviceInformation::CreateWatcher(aqsAllBluetoothLEDevices,
        requestedProperties,                                                   
        DeviceInformationKind::AssociationEndpoint                             
    );

Пока я использую вышеизложенное, я обнаруживаю все живые устройства BTLE;Я также обнаружил некоторые устройства, которые активно не рекламируются, поэтому есть некоторые ошибки с использованием

System.Devices.Aep.IsPresent

Однако я хотел бы фильтровать только на устройствах BTLE, которые следуют определенным профилям здоровья BTLE.Эти профили имеют такие сервисы, как

GATT - Blood pressure   18100000-0000-1000-8000-00805F9B34FB
GATT - Body composition 181B0000-0000-1000-8000-00805F9B34FB
GATT - Glucose  18080000-0000-1000-8000-00805F9B34FB
GATT - Health thermometer   18090000-0000-1000-8000-00805F9B34FB
GATT - Heart rate   180D0000-0000-1000-8000-00805F9B34FB
GATT - Pulse oximeter   18220000-0000-1000-8000-00805F9B34FB
GATT - Weight scale 181D0000-0000-1000-8000-00805F9B34FB

Кто-нибудь знает, как настроить deviceWatcher () для отчета только о тех устройствах, которые рекламируют один из указанных UUID сервисов?

Я пытался использовать их вprotocolId, но это ничего не обнаруживает.

1 Ответ

0 голосов
/ 30 апреля 2019

Я вижу из вашего использования DeviceInformation::CreateWatcher, что у вас есть простейшая возможная строка AQS: она различает только устройства BLE, и причина этого случая в том, что вам нужно что-то более точное, чем это.Я также вижу, что у вас есть ряд свойств, которые вы хотите снова перечислить в массиве.На данный момент вы получаете все устройства BLE обратно, независимо от того, являются ли они какими-либо из различных профилей, которые вы ищете.

В вашей проблеме есть два основных компонента:

  1. Знание правильных строк AQS для перечисленных профилей здоровья.Если у вас его нет, вы не можете вызвать CreateWatcher или использовать другие методы для вывода списка доступных на данный момент устройств, которые поддерживают эти профили через AQS.Для этого вам нужно вызвать GattDeviceService. GetDeviceSelectorFromShortId , если вы используете 16-битный идентификатор, или GattDeviceService. GetDeviceSelectorFromUuid , чтобы получить строку с использованием GUID.
  2. В вашем примере кода неясно, является ли # 1 единственной проблемой, которая остановила вас, или была проблема с недостаточно хорошим знанием синтаксиса AQS, чтобы указать, что вам нужно.Если вы не знаете название того, что вам нужно искать через AQS, синтаксис AQS остановит вас.Быстрый пример, который дает подсказку, находится внизу страницы, чтобы получить правильную строку: https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/aep-service-class-ids В вашем случае вам нужно добавить необходимые условия ИЛИ с AND, где вы всегда имеетеваш идентификатор протокола BLE в сочетании с любыми применимыми значениями System.Devices.AepService.ServiceClassId, которые вы хотите отфильтровать.Обратите особое внимание на синтаксис AQS.Более подробная документация для AQS находится здесь: https://docs.microsoft.com/en-us/windows/desktop/search/-search-3x-advancedquerysyntax
...