ubluepy — Bluetooth LE peripheral en central#

De ubluepy-module is de oudere Bluetooth LE-API die met de MicroPython nRF-port wordt meegeleverd. Ze is losjes gemodelleerd naar de Linux bluepy Python-bibliotheek en bevindt zich rechtstreeks bovenop de Nordic SoftDevice — er is geen draagbare back-end, dus de module is alleen beschikbaar op Nordic-targets (de Arduino Nano 33 BLE Sense in het assortiment van OpenMV). De nieuwere bluetooth- / aioble-API’s zijn in deze build niet ingeschakeld, dus ubluepy is de enige manier om de geïntegreerde radio aan te sturen.

De beschikbare functieset hangt af van de SoftDevice die door de firmware is geflasht:

  • s140 (Nano 33 BLE Sense) — zowel de peripheral- als central-rol (scanner). Dit is wat de OpenMV-firmware meelevert.

  • s132 — zowel peripheral als central.

  • s110 — alleen peripheral; scanner- / connect-methoden worden weggecompileerd.

Peripheral-voorbeeld#

Adverteer als een Bluetooth LE-peripheral met een enkele environmental sensing-service en notificeer een temperatuurkarakteristiek bij elke schrijfactie naar de bijbehorende Client Characteristic Configuration Descriptor (CCCD):

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-voorbeeld#

Scan gedurende 100 ms naar nabije adverterende apparaten en decodeer de advertentiegegevens van elke ScanEntry

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))

Module-inhoud#

Klassen#

class ubluepy.UUID(value)#

Construeer een 16- of 128-bits Bluetooth UUID.

value

Een van:

  • int — een 16-bits numerieke UUID (UUID(0x180A)).

  • Een 6-tekenstring "0xXXXX" — een 16-bits UUID, bijv. UUID("0x181A").

  • Een 36-tekenstring "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" — een volledige 128-bits UUID. Het leverancierspecifieke deel wordt bij constructie bij de SoftDevice geregistreerd.

  • Een andere UUID-instantie — maakt een kopie.

Elke andere lengte veroorzaakt ValueError("Invalid UUID string length").

binVal() int#

Geeft de onderste 16 bits van de UUID terug als een int. Voor 128-bits UUID’s wordt alleen het 16-bits veld teruggegeven dat in de leverancierspecifieke UUID is ingebed (de volledige 128-bits waarde is alleen toegankelijk via de leverancierspecifieke index van de SoftDevice).

class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)#

Definieer een GATT-service die bij de SoftDevice wordt geregistreerd wanneer deze aan een Peripheral wordt toegevoegd.

uuid

Een UUID-instantie. Het doorgeven van een niet-UUID-object veroorzaakt ValueError.

type

Ofwel Service.PRIMARY (standaard) ofwel Service.SECONDARY. Andere waarden veroorzaken ValueError.

uuid() UUID#

Geeft de UUID-instantie van de service terug.

addCharacteristic(characteristic: Characteristic) None#

Registreer een Characteristic bij de service. Tijdens deze aanroep wordt de GATT-handle van de karakteristiek toegewezen.

getCharacteristic(uuid: UUID) Characteristic | None#

Zoek een eerder toegevoegde Characteristic op via UUID. Geeft de karakteristiekinstantie terug, of None als er geen overeenkomst wordt gevonden.

getCharacteristics() list#

Geeft de lijst van elke aan de service toegevoegde karakteristiek terug.

PRIMARY: int#

Servicetype-constante voor primaire services (1).

SECONDARY: int#

Servicetype-constante voor secundaire services (2).

class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)#

Definieer een GATT-karakteristiek. Voeg deze met Service.addCharacteristic() toe aan een Service voordat de bovenliggende Peripheral begint te adverteren.

uuid

Een UUID-instantie.

props (alleen sleutelwoord)

Bitmasker van een of meer Characteristic.PROP_*-waarden die beschrijven welke bewerkingen de karakteristiek ondersteunt.

attrs (alleen sleutelwoord)

Bitmasker van aanvullende GATT-attributen. Gebruik Characteristic.ATTR_CCCD om een Client Characteristic Configuration Descriptor toe te voegen — vereist om PROP_NOTIFY- / PROP_INDICATE-karakteristieken te laten werken.

uuid() UUID#

Geeft de UUID-instantie van de karakteristiek terug.

properties() int#

Geeft het props-bitmasker terug dat bij constructie is ingesteld.

read() bytearray#

Alleen central-rol. Lees de waarde van de karakteristiek van de verbonden peer. Geeft een bytearray met de laatste waarde terug. Op een peripheral is dit een no-op en geeft het None terug.

write(data, *, with_response: bool = False) None#

