Aus Raspberry Pi Geek 11/2022

Bluetooth Low Energy für den Raspberry Pi (Seite 2)

Bleak ziehen Sie einfach über den Befehl pip3 install bleak auf den Rechner. Zusätzlich sollten Sie den Quellcode samt Beispielen über das Github-Repo [4] des Projekts auf die Platte laden. Die Beispiele sind als Vorlagen für eigene Anwendungen sehr nützlich.

Als Alternative zu Bleak bietet sich CircuitPython mittels Blinka an. Auf dem RasPi zusammen mit den passenden BLE-Bibliotheken installiert (Listing 1), vereinfacht diese Kombination insbesondere die Kommunikation mit eigenen Mikrocontrollern, auf denen ebenfalls CircuitPython läuft. Allerdings gibt es hier eine Einschränkung, die in vielen Szenarien allerdings nicht stört: Der Raspberry Pi kann mit Blinka nur die Rolle der Zentrale übernehmen. Die Quellen zu den BLE-Bibliotheken zu CircuitPython finden Sie ebenfalls auf Github, unterhalb des Adafruit-Accounts. Auch hier gibt es viele nützliche Beispiele.

Listing 1

Blinka mit BLE

$ sudo apt-get update
$ sudo apt-get install python3-pip
$ pip3 install \
  adafruit-blinka-bleio \
  adafruit-circuitpython-ble

Das Programm in Listing 2 implementiert einen sehr einfachen BLE-Scanner. Die Endlosschleife in den Zeilen 7 bis 11 scannt alle zehn Sekunden nach Advertisements. Für jeden Treffer gibt das Programm die Bluetooth-MAC-Adresse sowie den Namen aus. Letzterer muss allerdings nicht verfügbar sein. Wenn Sie an der tatsächlichen Byte-Folge der Nachricht interessiert sind, dann geben Sie im print-Statement zusätzlich noch repr(adv) aus.

Listing 2

Einfacher BLE-Scanner

#!/usr/bin/python3
import time
import _bleio
import adafruit_ble
from adafruit_ble.advertising.standard import Advertisement
ble = adafruit_ble.BLERadio()
while True:
  print("Scanning...")
  for adv in ble.start_scan(timeout=5):
    print(adv.address,adv.complete_name)
  time.sleep(10)

Die Bleak-Installation installiert in /usr/local/bin/ das Programm bleak-lescan, das denselben Funktionsumfang wie unser einfacher BLE-Scanner hat. Die Logik ist allerdings in einem Modul versteckt und deshalb nicht so aufschlussreich wie Listing 2.

Abbildung 3 zeigt die Ausgabe des einfachen BLE-Scanners. Neben der Open-Source-Smartwatch (Bangle.js) des Autors und seinem Smartphone (HV10BB) funken noch einige Geräte aus der Nachbarwohnung.

Abbildung 3: Eine Scan-Ausgabe des einfachen BLE-Scanners aus <a href="#artRef-l2">Listing&nbsp;2</a>.

Abbildung 3: Eine Scan-Ausgabe des einfachen BLE-Scanners aus Listing 2.

Apropos Smartphone: Es gibt mehrere Apps in den Stores von Apple und Google, die beim Einstieg in BLE und beim Testen helfen. Dazu gehört etwa die App nRF Connect for Mobile von Nordic Semiconductor (Abbildung 4). Der in Sachen Bluetooth-Chips führende Hersteller bietet auf seiner Webseite [5] viele nützliche Dokumente sowie Tools und Software rund um das Thema an.

Abbildung 4: Der Verlauf der Signalst&auml;rke, gemessen mit nRF Connect.

Abbildung 4: Der Verlauf der Signalstärke, gemessen mit nRF Connect.

Eine weitere nützliche App ist Bluefruit LE Connect von Adafruit. Von diesem Anbieter gibt es nicht nur Hardware, sondern auch eine sehr große Sammlung von Tutorials auf Englisch zu allen möglichen hardwarenahen IT-Themen. Die App und ihre praktische Anwendung sind deshalb sehr gut dokumentiert.

Spezielle Mikrocontroller von Adafruit mit Bluetooth, wie etwa der Feather nRF52840 Express, eignen sich besonders gut zum Zusammenspiel mit dieser App: Sie empfängt nicht nur Daten, sondern kann auch die MCU steuern, sofern dort ein geeignetes Programm läuft.

UART

Die serielle Schnittstelle gehört zum Urgestein der IT und hat es über viele Generationen geschafft, auf immer neuen Trägertechnologien weiterzuleben. Auch für BLE gibt es einen UART-Service, den NUS (Nordic UART Service). Für viele Anwendungen spielt UART die Rolle eines Zwischenprotokolls. Das ist zwar nicht ganz im Sinne der Erfinder von Bluetooth, aber simpel. Entwickler können insbesondere bestehende Anwendungen leicht portieren.

Das Listing 3 zeigt ein Beispiel. Ein Mikrocontroller liest einen angeschlossenen BME280-Sensor aus, verpackt das Ergebnis in eine Zeichenkette und schreibt diese in die serielle Schnittstelle. Besonders gut für den Einstieg eignet sich ein XIAO nRF5280 als Mikrocontroller, denn er ist preiswert und unterstützt alle gängigen Sprachen.

Listing 3

Sensordaten mit UART übertragen

import time
import board
from adafruit_bme280 import advanced as adafruit_bme280
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
i2c = board.I2C()
#BME280 sensor:
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
[...]
BLERadio.name = "BME280_Sensor"
ble  = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)
while True:
  print("starting advertisement")
  ble.start_advertising(advertisement)
  while not ble.connected:
    pass
  print("connected")
  while ble.connected:
    measurement = "{0:0.1f},{1:0.1f},{2:0.1f}\n".format(
      bme280.temperature,
      bme280.humidity,
      bme280.pressure/alt_fac
      )
    print(measurement,end='')
    uart.write(measurement.encode("utf-8"))
    time.sleep(10)

Der Code fällt dank der CircuitPython-Bibliotheken sehr kompakt aus, aber auch mit anderen Programmiersprachen gestaltet sich das Ganze nicht viel komplizierter. Auf Client-Seite ist die Logik ähnlich. Statt der Advertisements scannt die Zentrale auf angebotene UART-Services, verbindet sich mit dem Sensor und liest von der seriellen Schnittstelle. Den kompletten Code für Server und Client finden Sie im Projekt-Repository [6] des Autors.

Über die Probleme des UART-Verfahrens stolpert man spätestens dann, wenn weitere Geräte im Netz den NUS anbieten. Das umgeht das Client-Programm dadurch, dass es den Advertisement-Namen BME280_Sensor abfragt, aber elegant ist das nicht. Sinnvoller wäre ein eigener Service, der die Datenstruktur festlegt.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 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