2017-05-31 18 views
0

UWP Bluetooth APIとIndicateに問題がある場合、私は疑問に思っていました。 私がdocumentationを正しく理解するならば、UWPは受け取ったIndicateパッケージのAcknowledgementを処理します。 しかし何らかの理由で、サンプルコードはnotifysでは動作しますが、notでは動作しません。私はMyoリストバンドでこれを試しています。 私はnotify特性を介して通知を受け取ることができますが、通知特性を介して通知を受け取ることはできません。残念ながら、私は指示を使用する必要があります。 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

は、私は私の質問への答えを見つけた: ここIbufferを使用する方法axampleです。それはUWPの問題ではなく、Myoの問題でした。上のコードはIndicateのために働きます。通知するだけでなく、あなたの良いことを変更してください。

今後の予定です。私はコマンドバイトで間違いを犯していました。 私はBluetoothヘッダーファイルを誤解し、ペイロードがコマンドと同じだと思っていましたが、それはそうではありません。だから各コマンドバイトの後に量のバイトを送信する必要があります、あなたは "引数"として与える。これはペイロードです。そのヘッダーに記載されていますが、私は何とかそれを逃した。

01 03 00 03 01 

最初の01 set_modeがあり、 最初の03のペイロード(:

だから例えば、EMG_none、IMU_send_allにミオを設定するには、あなたがCommandCharacteristicにこのバイトを送信する必要がClassifier_Enabled 3 "引数")、 00 EMG_none、 2番目の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の特性にリストを見つけていない:

にこのミョーや各種パラメータのためのMyoInfoCharacteristic 0x0101シリアル番号を

のControlServiceのは0x0001ミョー情報サービスこのファームウェアに固有です。読み取り専用属性。

FirmwareVersionCharacteristic 0x0201現在のファームウェアバージョン。読み取り専用特性。

CommandCharacteristic 0x0401 Myoにコマンドを発行します。書き込み専用の特性。

ImuDataServiceの0×0002のIMUサービス

IMUDataCharacteristic 0x0402通知のみの特性。

MotionEventCharacteristic 0x0502モーションイベントデータ。表示のみの特性。

クラシファイアサービス0x0003クラシファイアイベントサービス。

ClassifierEventCharacteristic 0x0103クラシファイアイベントデータ。表示のみの特性。

EmgDataService 0x0005未加工EMGデータサービス。

EmgData0Characteristic 0x0105生のEMGデータ。通知のみの特性。 0000325 EMGデータ。通知のみの特性。

EmgData2Characteristic 0x0305生のEMGデータ。通知のみの特性。 0000325 EMGデータ。通知のみの特性。

BatteryService 0x180fバッテリーサービス

BatteryLevelCharacteristic 0x2a19現在のバッテリーレベルの情報。読み取り/通知特性。

DeviceName 0x2a00デバイス名のデータ。読み取り/書き込み特性。

また、DataReaderの代わりにIbufferを使用することをお勧めします。私はMYOによって送信されるデータはBigEndianだと思います。 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

お返事ありがとうございます。私はBluetoothヘッダリストを知っています。すべてのNotfiy Characterisitc(例えば、EMG Characteristic)を読むことができます。しかし、私はClassifierEventCharacteristicからこのデータを取得する必要があり、これはIndicateです。問題はデコードではなく、ハンドラは起動されていません。しかし、IBufferのヒントのおかげで、私のコードの残りの部分でそれが変更されます:-) – Marcel

+0

私が考えることができるのは、それぞれの特性に対して異なるイベントハンドラが必要なことです。 試してみましたか?私が見つけたすべてのサンプルでは、​​Characteristic_ValueChangedが最初に削除され、通知または通知するために変更後に再追加されます。これは、両方を聴きたい場合には意味がありません。 – GrooverFromHolland

関連する問題