![]() |
BLE auf Android furchtbar langsam
Ja Moin,
ich weiß nicht genau ob ich überhaut weitermachen soll, oder ob das sinnlos ist. Wir haben vor Jahren eine eine BLE-App unter Win10 entwickelt, die 1Khz Daten von einem Messgerät über BLE in Echtzeit sendet. Das funktioniert gut. Das ganze setzt auf der Win10 API auf und ist im CBuilder geschrieben worden. Jetzt war die Idee, es auch auf Android und Apfel laufen zu lassen. Ich habe jetzt eine kleine Anwendung geschrieben, um zu sehen wie sich das ganze verhält. Ich setze auf FMX auf und benutze das BLE-Objekt. Unter Windows läuft es, wie erwartet und liefert mir alle Daten in Echtzeit ab. Unter Android ist es eine Katastrophe! Es gehen zwar keine Daten verloren, aber die App läuft mit einen Faktor 3 nach. Das heißt, halte ich den Datenstrom an, bekomme ich noch eine ganze weile Daten. 1500 Datenpakete bekommen, das device Stromlos gemacht, dann sind noch 4000 Datenpakete nachgelaufen. Ich habe verschiedene Android-Geräte mit verschiedenen OS-Versionen getestet. Jetzt meine Fragen. Die Daten sind ja da, warum werden die so langsam durchgereicht? Ist das ein Problem vom BLE-Objekt? Liegen da noch irgendwelche Javaschichten zwischen? Was macht das so furchtbar langsam? Die Daten werden automatisch per Notify gesendet. Die einzelnen Datenpaket kommen in der Funktion BluetoothLE1CharacteristicRead an, aber immer nur Blockweise, typisch 20Bytes. Gibt's eine Möglichkeit alle vorhandenen Datenblöcke am Stück einzulesen? Hat jemand eine Idee? |
AW: BLE auf Android furchtbar langsam
Hast du die Priorität der BLE Verbindung hochgesetzt. Für schnelle Datenraten ist das unter Android zwingend erforderlich. Ich weiß allerdings leider nicht, ob diese Funktionalität in Delphi gekapselt ist. Ansonsten wirst du direkt über die API gehen müssen. Außerdem kannst du glaube ich ggf. die Paketgröße anpassen.
|
AW: BLE auf Android furchtbar langsam
Moin,
Danke für die Antwort, Komme leider aus der Windowsecke, und das sind meine ersten Gehversuche. So wie ich das verstanden habe, lässt sich die Priorität in FMX nicht so ohne Weiteres ändern. Das mit der API macht Sinn. Wie würde das denn mit der API gehen? Gibt's da eine einzubindende Headerdatei in C(hpp). Paketgröße ändern hatte ich auch schon mal drüber nachgedacht, ist eigentlich Fehlanzeige, die ist fix auf 20Bytes wegen <= Ble 4,2. und abwärtskompatibel. Gruß |
AW: BLE auf Android furchtbar langsam
Zitat:
Zitat:
![]() |
AW: BLE auf Android furchtbar langsam
Zitat:
Im OnReadChar sollte es möglichst nur minimal aufhalten und nicht blockieren, also die Daten z.B. nur in einen dynamischen Buffer schreiben, und dann in einem äußeren Loop diese Daten blockieren. Das Ganze besser ThreadSafe. Möglchst auch Kopieraktionen und Konvertierungen vermeiden, also statt UTF-8 vielleicht nur TBytes, jedenfalls keine CodePage-Conversion machen. Ist das schon so angelegt ? Falls ja, ich würde von BLE keine Geschwindigkeitsrekorde erwarten, auch weil mit Sicherheit die Rate ab geringen Entfernungen einbrechen wird. |
AW: BLE auf Android furchtbar langsam
Moin,
@Rollo62 ja, das ist so angelegt. Es werden in OnReadChar nur die Bytes abgeholt und in eine Queue geworfen. Z.Z. werden die Daten sogar verworfen und es läuft nur noch ein Zähler. @jaenicke Danke für den Tipp, wenn man weiß wonach man suchen muss, dann ist es einfacher, etwas zu finden. Ich bin aber ehrlich, ich bin gar nicht auf die Idee gekommen dort zu schauen. Erste Anlaufstelle war das Internet, das glänzt aber mit wenig Auskünften, was BLE u. FMX u. Priority angeht. Ist wohl zu speziell. Wie es in Android Studio geht, hingegen kein Problem. Die Hilfe von Embarcadero hält sich an der Stelle auch vornehm zurück. In C ist das dann "Androidapi.JNI.Bluetooth.hpp". Hier sind dann virtual bool __cdecl requestConnectionPriority(int connectionPriority) = 0 ; virtual bool __cdecl requestMtu(int mtu) = 0 ; zu finden. Leider wird die Funktion nicht requestConnectionPriority nicht durchgereicht, requestMtu schon (das geht, soweit ich weiß auch unter MS). Na mal sehen ob ich das hinbekomme. |
AW: BLE auf Android furchtbar langsam
Moin zusammen,
eigentlich hatte ich gedacht, ich bekomme das mit den vorherigen Tips hin, Fehlanzeige! :x Habe nun den ganzen Tag damit verdaddelt. Muss nochmal den Rat der Experten einholen. Ich nahm eigentlich an, das folgender Code ausreichend ist um an die requestConnectionPriority zu kommen. Androidapi.JNI.Bluetooth ist in uses eingebunden und in Androidapi.JNI.Bluetooth.pas so deklariert. TJBluetoothGatt = class(TJavaGenericImport<JBluetoothGattClass, JBluetoothGatt>) end; Hier nun mein Code: <snip> var JBluetoothGatt:TJBluetoothGatt; // requestConnectionPriority added in API level 21 begin JBluetoothGatt.Create; JBluetoothGatt.Wrap(self).requestConnectionPriorit y(JBluetoothGatt.JavaClass.CONNECTION_PRIORITY_HIG H); // das ist quatsch aber alle Funktionsaufrufe sind sichtbar, warum ???? JBluetoothGatt.Free; end; <snip> Ich hätte jetzt eher so einen Funktion erwartet: JBluetoothGatt.requestConnectionPriority(CONNECTIO N_PRIORITY_HIGH); JBluetoothGatt hat keine Funktionen. Erst Wrap lässt mich auf die Funktionen (Liste) zugreifen. Ich habe keinen Ahnung was AJINIObjektID oder IJavaInstance sein soll, mit der Wrap aufzurufen ist. Wie auch immer, ich bin mir sicher, das das völlig anders zu handeln ist. Wie geht's richtig? :?: Vielleicht geht mir ja dann ein :idea: auf. |
AW: BLE auf Android furchtbar langsam
Moin,
Ich befürchte, das es noch nicht reicht. Leider ist für mich das FMX u. dort BLE völliges Neuland. Ich habe nachdem das Device verbunden ist und auch die Notification eingeschaltet ist, versucht, requestConnectionPriority() aufzurufen. wie hier: ADevice ist das verbundenen Device in der Form "const ADevice: TBluetoothLEDevice". TJBluetoothGatt.Wrap(ADevice).requestConnectionPri ority(TJBluetoothGatt.JavaClass.CONNECTION_PRIORIT Y_LOW); Leider werden meinen Aufrufe mit einem Exception quittiert. Vielleicht kannst mir da jemand den kompletten Funktionsauruf als Beispiel zeigen. Ich habe schon zu viel Zeit mit probieren vertan. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz