我想知道,如果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.
}
任何想法我做错了什么?设备已连接并正确编程,它会发送通知。
提前感谢您提供任何帮助
马塞尔
答案 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/
希望能帮助某人。