German Bluetooth-Management in Class-Modulen

Creideiki

Active Member
Licensed User
Longtime User
Hallo,

ich will per Bluetooth Daten von verschiedenen Geräten auslesen.
Diese Geräte verwenden wenige Basis-Protokolle und haben individuelle Eigenschaften.
Um das abzubilden, habe ich ein Service-Modul, das die eigentliche BT-Kommunikation abwickelt, Klassen, die die Basis-Protokolle implementieren und für jeden Gerätetyp noch eine Klasse, die die Spezialitäten implementieren.

So war der Plan. Die Umsetzung wird aber komplizierter als gedacht. Ich wollte dem Service-Modul ein Objekt der jeweiligen Protokoll-Klasse übergeben, das als Element ein u.a. ein Objekt der Geräteklasse hat. Da B4A aber keine echte Klassenhierarchie unterstützt, muss ich alle Aufrufe mit CallSub machen, was die Möglichkeiten der Parameterübergabe und Ergebnisrückgabe massiv einschränkt.

Schlimmer ist aber die Kommunikation.

Der erste Ansatz war ganz naiv die Verwendung des Input- bzw. Outputstreams. Die Ausgabe ist ja kein Problem, aber die Eingabe bleibt mangels Timeout natürlich hängen, wenn beim Empfang etwas schiefgeht.

Nächste Überlegung ist die Arbeit mit Timern, in denen erst Daten abgeholt werden, wenn wirklich welche vorhanden sind. Wenn ich den Timer kurz stelle, habe ich quasi ein "Busy Wait", was Rechenzeit und damit Akku kostet. Wenn ich ihn länger stelle (also z.B. erst nach der maximalen Antwortzeit nachsehe), verlangsame ich die Kommunikation unnötig.

Dritter Anlauf sind AsyncStreams. Eingentlich eine feine Sache. Da sie aber an das Service-Modul gebunden sind (und damit auch die Callbacks im Service-Modul auflaufen), muss mein Protokoll-Klassen-Modul dem Service-Modul per CallSub mitteilen, welchem Sub im Protokoll-Modul die Daten übergeben werden sollen und das Service-Modul ruft dann per CallSub wieder das Protokoll-Modul auf... und das wird bei entsprechenden Protokollen, bei denen praktisch jedes Zeichen über das weitere Prozedere entscheidet, ziemlich aufwendig, zumal ja auch eine entsprechende Fehlerbehandlung erfolgen muss.
Außerdem muss ich mich selbst um den zeitlichen Zusammenhang zwischen Anfragen und Antworten kümmern; ich habe ja keine direkte Kontrolle mehr, wann eine Anfrage abgeschickt ist und wann die zugehörige Antwort kommt.

Vielleicht mache ich mir ja einfach zu viele Gedanken, aber ich suche einfach nach einer übersichtlichen, eleganten Lösung. Gibt es die?
 

stephankuba

Member
Licensed User
Longtime User
Das brächte ich auch.

Habe ein ähnliches Problem, ich nutze AsyncStreams zur Bluetooth-Übertragung. Leider alles in der main.
Wenn die Bluetoothübertragung läuft und ich z.B. eine Inputbox öffne bekomme ich eine Fehlermeldung und meine App stürtzt ab.

Eine saubere Lösung als Service habe ich bis jetzt aber leider auch noch nicht geschafft.

Vielleicht hats ja jemand schon. Lasst es uns wissen.
Danke.
 
Top