Schrijf naar de karakteristiek.

  • Op een peripheral wordt de waarde, als PROP_NOTIFY is ingesteld in de eigenschappen van de karakteristiek, als een GATT-notificatie naar de verbonden central verzonden; anders wordt de lokale attribuutwaarde bijgewerkt.

  • Op een central wordt de waarde naar de externe peer geschreven. Stel with_response=True in om een schrijfverzoek te versturen en op de bevestiging van de peer te wachten in plaats van een schrijfopdracht.

data is elk object dat het bufferprotocol ondersteunt (bytes, bytearray, memoryview).

PROP_BROADCAST: int#

De karakteristiek kan haar waarde uitzenden (0x01).

PROP_READ: int#

De karakteristiek ondersteunt leesbewerkingen (0x02).

PROP_WRITE_WO_RESP: int#

De karakteristiek ondersteunt schrijfbewerkingen zonder respons (0x04).

PROP_WRITE: int#

De karakteristiek ondersteunt schrijfbewerkingen met respons (0x08).

PROP_NOTIFY: int#

De karakteristiek kan notificaties naar een geabonneerde central pushen (0x10).

PROP_INDICATE: int#

De karakteristiek kan indicaties (bevestigde notificaties) naar een geabonneerde central pushen (0x20).

PROP_AUTH_SIGNED_WR: int#

De karakteristiek ondersteunt geverifieerde ondertekende schrijfbewerkingen (0x40).

ATTR_CCCD: int#

Voeg een Client Characteristic Configuration Descriptor toe aan de karakteristiek (0x01). Vereist om clients in staat te stellen zich op notificaties/indicaties te abonneren.

class ubluepy.Descriptor(uuid: UUID)#

Stub-klasse voor het representeren van GATT-descriptors. De huidige implementatie slaat alleen de UUID op en biedt geen methoden — ze wordt aangeboden voor voorwaartse compatibiliteit met toekomstige revisies van de module.

class ubluepy.Peripheral#

Het lokale Bluetooth LE-apparaat. Dezelfde klasse wordt gebruikt voor zowel de peripheral- als central-rol; de rol wordt geselecteerd door welke methoden je aanroept (advertise() selecteert peripheral, connect() selecteert central).

addService(service: Service) None#

Registreer een Service (en alle eerder toegevoegde karakteristieken) bij de lokale GATT-server.

getServices() list#

Geeft de lijst van services terug die momenteel bij deze Peripheral zijn geregistreerd.

advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None#

Begin met adverteren in de peripheral-rol.

device_name

Volledige lokale naam die in de GAP-payload wordt geadverteerd.

services

Lijst van Service-instanties om te adverteren. De UUID van elke service wordt in de advertentie opgenomen.

data

Optionele ruwe advertentiepayload (bytes / bytearray) die aan de automatisch gegenereerde header wordt toegevoegd. Gebruik dit voor leverancierspecifieke of beacon-payloads zoals Eddystone.

connectable

Wanneer True (standaard) wordt geadverteerd als een verbindbaar apparaat en worden GAP- / GATTS-eventhandlers geregistreerd, zodat de geconfigureerde setConnectionHandler()-callback bij verbinden, verbreken en CCCD-schrijfbewerkingen wordt geactiveerd. Wanneer False wordt geadverteerd als een beacon — er worden geen handlers gekoppeld en er kan geen verbinding met het apparaat worden gemaakt.

advertise_stop() None#

Stop elke lopende advertentie.

setConnectionHandler(func) None#

Registreer een callback die bij GAP- en GATTS-events wordt aangeroepen. De callback wordt aangeroepen als func(event_id, conn_handle, data), waarbij event_id een van de waarden constants.EVT_GAP_CONNECTED, constants.EVT_GAP_DISCONNECTED of constants.EVT_GATTS_WRITE is, conn_handle de SoftDevice-verbindingshandle is (of de attribuuthandle voor GATTS-schrijfbewerkingen), en data de ruwe event-payload is als een bytearray (of None voor verbinden / verbreken).

setNotificationHandler(func) None#

Registreer een callback voor notificatie-events die in de central-rol worden ontvangen.

withDelegate(delegate: DefaultDelegate) None#

Koppel een DefaultDelegate-instantie om gedecodeerde GATT-events te ontvangen.

disconnect() None#

Verbreek de actieve verbinding (momenteel een no-op-stub in deze build).

connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None#

Alleen central-rol. Maak verbinding met de peer met het opgegeven adres en ontdek synchroon de primaire services en karakteristieken ervan. Blokkeert totdat de verbinding tot stand is gebracht en de ontdekking is voltooid; de ontdekte services zijn vervolgens beschikbaar via getServices().

addr

Peer-adres als een 17-tekenstring "xx:xx:xx:xx:xx:xx" (bijv. afkomstig van ScanEntry.addr()).

addr_type (alleen sleutelwoord)

Ofwel constants.ADDR_TYPE_PUBLIC (standaard) ofwel constants.ADDR_TYPE_RANDOM_STATIC.

class ubluepy.Scanner#

GAP-observer voor het ontdekken van nabije adverterende apparaten. Alleen beschikbaar wanneer de firmware is gebouwd tegen een SoftDevice met central-ondersteuning (s132 / s140).

scan(timeout: int) list#

Voer een passieve scan uit gedurende timeout milliseconden en geef een lijst van ScanEntry-instanties terug — één per advertentierapport dat tijdens het venster is ontvangen.

class ubluepy.ScanEntry#

Een enkel advertentierapport vastgelegd door Scanner.scan(). Instanties worden teruggegeven door de scanner — er is geen publieke constructor.

addr() str#

Geeft het peer-adres terug als een 17-tekenstring "xx:xx:xx:xx:xx:xx".

addr_type() int#

Geeft het type van het peer-adres terug (constants.ADDR_TYPE_PUBLIC of constants.ADDR_TYPE_RANDOM_STATIC).

rssi() int#

Geeft de signaalsterkte-indicator in dBm terug.

getScanData() list#

Decodeer de advertentiepayload tot een lijst van (ad_type, description, value)-tuples. ad_type is de numerieke AD-typebyte (zie constants.ad_types), description is de naam van de bijbehorende constante als een string (of None als het type onbekend is), en value is de body van het AD-record als een bytearray.

class ubluepy.DefaultDelegate#

Basisklasse voor objecten die aan Peripheral.withDelegate() worden doorgegeven. Maak er een subklasse van en overschrijf handleConnection() / handleNotification() om op GATT-events te reageren.

handleConnection() None#

Aangeroepen bij GAP-verbind- / -verbreekevents. De standaardimplementatie is leeg.

handleNotification() None#

Aangeroepen bij binnenkomende GATT-notificaties. De standaardimplementatie is leeg.

Constanten#

Het constants-attribuut van de module is een naamruimte die GAP/GATT-event-identificatoren, adrestype-waarden en de geneste ad_types-naamruimte bevat.

ubluepy.constants: type#

Container die de onderstaande constanten blootstelt.

constants.EVT_GAP_CONNECTED: int#

event_id-waarde van de Peripheral-verbindingshandler voor GAP-verbinden (16).

constants.EVT_GAP_DISCONNECTED: int#

event_id-waarde van de Peripheral-verbindingshandler voor GAP-verbreken (17).

constants.EVT_GATTS_WRITE: int#

event_id-waarde van de Peripheral-verbindingshandler voor een schrijfactie naar een lokaal GATT-attribuut, inclusief schrijfacties naar een CCCD die notificaties in-/uitschakelen (80).

constants.UUID_CCCD: int#

Standaard Bluetooth UUID voor de Client Characteristic Configuration Descriptor (0x2902).

constants.ADDR_TYPE_PUBLIC: int#

Public Bluetooth Device Address (0).

constants.ADDR_TYPE_RANDOM_STATIC: int#

Static random Bluetooth Device Address (1).

constants.ad_types: type#

Naamruimte van AD-typeconstanten voor advertentiegegevens uit het Bluetooth Core Specification Supplement. Elke naam wijst naar het bijbehorende 1-byte AD-type:

Naam

Waarde

AD_TYPE_FLAGS

0x01

AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE

0x02

AD_TYPE_16BIT_SERVICE_UUID_COMPLETE

0x03

AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE

0x04

AD_TYPE_32BIT_SERVICE_UUID_COMPLETE

0x05

AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE

0x06

AD_TYPE_128BIT_SERVICE_UUID_COMPLETE

0x07

AD_TYPE_SHORT_LOCAL_NAME

0x08

AD_TYPE_COMPLETE_LOCAL_NAME

0x09

AD_TYPE_TX_POWER_LEVEL

0x0A

AD_TYPE_CLASS_OF_DEVICE

0x0D

AD_TYPE_SIMPLE_PAIRING_HASH_C

0x0E

AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R

0x0F

AD_TYPE_SECURITY_MANAGER_TK_VALUE

0x10

AD_TYPE_SECURITY_MANAGER_OOB_FLAGS

0x11

AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE

0x12

AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT

0x14

AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT

0x15

AD_TYPE_SERVICE_DATA

0x16

AD_TYPE_PUBLIC_TARGET_ADDRESS

0x17

AD_TYPE_RANDOM_TARGET_ADDRESS

0x18

AD_TYPE_APPEARANCE

0x19

AD_TYPE_ADVERTISING_INTERVAL

0x1A

AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS

0x1B

AD_TYPE_LE_ROLE

0x1C

AD_TYPE_SIMPLE_PAIRING_HASH_C256

0x1D

AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256

0x1E

AD_TYPE_SERVICE_DATA_32BIT_UUID

0x20

AD_TYPE_SERVICE_DATA_128BIT_UUID

0x21

AD_TYPE_URI

0x24

AD_TYPE_3D_INFORMATION_DATA

0x3D

AD_TYPE_MANUFACTURER_SPECIFIC_DATA

0xFF