BluePy Raspberry 3 b+ und HM-10 (DSD Tech)

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
ThomasWenning
User
Beiträge: 3
Registriert: Sonntag 17. März 2019, 13:09

Hallo liebe Forumteilnehmer,

ich möchte gerne über den integrierten Bluetoothadapter an einen HM-10 (DSD Tech) serielle Daten verschicken. Es sollen einfache Kommandos sein (A, B ... etc.), die dann vom Arduino entsprechend interpretiert werden sollen. Mit Bluetooth LE scheint sich einiges geändert zu haben. Der folgende Code funktioniert:

Code: Alles auswählen

from bluepy import btle

print("Connecting...")
dev = btle.Peripheral("D8:A9:8B:C2:B7:FF")

print("Services...")
for svc in dev.services:
        print(str(svc))

Das Ergebnis:

Connecting...
Services...
Service <uuid=Generic Access handleStart=1 handleEnd=11>
Service <uuid=ffe0 handleStart=16 handleEnd=65535>
Service <uuid=Generic Attribute handleStart=12 handleEnd=15>

Das Gerät wurde also richtig erkannt. Wie geht es aber nun weiter? Muss ich auf Systemebene die Geräte pairen und per Python auf die serielle Schnittstelle serial1 -> ttyAMA0 (aus /dev/) zugreifen?

Vielen Dank für Lesen und evtl. die Antworten

Liebe Grüße Thomas
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

BLE kommuniziert über die characteristics. Das ist noch einmal eine Ebene tiefer als der Service. Da musst du die passende auswählen, und solltest daran Daten schicken können. Und auch lesen und sich benachrichtigen lassen.


Mit einer seriellen Schnittstelle hat das erstmal nichts zu tun.

Zum pairing habe ich leider keine weiteren Informationen. Meine eigenen BLE Experimente sind bisher immer simpel ohne Notwendigkeit zu pairen.
ThomasWenning
User
Beiträge: 3
Registriert: Sonntag 17. März 2019, 13:09

Vielen Dank für die schnelle Antwort.

Stellt denn BluePy mir alles Notwendige zur Verfügung um Daten zu senden und zu empfangen? Woran erkenne ich das geeignete Characteristic?

Verstehe ich es richtig, dass es in Bluetooth classic Protokolle gab, die die Funktionen (Serial, Headset,...) fest zur Verfügung stellen? Und BLE Services mit ihren Characteristics (Indentifikation durch UUID) zur Verfügung stellt. Man schaut also welche Service werden zur Verfügung gestellt und nutzt eben die geeigneten dazugehörigen Characteristics (Puls, Blutdruck, etc.). Ist sehr verwirrend. Welche Characteristic sendet einfache Daten?

Vielen Dank fürs Lesen

Liebe Grüße Thomas
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die senden alle einfach Daten. Das fand ich am Anfang auch etwas verwirrend. Im Grunde ist jede Characteristic ein Wert, der einfach aus ein paar Bytes besteht. Es kommt jetzt auf den konkreten Service/die Characteristic an, *WAS* diese Bytes bedeuten. Ob sie zB einfach ein Blutdruckwert sind, der als 2-Byte-little-endian Wert zu interpretieren ist. Oder ein Strom von Daten, der einer seriellen Schnittstelle aehnelt. Beide wuerden dann zB eine Benachrichtigung schicken, wenn neue Daten da sind, und die forderst du dann an. Es gibt AFAIK keine Characteristic, die "einfach Daten" sendet im Sinne von "guck, hier serielle Schnittstelle" wie das mit dem SPP von BT classic noch so war.

Welche Characteristic die richtige ist, musst du also anhand deines Geraetes herausfinden. Die haben ueblicherweise Eigenschaften wie "READ", "NOTIFY", "WRITE" - daran sollte sich das festmachen lassen. Du kannst deinen Arduino einfach dauerhaft senden lassen, und dich mal fuer die verschiedenen Characteristiken anmelden, und schauen, wo die Werte rausfallen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hier sind die Characteristiken dargestellt, und auch welche du lesen/schreiben kannst fuer den seriellen Transfer.

http://www.martyncurrey.com/hm-10-bluet ... cteristics
ThomasWenning
User
Beiträge: 3
Registriert: Sonntag 17. März 2019, 13:09

Im Grunde kann man alles was man über Bluetooth weiß (classic) für BLE vergessen. Ein völlig anderer Ansatz. Es wird sich wohl mit der Zeit zeigen, ob das besser ist oder nicht.
Dank deiner Hilfe konnte ich mit BLE-Scanner die zuständige UUID finden. 0xFFE1-... Der Nebel hat sich etwas aufgelöst. Vielen Dank!
Ich werde als Nächstes versuchen herauszufinden wie ich 0xFFE1... per Python auslesen kann.

Liebe Grüße Thomas
Antworten