Forum: Mikrocontroller und Digitale Elektronik Gleichzeitiges senden/empfangen mit HM10 BLE und Android


von Achim M. (achim_m)


Lesenswert?

Hallo,

ich versuche Datenpakete mit wenigen Byte (<=20) zwischen einem HM10 
Modul und einem Android-Phone (Galaxy S6) mit möglichst hoher Updaterate 
(>20Hz) in beide Richtungen gleichzeitig zu senden und habe dabei eine 
erstaunlich miese Performance im Vergleich zum Senden nur in einer 
Richtung.

Vorab: Es geht mir bei dieser Frage nicht darum dass mir irgendwer mein 
Problem durch ein langwieriges Frage/Antwortspiel löst - es ist klar 
dass das Thema komplex ist. Bitte nur weiterlesen/antworten falls jemand 
genau dieses Problem schon hatte (gleizeitig senden/empfangen weniger 
Bytes aber mit möglichst hoher Updaterate/geringer Latenz). Es würde mir 
auch reichen zu wissen ob es jemand anders hingekriegt hat (mit welcher 
Performance?) - auch falls mit anderem BLE-Serial Modul aber ebenfalls 
Android (Phone/Tablet).

Ein paar Details:

Das HM10 ist im "Peripheral" Mode (connect geht von Android-App aus) und 
es werden jeweils Pakete von 8 Byte geschickt (also innerhalb der 
20-Byte Grenze der characteristik).

Wenn die Übertragung nur in eine Richtung läuft ist der Empfang 
regelmäßig und ich erreiche folgende Updateraten:

Android --> HM10   > 100Hz (mehr nicht getestet weil ausreichend)

HM10 --> Android   bis 25Hz werden nur wenige Pakete verschluckt, 
darüber immer mehr (in dieser Richtung also deutlich schlechter, wäre 
aber noch ok)

Wenn ich jetzt aber gleichzeitig sende und empfange (beides mit 25 Hz 
und weniger) kommen die Pakete vom Android-Phone nur noch unregelmäßig 
beim HM10 an, in der Gegenrichtung ist die Updaterate noch halbwegs 
regelmäßig aber es kommt zu Übertragungsfehlern bei einzelnen Paketen.

Gruß,
Achim

von Jim M. (turboj)


Lesenswert?

Welche Baudrate ist beim HM10 eingestellt? Mehr als 9600 erfordert 
meiner Erfahrung nach Hardware-Handshake beim Uart.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Das ganze basiert ja auf Bluetooth LE. Für die Richtung 
Peripheral->Controller gibt es zwei technische Möglichkeiten: 
Indications, dabei läßt sich das Peripheral, die Verarbeitung der Daten 
quittieren und Notifications, bei denen diese nicht der Fall ist. 
Versuche doch mal in der Dokumentation heraus zu bekommen, wie dieses 
Modul das umsetzt und ob Du da ggf. etwas an der Umsetzung 
parametrisieren kannst.

BLE schafft die gewünschte Übertragungsrate auf jeden Fall. Das 
Bottleneck scheint die Umsetzung durch das Modul zu sein.

mfg Torsten

von Wolfgang (Gast)


Lesenswert?

Achim M. schrieb:
> ich versuche Datenpakete mit wenigen Byte (<=20) zwischen einem HM10
> Modul und einem Android-Phone (Galaxy S6) mit möglichst hoher Updaterate
> (>20Hz) in beide Richtungen gleichzeitig zu senden

Du kannst nicht gleichzeitig in beide Richtungen Daten übertragen, weil 
für beide Richtungen der gleiche Frequenzbereich genutzt wird und der 
Sender darum den eigenen Empfänger zustopft. In einer so einfachen 
Konfiguration geht es nur halbduplex, d.h. immer schön abwechselnd.

von Achim M. (achim_m)


Lesenswert?

Danke Euch für die Hinweise, das werde ich mal checken und dann 
berichten

War mir tatsächlich nicht klar das BLE nicht Vollduplexfähig ist... das 
erklärt natürlich bisschen was ;-)

Als Baudrate habe ich 38200 eingestellt, wäre ja schon etwas schräg wenn 
das HM10 dafür schon eine Sonderbehandlung (HW-Handshake) braucht - ich 
werde es aber auch mal mit 9600 testen.

von Stefan F. (Gast)


Lesenswert?

Achim M. schrieb:
> War mir tatsächlich nicht klar das BLE nicht Vollduplexfähig ist... das
> erklärt natürlich bisschen was

Soweit mir bekannt ist, sind alle Funkstrecken im Consumer Bereich 
entweder unidirektional oder Half-Duplex.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Achim M. schrieb:
> War mir tatsächlich nicht klar das BLE nicht Vollduplexfähig ist... das
> erklärt natürlich bisschen was ;-)

Auf der selben Frequenz kann nich gleichzeitig Gesendet und Empfangen 
werden. Das ist aber nicht das Problem. BLE funkt mit einer Symbolrate 
von 1MBit. In einem Connection Event, werden zuerst Daten vom Controller 
zum Peripheral gesendet und der kann dann sofort Antworten und Daten zum 
Controller funken.

Die Limitierung, die Du beobachtest liegt in der Umsetzung des Moduls, 
nicht in BLE.

von Achim M. (achim_m)


Lesenswert?

So, nach einigen Stunden rumgewurschtel:

Die Änderung meines Code in Richtung half-duplex (also immer erst senden 
wenn was empfangen wurde) schien zunächst keine Verbesserung zu bringen 
- bis ich noch eine weitere Änderung an der Android-Seite vorgenommen 
habe:

Ich sende jetzt nur noch in der Funktion onCharacteristicRead(...) (vom 
BluetoothGattCallback) - d.h. wenn der Leseprozess der zuletzt 
empfangenen Daten definitiv abgeschlossen ist. Der HM10 stellt für die 
Uart-IO nur eine Characteristik zu verfügung - vermutlich kamen sich 
schreiben und lesen dabei zuvor ins Gehege. Ich war fälschlicherweise 
davon ausgegangen dass mit dem Aufruf von onCharacteristicChanged() 
(ebenfalls BluetoothGattCallback) die Daten schon emfpangen wären und 
mit characteristic.read nur noch (aus einem Puffer) ausgelesen werden 
müssen. Es signalisiert aber nur die "notification" vom HM10 dass neue 
Daten anliegen und der leseprozess dauert dann offenbar länger - daher 
sollte man also brav auch onCharacteristicRead() implementieren!

Die max. Updaterate (jeweils ein Paket hin und eins zurück) liegt 
allerdings auch damit bei mageren 7 Hz, immerhin gibt es keine 
Übertragunsfehler mehr.

Die Uart-Baudrate hat eindeutig keinen Einfluss auf die Performance.


>> Das ganze basiert ja auf Bluetooth LE. Für die Richtung
>> Peripheral->Controller gibt es zwei technische Möglichkeiten:
>> Indications, dabei läßt sich das Peripheral, die Verarbeitung der Daten
>> quittieren und Notifications, bei denen diese nicht der Fall ist.

Ob sich hier etwas ändern lässt habe ich noch nicht recherchiert, im 
"Auslieferungszustand" verwendet der HM10 jedenfalls Notifications

Der Service der für die Uart-IO vom HM10 zur Verfügung gestellt wird ist 
ein "custom" service - d.h. keiner der in der BT4-Spezifikation gelistet 
ist und man kann offenbar auch die uuid dafür ändern. Bei meiner 
Recherche bin ich irgendwo auch über die Aussage gestolpert man könne 
(diesem Custom-Service) sogar eine zweite Characteristik hinzufügen. 
Evtl. "lauert" ja auch hier eine Möglichkeit die Perfomance zu 
verbessern.

Falls ich irgendwann noch etwas dazu rausfinde werde ich berichten, im 
Moment habe ich die Nase voll und ich gebe mich erstmal mit nur einer 
Senderichtung zufrieden ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.