2017-03-07 5 views
1

Hier ist das Setup:Qt BLE für Android: Kann nicht Wert des Merkmals für Custom-Service lesen

Ein Mitarbeiter ein kleines Firmware erstellt, die den Wert einer benutzerdefinierten Merkmal innerhalb eines benutzerdefinierten Dienst (nicht Standard einzigartige 128-Bit-UUID ändert) etwa einmal pro Sekunde. Das zur Übertragung verwendete Gerät verwendet eine BLE-Implementierung (Bluetooth Low Power).

Ich musste eine kleine App (nur als Beispiel) implementieren, um diesen Wert zu überwachen. Ich bin jedoch auf ein kleines Problem gestoßen. Ich habe die Anweisungen hier follwed: http://doc.qt.io/qt-5/qtbluetooth-le-overview.html und ich habe manged den Dienst zu entdecken und zu „lesen it“ (ich uns UUID), indem Sie diesen Code verwenden:

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); 
    } 

} 

Nun ist diese druckt die UUID des Dienstes aber Die Größe des Wert-Byte-Arrays ist Null. Mit einer anderen (privaten App) können wir tatsächlich sehen, wie sich das Wertefeld für das Merkmal in diesem Service ändert. Außerdem wurde, obwohl eine Verbindung zu dem Objektmerkmal "Geändertes Signal" des Dienstes hergestellt wurde, dieses Signal niemals ausgelöst, was ich mir vorstellen kann, weil der charakteristische Wert nicht gelesen werden kann.

Meine Frage ist: Gibt es etwas falsch mit dem Code, an den Sie nicht denken können? Oder ist es einfach nicht möglich, benutzerdefinierte Dienste und Merkmale mit der aktuellen BLE-Implementierung von Qt Bluetooth zu überwachen?

PD: Ich bin mit Qt 5.7.1

+0

möglicherweise müssen Sie die Deskriptoren lesen? Ist der Gatt-Server Daten in Merkmale oder Deskriptoren schreiben? – 7383

+0

Eigenschaften. Dies ist sicher, da es als eine XML-Definition in dem Code geschrieben wird, der explizit characteristic sagt. Das Merkmal hat die Eigenschaften Ändern und Lesen. – aarelovich

Antwort

1

Sie die Benachrichtigung von der charakteristischen Schreib 0x01 Client charakteristische Konfiguration Descriptor (CCCD) aktivieren.

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

Ich habe die Antwort als richtig markiert, weil es wesentlich ist, was ich getan habe. Der Client wurde von einer proprietären Umgebung konfiguriert, die XML zum Festlegen des Merkmals verwendete. Ich kann jetzt den ursprünglichen Wert lesen, aber ich werde nicht über seine Änderungen informiert. Selbst wenn ich es abfrage, bleibt der Wert gleich. Ich habe eine andere Frage darüber geöffnet http://stackoverflow.com/questions/42651989/qt-ble-for-android-characteristic-update-does-not-trigger-characteristicchanged – aarelovich

Verwandte Themen