2017-03-07 3 views
1

の特性の値を読み取ることができませんが、セットアップです:QtのBLE:カスタムサービスのためにここで

同僚は、カスタムサービス内でカスタム特性の値を変更し、小さなファームウェア(非標準のユニークな128ビットのUUIDを作成しました)毎秒約1回。送信に使用されるデバイスは、BLE(Bluetooth低電力)実装を使用します。

私はこの値を監視するために小さなアプリケーション(実際の例としてのみ)を実装する必要がありました。しかし、私は小さな問題に遭遇しました。私はここで説明follwedました:http://doc.qt.io/qt-5/qtbluetooth-le-overview.htmlを、私はこのコードを使用して(私は私たちにUUIDを取得)サービスを発見し、「それを読む」ためにうまく管理しました:今、これはサービスのUUIDを印刷し

void BLETest::on_stateChanged(QLowEnergyService::ServiceState state){ 
#ifdef DBUG 
    logger->out("Service Monitor State: " + lowEnergyServiceStateToString(state),Logger::LC_ORANGE); 
#endif 

    if (state == QLowEnergyService::ServiceDiscovered){ 
     QString chars = ""; 
     QList<QLowEnergyCharacteristic> clist = monitoredService->characteristics(); 
     for (int i = 0; i < clist.size(); i++){ 
      chars = clist.at(i).uuid().toString() + " - " + clist.at(i).name() + ": " + QString(clist.at(i).value()); 
      chars = chars + ". Value size: " + QString::number(clist.at(i).value().size()) + "<br>"; 
     } 
     if (chars.isEmpty()){ 
      chars = "No characteristics found"; 
     } 
     logger->out(chars); 
    } 

} 

が、値のバイト配列のサイズはゼロです。別の(プライベートApp)を使用すると、そのサービスの特性の値フィールドが実際に変化することがわかります。さらに、サービスのオブジェクトの特性に変更が加えられたとしても、その信号は決してトリガーされません。特性値を読み取ることができないためです。

私の質問です:考えられないコードに問題はありますか? Qt Bluetoothの現在のBLE実装でカスタムサービスや特性を監視することは不可能ですか?

PD:私はあなたがクライアントの特徴的なコンフィギュレーションディスクリプタ(CCCD)への書き込みは0x01によってchracteristic通知を有効にする必要があります

+0

あなたはディスクリプタを読む必要がありますか?特性や記述子にデータを書き込むgattサーバですか? – 7383

+0

特徴。これは明示的にcharcteristicと書かれているコードにXML定義として記述されているためです。この特性には、変更プロパティと読み取りプロパティがあります。 – aarelovich

答えて

1

のQt 5.7.1を使用しています。

foreach(QLowEnergyCharacteristic c, srv->characteristics()){ 
    QLowEnergyDescriptor d = c.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration); 
    if(!c.isValid()){ 
     continue; 
    } 
    if(c.properties() & QLowEnergyCharacteristic::Notify){ // enable notification 
     srv->writeDescriptor(d, QByteArray::fromHex("0100")); 
    } 
    if(c.properties() & QLowEnergyCharacteristic::Indicate){ // enable indication 
     srv->writeDescriptor(d, QByteArray::fromHex("0200")); 
    } 
} 
+0

私は答えが正しいとマークしました。なぜなら、私がしたことが本質的だからです。クライアントは、特性を設定するためにXMLを使用した専門環境によって構成されていました。私は今、元の値を読むことができますが、私はその変更の通知を受けていません。私がそれをポーリングしても、値は同じままです。私はそれについて別の質問を開いているhttp://stackoverflow.com/questions/42651989/qt-ble-for-android-characteristic-update-does-not-trigger-characteristicchanged – aarelovich

関連する問題