Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi BluetoothLE-Subscription über App-Neustart hinaus aktiv halten (https://www.delphipraxis.net/195068-bluetoothle-subscription-ueber-app-neustart-hinaus-aktiv-halten.html)

knaeuel 30. Jan 2018 14:38

BluetoothLE-Subscription über App-Neustart hinaus aktiv halten
 
Hallo zusammen,

ich bin mir nicht sicher, ob es sich nur um ein Verständnisproblem handelt oder ob es wirklich ein (programmier-)technisches Problem ist.

Ich habe eine App programmiert, die BluetoothLE-Geräte sucht, Services und Characteristics abruft sowie zugehörige Descriptors und Properties. Anschließend werden Werte gesendet und empfangen bzw. Subscriptions für bestimmte Characteristics eingetragen.

Zum Problem:
Ich habe hier ein Blutdruckmessgerät. Die App liest die Informationen über die angebotenen Dienste ein, schreibt ein Konfigurationsbyte und empfängt anschließend Blutdruckmesswerte sowie ein paar zusätzliche Daten wie mögliche Messfehler oder andere Unregelmäßigkeiten während der Messung.

Das Messgerät schaltet sein Bluetooth erst nach der Messung an, macht etwa 10 Sekunden irgendetwas geheimnisvolles oder auch gar nichts (ich weiß es nicht) und überträgt dann die Messergebnisse. Weitere 10 Sekunden später schaltet sich das Gerät bereits ab.

Die App empfängt durch die Subscription die Messergebnisse und "dekodiert" sie.

Für eine weitere Messung wird das Messgerät wieder neu eingeschaltet. Die App dagegen läuft einfach weiter. Der Datentransfer funktioniert, ohne dass ich erneut eine Verbindung aufbauen, Services etc. abrufen oder die Subscription neu eintragen müsste.

Starte ich aber die App neu, dann komme ich nicht darum herum, innerhalb der kurzen Zeitspanne, in der das Messgerät über BluetoothLE erreichbar ist, das Gerät zu discovern, alle Dienste etc. neu einzulesen und eine erneute Subscription zu hinterlegen. Einzig das Schreiben des Konfigurationsbytes kann ich mir sparen.

Da das Messgerät in der Lage ist, die Subscription zu speichern, müsste ich doch auch in der App vergleichbares schaffen können...

Wo liegt der (Denk-)Fehler? Ich bin dankbar für jede Hilfe!
Danke schon vorab fürs Lesen!

mensch72 30. Jan 2018 16:51

AW: BluetoothLE-Subscription über App-Neustart hinaus aktiv halten
 
..."Wo liegt der (Denk-)Fehler?"...
-> in der Annahme, man könnte eine BLE Verbindung über PowerOn/Off eines der Teilnehmer "halten"... dafür gibt es "bonden" für die Einrichtung einer quasi permanenten Verbindung, aber das macht für diesen Anwendungsfall NULL Sinn.

Saubere Lösung als StateMaschiene("Sleep"-"RasterScan"-"Connect&DiscoverServices&NotifyEnable"-WaitForData(max 15sec)-"NotifyDisable&Disconnect"-"Sleep"):
- scannen bis Messgerät zu finden... in der APP nicht 1x 10sec oder gar endlos, besser 3sec-Scan, 1sec-Pause, 3sec-Scan,1sec-Pause... der BLE-Stack wird es dir Danken und Android/IOS können die APP in Pausen sauber in den Hintergrund schicken wenn es sein soll
- wenn Messgerät gefunden, dann Connect&DiscoverServices
- wenn verbunden "NotifyEnable" auf das was interessiert
- bis jetzt was kommt, kann es 10sec dauern, weil das ist die Zeit die das Messgerät der APP für obige 2 Schritte gibt
- wenn alle Daten da oder ~15sec TimeOut, dann "NotifyDisable" aus alles war angefordert wurde und dann vollen "Disconnect"
- !!! alles was mit den Scanresults und Connect/Services zu tun hat verwerfen !!!
- noch 1sec-Pause und dann die Statemaschiene der APP auf Anfang zurücksetzen... jetzt kann APP sich beenden, schlafen und/oder neu starten
- denn der Ablauf beginnt nun deterministisch wie immer wieder mit "RasterScan"...

knaeuel 31. Jan 2018 09:17

AW: BluetoothLE-Subscription über App-Neustart hinaus aktiv halten
 
hallo mensch72,

danke für die Antwort! ich habe gehofft, dass du antwortest und möchte dich nun ganz inoffiziell zum Bluetooth-Gott erklären! ;)

einmal muss ich noch nachhaken:
wenn die App einfach durchläuft und das Messgerät während dieser Zeit zweimal gestartet wird (also aus Sicht des Messgeräts Start-Messung-Datentransfer-Abschalten und nochmal Start-Messung-...), dann empfängt die App ohne neuen Verbindungsaufbau beide Datentransfers.

Ist das eine echte Funktionalität oder doch eher Zufall? Oder anders gefragt, wenn es eine echte Funktionalität ist, warum würdest du dich darauf trotzdem nicht verlassen wollen?
Weil deine Empfehlung war ja, nach jedem gelungenen Transfer einen vollständigen Disconnect durchzuführen und wieder zum Scan-State zurückzufallen.

Danke nochmal!!

knaeuel 1. Feb 2018 12:32

AW: BluetoothLE-Subscription über App-Neustart hinaus aktiv halten
 
möglicherweise hat sich das erledigt.
seit heute teste ich mit einem iPad und siehe da, ich muss auch nach jedem Neustart des Messgeräts neu verbinden, das Konfigurationsbyte schreiben und den Dienst neu abonnieren, sonst passiert da einfach gar nischt :)

nichtsdestotrotz: danke nochmal!

mensch72 2. Feb 2018 20:51

AW: BluetoothLE-Subscription über App-Neustart hinaus aktiv halten
 
:) mach so das IOS (auch)geht, dann is alles gut:)


ps:
du musst nicht "hoffen" das ich etwas zufällig lese und gerade ne Minute Zeit habe was zu tippen... es gibt auch PN, da kannst jederzeit direkt schreiben und fragen was du willst... auch wenn ich mal nicht (gleich/direkt)antworte beiße ich nicht, WorstCase bekommste aber auch mal nur emotionslos nen kommerzielles von Angebot von mir:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz