2017-05-31 51 views
0

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

我改变了代码示例一点点这一点,但它不工作:

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

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

在此先感谢您的帮助

马塞尔

回答

0

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

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

因此,例如,设置肌到EMG_none,IMU_send_all,Classifier_Enabled你必须发送该字节到CommandCharacteristic:

01 03 00 03 01 

其中第01是SET_MODE, 第03的有效载荷( 3“Arguments”), 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/

希望这将帮助别人。

+0

是的,忘记了。谢谢 – Marcel

0

并非所有的特征都指示。

我没有MYO,但做了一些研究,发现与MYO的特性列表:

ControlService×0001缪信息服务

MyoInfoCharacteristic 0x0101串行这种缪和数量的各种参数,特定于此固件。只读属性。

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

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

ImuDataService为0x0002 IMU服务

IMUDataCharacteristic西班牙语 - 玻利维亚通知,仅特征。

MotionEventCharacteristic 0x0502运动事件数据。仅指示性特征。

ClassifierService 0x0003分类器事件服务。

ClassifierEventCharacteristic 0x0103分类器事件数据。仅指示性特征。

EmgDataService 0x0005原始肌电图数据服务。

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

感谢您的回答。我知道蓝牙头列表。我可以阅读每一个Notfiy Characterisitc(例如EMG特征)。但我需要从ClassifierEventCharacteristic中获取数据,并且这是一个指示。问题不在于解码,我的处理程序甚至没有被触发。但是,感谢IBuffer的提示,将改变我的代码的其余部分:-) – Marcel

+0

我能想到的唯一的事情是,您需要针对每个特性的不同事件处理程序。 你有没有试过只显示?在我能找到的所有样本中,首先删除并在改变后重新添加了Characteristics_ValueChanged以通知或指示,如果您想要同时收听这两个样本,则不会发生任何意外。 – GrooverFromHolland