Aus Raspberry Pi Geek 08/2018

Datenlogger mit Messverstärker (Seite 2)

Listing 5

 

$ sudo btmon &
[2] 6159
Bluetooth monitor ver 5.37
= New Index: 00:2b:33:5A:62:22 (BR/EDR,USB,hci1)                [hci1] 0.064000
[...]
$ sudo hcitool lescan
< HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7      [hci1] 9.817539
[...]
EA:E6:C2:A5:17:35 (unknown)
> HCI Event: LE Meta Event (0x3e) plen 15                       [hci1] 9.906668
    LE Advertising Report (0x02)
      Num reports: 1
        Event type: Connectable undirected - ADV_IND (0x00)
        Address type: Public (0x00)
        Address: EA:E6:C2:A5:17:35 (Texas Instruments)
        Data length: 3
        Flags: 0x06
          LE General Discoverable Mode
          BR/EDR Not Supported
        RSSI: -54 dBm (0xca)
EA:E6:C2:A5:17:35 (unknown)

Bluetooth ersetzt Kabel durch eine Funkverbindung. Daten fließen zwischen genau zwei Geräten erst dann, wenn Sie diese miteinander verbinden. Das Programm Gatttool steuern Sie über eine Python-Bibliothek, was Bluepy entbehrlich macht. GATT steht für Generic Attribute Profile, über die Software beeinflussen Sie die BLE-Parameter. Dank des einfachen Aufbaus des Protokolls beim Multimeter Owon B35T genügen wenige Grundbegriffe, um an die Messdaten zu gelangen.

Der Aufruf aus der ersten Zeile von Listing 6 startet das Programm, als Parameter übergeben Sie die MAC-Adresse des Multimeters (aus Listing 3). In Zeile 3 wartet gatttool auf Anweisungen. Der Befehl connect stellt eine Punkt-zu-Punkt-Verbindung zum Messgerät her. Manchmal dauert es mehrere Sekunden, bis das Tool den Erfolg mit Connection successful quittiert.

Listing 6

 

$ sudo gatttool -b EA:E6:C2:A5:17:35 -I
[EA:E6:C2:A5:17:35][LE]> connect
Attempting to connect to EA:E6:C2:A5:17:35
Connection successful
[EA:E6:C2:A5:17:35][LE]> char-read-uuid 00002a00-0000-1000-8000-00805
handle: 0x0003   value: 4c 49 4c 4c 49 50 55 54
[EA:E6:C2:A5:17:35][LE]> char-read-uuid 0x2a00
handle: 0x0003   value: 4c 49 4c 4c 49 50 55 54
[EA:E6:C2:A5:17:35][LE]> char-read-hnd 0x0003
Characteristic value/descriptor: 4c 49 4c 4c 49 50 55 54
Notification handle = 0x002e value: 2b 30 30 32 34 20 30 00 00 00 02 00 0d 0a
Notification handle = 0x002e value: 2b 30 30 32 33 20 30 00 00 00 02 00 0d 0a

BLE-Geräte stellen sogenannte Services bereit und identifizieren diese über 128 Bit (32 Byte) lange eindeutige Ziffernfolgen (UUID, Universally Unique Identifier). Auch Variablen, die sogenannten Characteristics, sprechen Sie über solche UUIDs an. Sie lesen sie auf diese Weise aus oder setzen die Werte; unser Beispiel beschränkt sich auf das Auslesen.

Der Befehl char-read-uuid in Zeile 7, gefolgt von der UUID, liefert zwei Werte zurück: ein Handle, etwa zu vergleichen mit einem symbolischen Namen, und eine Zeichenkette. Die Ziffernfolge 0x2a00 genügt bereits als Eingabe, da diese Characteristic standardisiert ist: Sie benennt den Hersteller. Mit dem symbolischen Handle 0x0003 gelingt die Abfrage ebenfalls. Interpretiert man die Ziffern als hexadezimale ASCII-Zeichen, lautet der Text “LILLIPUT” – der Name der Inhaberin der Marke Owon.

Ohne weiteres Zutun registriert Gatttool fortlaufend sogenannte Notifications. Bei diesen Zeichenketten handelt es sich um die gesuchten Werte des Messgeräts. Die Ziffern der Anzeige (mit Vorzeichen) stehen am Anfang der 14 Bytes. Etwas mehr Mühe macht das Zuordnen der restlichen Bits.

Datenerfassung mit Python

Das Programm empfängt zwei- bis dreimal pro Sekunde 14 Bytes für den Messwert und die Einstellungen des Geräts. Listing 6 zeigt am Schluss exemplarisch die Zeichenfolge 2b 30 30 32 33 20 30 00 00 00 02 00 0d 0a.

Legen Sie nun den ASCII-Zeichensatz zugrunde, lautet die Ziffernfolge der Bytes von 0 bis 4 “+ 0 0 2 3”. Byte 10 kodiert die Einheit, hier die Ziffer 0x02 für Grad Celsius. Demnach misst das Multimeter gerade eine Temperatur von 23 Grad Celsius.

Byte 6 kodiert die Kommastelle der Anzeige, Byte 9 das Präfix der Einheit, die Bytes 7 und 8 den Rest – etwa Gleich- oder Wechselspannung, Minimum/Maximum oder einen niedrigen Ladestand der internen Batterie des Geräts.

Die Bibliothek Pexpect weist Python an, Eingaben in der Konsole zu simulieren. Mit ihr beauftragen Sie die Skriptsprache, Gatttool aufzurufen und die zurückgelieferten Daten zu lesen und auszuwerten. Sie installieren das Programm mit dem Aufruf sudo pip3 install pexpect.

In der fünften Zeile von Listing 7 übermittelt Python den Befehl gatttool -b EA:E6:C2:A5:17:35 -I so, als käme er direkt aus einem Terminal. Meldet sich Gatttool zurück, sendet Python den Befehl, sich mit dem Gerät zu verbinden (Zeile 6). In der Schleife wartet das Programm auf Ausgaben, die neben den Messwerten die Zeichenkette Notification handle enthalten (Listing 6), um sie anschließend auszugeben (Listing 8).

Listing 7

 

import pexpect
device_owon= 'EA:E6:C2:A5:17:35'
gattinst = pexpect.spawn("gatttool -b {} -I".format(device_owon))
gattinst.sendline("connect")
while True:
    gattinst.expect("Notification handle", timeout=2)
    print(gattinst.before)

Listing 8

 

b' = 0x002e value: 2b 30 30 32 32 20 30 00 00 00 02 00 0d 0a \r\n\x1b[0;94m[EA:E6:C2:A5:17:35]\x1b[0m[LE]> \r\x1b[K'

Die Fleißarbeit besteht darin, die Informationen zu extrahieren und aufzubereiten. Listing 9 zeigt ein einfaches Skript in Python, das diese Aufgabe übernimmt. Der Einfachheit halber verzichtet es auf das Dekodieren der Bytes 7 und 8.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 9 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben