BLE Указывает клиент UWP GATT

Мне было интересно, есть ли проблема с UWP Bluetooth API и Indicate. Если я понимаю документацию правильно UWP будет обрабатывать подтверждение полученного пакета Indicate. Но по какой-то причине пример кода работает для уведомлений, но не для указаний. Я пробую это с Myo Wristband. Я могу получать уведомления через характеристики уведомления, но не через указание. К сожалению, я должен использовать указание.

Я немного изменил пример кода, но он не работает:

GattCommunicationStatus status = await selectedCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(
    GattClientCharacteristicConfigurationDescriptorValue.Indicate);

if(status == GattCommunicationStatus.Success)
{
    // Server has been informed of clients interest.
}

и обработчик остается прежним:

characteristic.ValueChanged += Characteristic_ValueChanged;
// ... 
void Characteristic_ValueChanged(GattCharacteristic sender, 
                                    GattValueChangedEventArgs args)
{
    // An Indicate or Notify reported that the value has changed.
    var reader = DataReader.FromBuffer(args.CharacteristicValue)
    // Parse the data however required.
}

Любые идеи, что я делаю неправильно? Устройство подключено и правильно запрограммировано, оно отправляет уведомления.

Заранее благодарю за любую помощь

Марсель


person Marcel    schedule 31.05.2017    source источник


Ответы (2)


Не все характеристики указаны.

У меня нет MYO, но я провел небольшое исследование и нашел список с характеристиками MYO:

ControlService 0x0001 Информационная служба Myo

MyoInfoCharacteristic 0x0101 Серийный номер для этого Myo и различные параметры, характерные для этой прошивки. Атрибут только для чтения.

FirmwareVersionCharacteristic 0x0201 Текущая версия прошивки. Характеристика только для чтения.

CommandCharacteristic 0x0401 Выдача команд Myo. Характеристика только для записи.

ImuDataService 0x0002 Служба IMU

IMUDataCharacteristic 0x0402 Характеристика только для уведомления.

MotionEventCharacteristic 0x0502 Данные события движения. Указать только характеристику.

ClassifierService 0x0003 Служба событий классификатора.

ClassifierEventCharacteristic 0x0103 Данные о событии классификатора. Указать только характеристику.

EmgDataService 0x0005 Служба необработанных данных EMG.

EmgData0Characteristic 0x0105 Необработанные данные ЭМГ. Характеристика только для уведомления.

EmgData1Characteristic 0x0205 Необработанные данные ЭМГ. Характеристика только для уведомления.

EmgData2Characteristic 0x0305 Необработанные данные ЭМГ. Характеристика только для уведомления.

EmgData3Characteristic 0x0405 Необработанные данные ЭМГ. Характеристика только для уведомления.

BatteryService 0x180f Обслуживание батареи

BatteryLevelCharacteristic 0x2a19 Текущая информация об уровне заряда батареи. Прочитать/уведомить характеристику.

DeviceName 0x2a00 Данные имени устройства. Характеристика чтения/записи.

Также лучше использовать Ibuffer вместо DataReader. Я думаю, что данные, отправляемые MYO, являются BigEndian. С Ibuffer легче изменить кодировку. Вот пример использования Ibuffer:

    private async void Characteristic_ValueChanged(GattCharacteristic sender,GattValueChangedEventArgs args)
      {         
         var newValue = FormatValue(args.CharacteristicValue);
         await Task.Run(() => Process_received(newValue));
  }

 private string FormatValue(IBuffer buffer)//using Windows.Storage.Streams;
      {
          CryptographicBuffer.CopyToByteArray(buffer, out byte[] data);//using Windows.Security.Cryptography;
         try
         {
           // return Encoding.BigEndianUnicode.GetBytes(data) gives char array
           // return Encoding.UTF32.GetString(data)
            return Encoding.ASCII.GetString(data);
         }
         catch (ArgumentException)
         {
            return "Unknown format";
         }
      }
person GrooverFromHolland    schedule 31.05.2017
comment
Спасибо за ответ. Я знаю список заголовков Bluetooth. Я могу прочитать каждую характеристику Notfiy (например, характеристику EMG). Но мне нужно получить данные из ClassifierEventCharacteristic, а это Indicate. Проблема не в декодировании, мой обработчик даже не срабатывает. Но спасибо за подсказку с IBuffer, я изменю это в остальной части моего кода :-) - person Marcel; 01.06.2017
comment
Единственное, что я могу придумать, это то, что вам нужны разные обработчики событий для каждой характеристики. Вы пробовали только с указанием? Во всех образцах, которые я смог найти, Characteristic_ValueChanged сначала удаляется, а затем снова добавляется после изменения, чтобы уведомить или указать, что не имеет смысла, если вы хотите слушать оба. - person GrooverFromHolland; 01.06.2017

Я нашел ответ на свой вопрос. Это была проблема не UWP, а Myo. Приведенный выше код работает для индикации, просто измените уведомление, чтобы указать, и все готово.

Для всех остальных в будущем. Я ошибся с байтами команды. Я неправильно понял файл заголовка Bluetooth и подумал, что полезная нагрузка равна команде, но это не так. Таким образом, после каждого командного байта вы должны отправить количество байтов, которое вы указываете в качестве «аргумента». Это полезная нагрузка. В шапке написано, но я как-то пропустил.

Так, например, чтобы установить myo на EMG_none, IMU_send_all, Classifier_Enabled, вы должны отправить этот байт в CommandCharacteristic:

01 03 00 03 01

где первый 01 — это set_mode, первый 03 — полезная нагрузка (3 «аргумента»), 00 — EMG_none, второй 03 — IMU_send_all, последний 01 — Classifier_enabled.

Хотелось бы, чтобы они сделали пример команды в своем учебнике :-)

Полный заголовок можно найти здесь: https://github.com/thalmiclabs/myo-bluetooth/blob/master/myohw.h

и краткое объяснение здесь: http://developerblog.myo.com/myo-bluetooth-spec-released/

Надеюсь, это поможет кому-то.

person Marcel    schedule 02.06.2017
comment
Да забыл это. Спасибо - person Marcel; 05.06.2017