AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

BLE auf Android furchtbar langsam

Ein Thema von dudi · begonnen am 18. Sep 2023 · letzter Beitrag vom 25. Sep 2023
Antwort Antwort
dudi

Registriert seit: 21. Dez 2004
7 Beiträge
 
#1

BLE auf Android furchtbar langsam

  Alt 18. Sep 2023, 17:02
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: BLE auf Android furchtbar langsam

  Alt 19. Sep 2023, 10:27
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (19. Sep 2023 um 10:31 Uhr)
  Mit Zitat antworten Zitat
dudi

Registriert seit: 21. Dez 2004
7 Beiträge
 
#3

AW: BLE auf Android furchtbar langsam

  Alt 20. Sep 2023, 10:49
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ß
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: BLE auf Android furchtbar langsam

  Alt 20. Sep 2023, 12:37
So wie ich das verstanden habe, lässt sich die Priorität in FMX nicht so ohne Weiteres ändern.
Eine ganz kurze Suche im Quelltext zeigt, dass in der Unit Androidapi.JNI.Bluetooth.pas im Interface JBluetoothGatt sehr wohl die Funktion requestConnectionPriority enthalten ist. Die Kapselung ist also bereits direkt in Delphi enthalten.

Wie würde das denn mit der API gehen? Gibt's da eine einzubindende Headerdatei in C(hpp).
Es geht um Android und dementsprechend sind es Java-Klassen und Java-Interfaces, die du verwenden musst. Die Kapselung für Delphi kannst du per Kommandozeilentool generieren, siehe Doku:
https://docwiki.embarcadero.com/RADS...or_for_Android
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#5

AW: BLE auf Android furchtbar langsam

  Alt 20. Sep 2023, 18:50
Hat jemand eine Idee?
Wichtig ist auch der Ablauf, wie Du die Daten wirklich einfängst.

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.
  Mit Zitat antworten Zitat
dudi

Registriert seit: 21. Dez 2004
7 Beiträge
 
#6

AW: BLE auf Android furchtbar langsam

  Alt 21. Sep 2023, 11:17
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.
  Mit Zitat antworten Zitat
dudi

Registriert seit: 21. Dez 2004
7 Beiträge
 
#7

AW: BLE auf Android furchtbar langsam

  Alt 21. Sep 2023, 16:15
Moin zusammen,
eigentlich hatte ich gedacht, ich bekomme das mit den vorherigen Tips hin, Fehlanzeige!
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 auf.
  Mit Zitat antworten Zitat
dudi

Registriert seit: 21. Dez 2004
7 Beiträge
 
#8

AW: BLE auf Android furchtbar langsam

  Alt 25. Sep 2023, 17:01
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 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