Какие функции Bluetooth я должен использовать в своем приложении UWP для чтения характеристик с моего устройства BLE - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь прочитать характеристику температуры с моего устройства BLE (Blue gecko bgm13p22). Я пробовал в коде BLE Windows C # это

GattReadResult result = await selectedCharacteristic.ReadValueAsync(BluetoothCacheMode.Uncached);//ReadValueAsync-->Performs a Characteristic Value read from the value cache maintained by Windows or retrieve from Windows

и это

GattReadResult result = await selectedCharacteristic.ReadValueAsync();//ReadValueAsync-->Performs a Characteristic Value read from the value cache maintained by Windows or retrieve from Windows

ив package.appxmanifest я добавил это

 <DeviceCapability Name="bluetooth.genericAttributeProfile">
       <Device Id="any">
          <Function Type="name:healthThermometer" />
       </Device>
    </DeviceCapability>   
  </Capabilities>

для чтения значения температуры с устройства BLE, но оно по-прежнему не может прочитать

Любая помощь приветствуется

1 Ответ

0 голосов
/ 29 мая 2018

Blue Gecko использует принятый Bluetooth SIG сервисный термометр здоровья.Документация SIG гласит следующее: Источник: https://www.bluetooth.com/specifications/gatt

После настройки Коллектором термометр, как правило, остается отключенным между использованиями и будет только рекламировать и позволять Коллекторуподключаться, когда у термометра есть данные для отправки.В этом случае термометр войдет в режим GAP-подключения и начнет рекламу, когда у него есть данные для отправки в коллектор.Коллектор обычно выполняет процедуру установления соединения GAP таким образом, что он сканирует Термометр, используя белый список.Когда соединение установлено, термометр отправляет одно или несколько указаний или уведомлений в коллектор.Когда передача данных завершена, термометр обычно прерывает соединение.

Где коллектор - ваше приложение, а термометр - ваш Blue Gecko.

Для UWP это означает: прослушивание устройства с AdvertisingWatcher и получите устройство.Получить услугу и подключиться.Получите характеристику и установите ClientCharacteristicConfigurationDescriptor для уведомления.Реализуйте метод изменения значения характеристики.

Это означает, что значения термометра находятся в уведомлении, или вы должны прочитать значения после получения уведомления.Если уведомлений нет, читать нечего.

Я сделал пример на Github, объяснив рекламодателя и подписавшись на уведомления: https://github.com/GrooverFromHolland/SimpleBleExample_by_Devicename

Пример написан для Visual Studio 2017, ноВы можете прочитать самые важные методы и получить представление об этом, открыв файл MainPage.xaml.cs на Github.

Вы читаете температуру в байтовом массиве, связывая поле флагов (8 бит), температуру (4 байта)и необязательная метка времени (7 байт), temptype (8 бит) от https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.temperature_measurement.xml
Ваш appxmanifest должен содержать:

 <Capabilities>
    <Capability Name="internetClient" />
    <DeviceCapability Name="bluetooth" />
</Capabilities>

В моем примере добавьте следующие строки после:

 characteristicFoundMilis = stopwatch.ElapsedMilliseconds;
                           Debug.WriteLine("Characteristic found in " +
                                          (characteristicFoundMilis - serviceFoundMilis) + " ms");

Строки для добавления:

 GattCharacteristicProperties properties = charac.CharacteristicProperties;

                           if (properties.HasFlag(GattCharacteristicProperties.Read))
                           {
                              Debug.WriteLine("This characteristic supports reading from it.");                              
                           }
                           if (properties.HasFlag(GattCharacteristicProperties.Write))
                           {
                              Debug.WriteLine("This characteristic supports writing to it.");                              
                           }
                           if (properties.HasFlag(GattCharacteristicProperties.Notify))
                           {
                              Debug.WriteLine("This characteristic supports subscribing to notifications.");
                           }
                           if (properties.HasFlag(GattCharacteristicProperties.Indicate))
                           {
                              Debug.WriteLine("This characteristic supports subscribing to Indication");
                           }
...