Dies ist mein erster Beitrag zu SO.
Ich habe einige Probleme beim Abonnieren von GATT-Benachrichtigungen auf Android 5.0.2.
Was ich erreichen möchte ist, einen Arduino mit einem BLE Shield an mein Android-Handy anzuschließen. Ich habe einen Sensor mit dem Arduino verbunden und möchte die Daten vom Arduino mit dem BLE-Schild zu meinem Telefon senden. Es gibt einen nRF8001 auf dem Schild, der der Server ist, mein Telefon / App ist der Client.
Bisher habe ich eine Android-App erstellt, die nach BLE-Geräten sucht. Es kann eine Verbindung zu einem Gerät herstellen und Merkmale lesen oder schreiben. Also kann ich das Merkmal "manuell" lesen, indem ich gatt.readCharacteristic(mCharacteristic);
aufruft. Dies ermöglicht mir, die Sensorwerte vom Arduino zu erhalten.
Ich habe auch einen benutzerdefinierten Service mit nRFGo Studio erstellt. Ich weiß, dass dieser Teil funktioniert, da ich in der Lage bin, zu entdecken, zu verbinden und sogar über Änderungen des Merkmals benachrichtigt zu werden, indem ich die BLE Scanner App verwende, die bei Google Play verfügbar ist.
Aber das Abonnieren der Benachrichtigungen in meiner eigenen App wird nicht funktionieren. Nun, zumindest funktioniert das Abonnement, aber onCharacteristicChanged(...)
wird nie aufgerufen. Was komisch ist, ist die Tatsache, dass wenn ich das Merkmal in meiner App abonniere und danach es mit der BLE-Scanner-App abonniere, plötzlich onCharacteristicChanged(...)
aufgerufen wird, bis ich mich wieder über die BLE-Scanner-App abmelde. (Ich kann das im Log sehen)
Mein Android-Code lautet wie folgt: Der GATT-Rückruf:
%Vor%So verbinde ich mich mit GATT:
%Vor%Der gesamte Code wird in einem Hintergrunddienst ausgeführt, der gestartet wird, nachdem ein BLE-Gerät ausgewählt wurde.
Was ich versucht habe war, Dinge zu implementieren, wie sie im Google Dev API Guide beschrieben sind, und ich habe auch diese Lösung (ohne Erfolg). Weder Suche auf Google, lesen Fragen bereits auf SO gefragt (Zum Beispiel dieses ) oder ein Blick auf die Nordic Developer Zone hat in diesem Fall viel geholfen.
Schließlich meine Frage lautet: Was habe ich falsch gemacht? Fehle ich etwas? Ich kann es einfach nicht verstehen und es macht mich jetzt zwei Tage lang verrückt. Ich weiß nicht, wo ich sonst nach einer Lösung suchen könnte, also hoffe ich, dass du mir helfen kannst.
Globals-Klasse bearbeiten:
%Vor%BEARBEITEN Was mache ich im BLE-Scanner: Ich scanne einfach nach BLE-Geräten. Es findet mein Gerät und nachdem ich darauf geklickt habe, zeigt es mir alle meine Dienste, die ich auf dem Arduino Board eingerichtet habe. Nachdem ich einen Service ausgewählt habe, werden mir alle Daten angezeigt, die ich für diesen Service angegeben habe. Und wenn ich auf ein Merkmal tippe, zeigt es mir seine UUID und die UUID seines Dienstes an. Außerdem ermöglicht mir die BLE Scanner App, die Benachrichtigung zu abonnieren oder das Merkmal zu lesen. Wenn ich abonniere, wird der Wert kontinuierlich aktualisiert.
Also, ich habe meinen Fehler endlich herausgefunden :)
Wie Sie oben sehen können, verwende ich eine UUID mit der gleichen Basis für meinen Deskriptor wie meine Merkmale (beginnend mit 3f54XXXX-....
)
Ich habe es in public static final UUID X_ACCEL_DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
geändert und jetzt funktioniert alles wie erwartet.
Ich habe das vorher nicht gemacht, weil ich dachte, dass es für jedes Merkmal einen Deskriptor geben sollte. Aber in der Tat, nach der Client-Merkmalkonfiguration die ...
[...] Der Deskriptor muss über Verbindungen für verbundene Geräte persistent sein. Der Deskriptor für die Clientcharakteristikkonfiguration ist für jeden Client eindeutig.
Also habe ich das Beispiel der RedBearLab Android App überprüft und gesehen, dass die UUID des Deskriptors derjenigen entspricht, die auf anderen SO Antworten gepostet wurde.
Dies erklärt auch, warum meine App Benachrichtigungen erhalten hat, nachdem ich sie in der BLE Scanner App aktiviert habe: Da der Deskriptor über alle Verbindungen für verbundene Geräte persistent sein soll, hat die BLE Scanner App auch diese UUID für den Deskriptor verwendet und somit Benachrichtigungen für die Client (= mein Telefon).
customBluetoothGatt.setCharacteristicNotification (Merkmal, aktiviert);
%Vor%Legen Sie nun die Deskriptoreigenschaft ENABLE_INDICATION_VALUE
festTags und Links android arduino bluetooth-lowenergy gatt