BLE表示UWP GATT客户端

时间:2017-05-31 11:00:14

标签: notifications uwp bluetooth-lowenergy gatt myo

我想知道,如果UWP蓝牙API和指示有问题。 如果我理解documentation正确的UWP将处理收到的指示包的确认。 但由于某种原因,示例代码适用于通知但不适用于指示。我正在尝试使用Myo腕带。 我可以通过通知特性接收通知,但不能通过指示通知。不幸的是我必须使用指示。

我稍微更改了示例代码,但它不起作用:

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.
}

任何想法我做错了什么?设备已连接并正确编程,它会发送通知。

提前感谢您提供任何帮助

马塞尔

2 个答案:

答案 0 :(得分:0)

并非所有特征都是指示。

我没有MYO,但做了一些研究,找到了一份具有MYO特征的清单:

ControlService 0x0001 Myo信息服务

MyoInfoCharacteristic 0x0101此Myo的序列号以及特定于此固件的各种参数。只读属性。

FirmwareVersionCharacteristic 0x0201当前固件版本。只读特性。

CommandCharacteristic 0x0401向Myo发出命令。只写特征。

ImuDataService 0x0002 IMU服务

IMUDataCharacteristic 0x0402 Notify-only characteristic。

MotionEventCharacteristic 0x0502运动事件数据。仅表明特征。

ClassifierService 0x0003分类器事件服务。

ClassifierEventCharacteristic 0x0103分类器事件数据。仅表明特征。

EmgDataService 0x0005原始EMG数据服务。

EmgData0Characteristic 0x0105原始EMG数据。仅通知特征。

EmgData1Characteristic 0x0205原始EMG数据。仅通知特征。

EmgData2Characteristic 0x0305原始EMG数据。仅通知特征。

EmgData3Characteristic 0x0405原始EMG数据。仅通知特征。

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";
         }
      }

答案 1 :(得分:0)

我找到了问题的答案。这不是UWP的问题,而是Myo的问题。上面的代码适用于指示,只需更改通知以指示您的好处即可。

对于未来的其他人。我用命令字节搞错了。 我误解了蓝牙标头文件并认为有效负载等于命令,但它不是那样的。所以在每个命令字节之后你必须发送金额字节,你给出"参数"。这是有效载荷。它在标题中说,但我不知何故错过了它。

因此,例如,要将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/

希望能帮助某人。