2017-05-31 56 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