ubluepy — Bluetooth-LE-Peripheriegerät und Central¶
Das ubluepy-Modul ist die veraltete Bluetooth-LE-API, die mit dem MicroPython-nRF-Port ausgeliefert wird. Es ist lose an die Linux-Python-Bibliothek bluepy angelehnt und setzt direkt auf dem Nordic SoftDevice auf — es gibt kein portierbares Back-End, sodass das Modul nur auf Nordic-Zielen verfügbar ist (in OpenMVs Produktpalette dem Arduino Nano 33 BLE Sense). Die neueren APIs bluetooth / aioble sind in diesem Build nicht aktiviert, sodass ubluepy die einzige Möglichkeit ist, das integrierte Funkmodul anzusteuern.
Der verfügbare Funktionsumfang hängt vom durch die Firmware geflashten SoftDevice ab:
s140 (Nano 33 BLE Sense) — sowohl die Peripheriegerät- als auch die Central-Rolle (Scanner). Genau dies liefert die OpenMV-Firmware aus.
s132 — sowohl Peripheriegerät als auch Central.
s110 — nur Peripheriegerät; Scanner-/Verbindungsmethoden sind herauskompiliert.
Peripheriegerät-Beispiel¶
Als Bluetooth-LE-Peripheriegerät mit einem einzelnen Umgebungssensor-Dienst (Environmental Sensing) werben und bei jedem Schreibzugriff auf den zugehörigen Client Characteristic Configuration Descriptor (CCCD) eine Temperatur-Charakteristik notifizieren:
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
from machine import LED
notif_enabled = False
def event_handler(event_id, handle, data):
global notif_enabled
if event_id == constants.EVT_GAP_CONNECTED:
LED("LED_GREEN").on()
elif event_id == constants.EVT_GAP_DISCONNECTED:
LED("LED_GREEN").off()
periph.advertise(device_name="Nano 33", services=[svc])
elif event_id == constants.EVT_GATTS_WRITE:
notif_enabled = bool(data[0])
svc = Service(UUID("181A")) # Environmental Sensing
char = Characteristic(UUID("2A6E"),
props=Characteristic.PROP_NOTIFY | Characteristic.PROP_READ,
attrs=Characteristic.ATTR_CCCD)
svc.addCharacteristic(char)
periph = Peripheral()
periph.addService(svc)
periph.setConnectionHandler(event_handler)
periph.advertise(device_name="Nano 33", services=[svc])
Central-Beispiel¶
100 ms lang nach umliegenden werbenden Geräten scannen und die Werbedaten jedes ScanEntry dekodieren:
from ubluepy import Scanner, constants
s = Scanner()
for entry in s.scan(100):
print(entry.addr(), entry.rssi(), "dBm")
for ad_type, name, value in entry.getScanData():
print(" ", ad_type, name, bytes(value))
Modulinhalt¶
Klassen¶
- class ubluepy.UUID(value)¶
Konstruiert eine 16- oder 128-Bit-Bluetooth-UUID.
valueEines von:
int— eine 16-Bit-Zahl-UUID (UUID(0x180A)).6-stellige
"0xXXXX"-Zeichenkette — eine 16-Bit-UUID, z. B.UUID("0x181A").36-stellige
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"-Zeichenkette — eine vollständige 128-Bit-UUID. Der herstellerspezifische Anteil wird bei der Konstruktion beim SoftDevice registriert.Eine weitere
UUID-Instanz — erstellt eine Kopie.
Jede andere Länge löst
ValueError("Invalid UUID string length")aus.
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definiert einen GATT-Dienst, der beim SoftDevice registriert wird, sobald er einem
Peripheralhinzugefügt wird.uuidEine
UUID-Instanz. Die Übergabe eines Nicht-UUID-Objekts löstValueErroraus.typeEntweder
Service.PRIMARY(Standard) oderService.SECONDARY. Andere Werte lösenValueErroraus.
- addCharacteristic(characteristic: Characteristic) None¶
Registriert eine
Characteristicbeim Dienst. Das GATT-Handle der Charakteristik wird während dieses Aufrufs zugewiesen.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Sucht eine zuvor hinzugefügte
Characteristicanhand der UUID. Gibt die Charakteristik-Instanz zurück oderNone, falls keine Übereinstimmung gefunden wird.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definiert eine GATT-Charakteristik. Fügen Sie sie mit
Service.addCharacteristic()einemServicehinzu, bevor das übergeordnetePeripheralmit dem Werben beginnt.uuidEine
UUID-Instanz.props(nur als Schlüsselwort)Bitmaske aus einem oder mehreren
Characteristic.PROP_*-Werten, die beschreiben, welche Operationen die Charakteristik unterstützt.attrs(nur als Schlüsselwort)Bitmaske zusätzlicher GATT-Attribute. Verwenden Sie
Characteristic.ATTR_CCCD, um einen Client Characteristic Configuration Descriptor anzuhängen — erforderlich, damitPROP_NOTIFY- /PROP_INDICATE-Charakteristiken funktionieren.
- read() bytearray¶
Nur Central-Rolle. Liest den Wert der Charakteristik vom verbundenen Peer. Gibt ein
bytearraymit dem aktuellsten Wert zurück. Auf einem Peripheriegerät ist dies ein No-Op und gibtNonezurück.
- write(data, *, with_response: bool = False) None¶
Schreibt in die Charakteristik.
Auf einem Peripheriegerät wird der Wert, falls
PROP_NOTIFYin den Eigenschaften der Charakteristik gesetzt ist, als GATT-Notification an das verbundene Central gesendet; andernfalls wird der lokale Attributwert aktualisiert.Auf einem Central wird der Wert auf den entfernten Peer geschrieben. Setzen Sie
with_response=True, um anstelle eines Schreibbefehls eine Schreibanforderung auszugeben und auf die Bestätigung des Peers zu warten.
dataist ein beliebiges Objekt nach dem Buffer-Protokoll (bytes,bytearray,memoryview).
- PROP_INDICATE: int¶
Charakteristik kann Indications (bestätigte Notifications) an ein abonniertes Central senden (
0x20).
- class ubluepy.Descriptor(uuid: UUID)¶
Stub-Klasse zur Repräsentation von GATT-Deskriptoren. Die aktuelle Implementierung speichert nur die UUID und stellt keine Methoden bereit — sie ist für die Vorwärtskompatibilität mit künftigen Überarbeitungen des Moduls vorgesehen.
- class ubluepy.Peripheral¶
Das lokale Bluetooth-LE-Gerät. Dieselbe Klasse wird sowohl für die Peripheriegerät- als auch für die Central-Rolle verwendet; die Rolle wird dadurch ausgewählt, welche Methoden Sie aufrufen (
advertise()wählt das Peripheriegerät,connect()wählt das Central).- addService(service: Service) None¶
Registriert einen
Service(und alle zuvor hinzugefügten Charakteristiken) beim lokalen GATT-Server.
- getServices() list¶
Gibt die Liste der aktuell bei diesem
Peripheralregistrierten Dienste zurück.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Beginnt mit dem Werben in der Peripheriegerät-Rolle.
device_nameVollständiger lokaler Name, der im GAP-Payload beworben wird.
servicesListe von
Service-Instanzen, für die geworben werden soll. Die UUID jedes Dienstes wird in die Werbung aufgenommen.dataOptionaler roher Werbe-Payload (
bytes/bytearray), der an den automatisch generierten Header angehängt wird. Verwenden Sie dies für herstellerspezifische oder Beacon-Payloads wie Eddystone.connectableBei
True(Standard) wird als verbindbares Gerät geworben und es werden GAP-/GATTS-Event-Handler registriert, sodass der konfiguriertesetConnectionHandler()-Callback bei Verbindung, Trennung und CCCD-Schreibzugriffen ausgelöst wird. BeiFalsewird als Beacon geworben — es werden keine Handler angehängt und das Gerät kann nicht verbunden werden.
- setConnectionHandler(func) None¶
Registriert einen Callback, der bei GAP- und GATTS-Events aufgerufen wird. Der Callback wird als
func(event_id, conn_handle, data)aufgerufen, wobeievent_ideiner der Werteconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDoderconstants.EVT_GATTS_WRITEist,conn_handledas SoftDevice-Verbindungshandle (oder das Attribut-Handle bei GATTS-Schreibzugriffen) ist unddatader rohe Event-Payload alsbytearrayist (oderNonebei Verbindung / Trennung).
- setNotificationHandler(func) None¶
Registriert einen Callback für Notification-Events, die in der Central-Rolle empfangen werden.
- withDelegate(delegate: DefaultDelegate) None¶
Hängt eine
DefaultDelegate-Instanz an, um dekodierte GATT-Events zu empfangen.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Nur Central-Rolle. Verbindet sich mit dem Peer unter der angegebenen Adresse und ermittelt synchron dessen primäre Dienste und Charakteristiken. Blockiert, bis die Verbindung hergestellt ist und die Ermittlung abgeschlossen ist; die ermittelten Dienste sind anschließend über
getServices()verfügbar.addrPeer-Adresse als 17-stellige
"xx:xx:xx:xx:xx:xx"-Zeichenkette (z. B. vonScanEntry.addr()übernommen).addr_type(nur als Schlüsselwort)Entweder
constants.ADDR_TYPE_PUBLIC(Standard) oderconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
GAP-Observer zum Auffinden umliegender werbender Geräte. Nur verfügbar, wenn die Firmware gegen ein SoftDevice mit Central-Unterstützung (s132 / s140) gebaut wurde.
- class ubluepy.ScanEntry¶
Ein einzelner Werbe-Report, der von
Scanner.scan()erfasst wurde. Instanzen werden vom Scanner zurückgegeben — es gibt keinen öffentlichen Konstruktor.- addr_type() int¶
Gibt den Peer-Adresstyp zurück (
constants.ADDR_TYPE_PUBLICoderconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Dekodiert den Werbe-Payload in eine Liste von
(ad_type, description, value)-Tupeln.ad_typeist das numerische AD-Typ-Byte (sieheconstants.ad_types),descriptionist der Name der passenden Konstante als Zeichenkette (oderNone, falls der Typ unbekannt ist), undvalueist der Inhalt des AD-Records alsbytearray.
- class ubluepy.DefaultDelegate¶
Basisklasse für Objekte, die an
Peripheral.withDelegate()übergeben werden. Leiten Sie sie ab und überschreiben SiehandleConnection()/handleNotification(), um auf GATT-Events zu reagieren.
Konstanten¶
Das constants-Attribut des Moduls ist ein Namespace, der GAP-/GATT-Event-Bezeichner, Adresstyp-Werte und den verschachtelten ad_types-Namespace enthält.
- constants.EVT_GAP_CONNECTED: int¶
event_id-Wert desPeripheral-Verbindungs-Handlers für GAP-Verbindung (16).
- constants.EVT_GAP_DISCONNECTED: int¶
event_id-Wert desPeripheral-Verbindungs-Handlers für GAP-Trennung (17).
- constants.EVT_GATTS_WRITE: int¶
event_id-Wert desPeripheral-Verbindungs-Handlers für einen Schreibzugriff auf ein lokales GATT-Attribut, einschließlich Schreibzugriffen auf einen CCCD, die Notifications aktivieren/deaktivieren (80).
- constants.UUID_CCCD: int¶
Standard-Bluetooth-UUID für den Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Namespace der AD-Typ-Konstanten für Werbedaten aus dem Bluetooth Core Specification Supplement. Jeder Name wird auf den entsprechenden 1-Byte-AD-Typ abgebildet:
Name
Wert
AD_TYPE_FLAGS0x01AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE0x02AD_TYPE_16BIT_SERVICE_UUID_COMPLETE0x03AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE0x04AD_TYPE_32BIT_SERVICE_UUID_COMPLETE0x05AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE0x06AD_TYPE_128BIT_SERVICE_UUID_COMPLETE0x07AD_TYPE_SHORT_LOCAL_NAME0x08AD_TYPE_COMPLETE_LOCAL_NAME0x09AD_TYPE_TX_POWER_LEVEL0x0AAD_TYPE_CLASS_OF_DEVICE0x0DAD_TYPE_SIMPLE_PAIRING_HASH_C0x0EAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R0x0FAD_TYPE_SECURITY_MANAGER_TK_VALUE0x10AD_TYPE_SECURITY_MANAGER_OOB_FLAGS0x11AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE0x12AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT0x14AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT0x15AD_TYPE_SERVICE_DATA0x16AD_TYPE_PUBLIC_TARGET_ADDRESS0x17AD_TYPE_RANDOM_TARGET_ADDRESS0x18AD_TYPE_APPEARANCE0x19AD_TYPE_ADVERTISING_INTERVAL0x1AAD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS0x1BAD_TYPE_LE_ROLE0x1CAD_TYPE_SIMPLE_PAIRING_HASH_C2560x1DAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R2560x1EAD_TYPE_SERVICE_DATA_32BIT_UUID0x20AD_TYPE_SERVICE_DATA_128BIT_UUID0x21AD_TYPE_URI0x24AD_TYPE_3D_INFORMATION_DATA0x3DAD_TYPE_MANUFACTURER_SPECIFIC_DATA0xFF