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.
valueEen 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").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definieer een GATT-service die bij de SoftDevice wordt geregistreerd wanneer deze aan een
Peripheralwordt toegevoegd.uuidEen
UUID-instantie. Het doorgeven van een niet-UUID-object veroorzaaktValueError.typeOfwel
Service.PRIMARY(standaard) ofwelService.SECONDARY. Andere waarden veroorzakenValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Registreer een
Characteristicbij de service. Tijdens deze aanroep wordt de GATT-handle van de karakteristiek toegewezen.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Zoek een eerder toegevoegde
Characteristicop via UUID. Geeft de karakteristiekinstantie terug, ofNoneals er geen overeenkomst wordt gevonden.
- 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 eenServicevoordat de bovenliggendePeripheralbegint te adverteren.uuidEen
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_CCCDom een Client Characteristic Configuration Descriptor toe te voegen — vereist omPROP_NOTIFY- /PROP_INDICATE-karakteristieken te laten werken.
- read() bytearray¶
Alleen central-rol. Lees de waarde van de karakteristiek van de verbonden peer. Geeft een
bytearraymet de laatste waarde terug. Op een peripheral is dit een no-op en geeft hetNoneterug.
- write(data, *, with_response: bool = False) None¶
Schrijf naar de karakteristiek.
Op een peripheral wordt de waarde, als
PROP_NOTIFYis 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=Truein om een schrijfverzoek te versturen en op de bevestiging van de peer te wachten in plaats van een schrijfopdracht.
datais elk object dat het bufferprotocol ondersteunt (bytes,bytearray,memoryview).
- PROP_INDICATE: int¶
De karakteristiek kan indicaties (bevestigde notificaties) naar een geabonneerde central pushen (
0x20).
- 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
Peripheralzijn 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_nameVolledige lokale naam die in de GAP-payload wordt geadverteerd.
servicesLijst van
Service-instanties om te adverteren. De UUID van elke service wordt in de advertentie opgenomen.dataOptionele ruwe advertentiepayload (
bytes/bytearray) die aan de automatisch gegenereerde header wordt toegevoegd. Gebruik dit voor leverancierspecifieke of beacon-payloads zoals Eddystone.connectableWanneer
True(standaard) wordt geadverteerd als een verbindbaar apparaat en worden GAP- / GATTS-eventhandlers geregistreerd, zodat de geconfigureerdesetConnectionHandler()-callback bij verbinden, verbreken en CCCD-schrijfbewerkingen wordt geactiveerd. WanneerFalsewordt geadverteerd als een beacon — er worden geen handlers gekoppeld en er kan geen verbinding met het apparaat worden gemaakt.
- 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), waarbijevent_ideen van de waardenconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDofconstants.EVT_GATTS_WRITEis,conn_handlede SoftDevice-verbindingshandle is (of de attribuuthandle voor GATTS-schrijfbewerkingen), endatade ruwe event-payload is als eenbytearray(ofNonevoor 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.
- 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().addrPeer-adres als een 17-tekenstring
"xx:xx:xx:xx:xx:xx"(bijv. afkomstig vanScanEntry.addr()).addr_type(alleen sleutelwoord)Ofwel
constants.ADDR_TYPE_PUBLIC(standaard) ofwelconstants.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).
- class ubluepy.ScanEntry¶
Een enkel advertentierapport vastgelegd door
Scanner.scan(). Instanties worden teruggegeven door de scanner — er is geen publieke constructor.- addr_type() int¶
Geeft het type van het peer-adres terug (
constants.ADDR_TYPE_PUBLICofconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Decodeer de advertentiepayload tot een lijst van
(ad_type, description, value)-tuples.ad_typeis de numerieke AD-typebyte (zieconstants.ad_types),descriptionis de naam van de bijbehorende constante als een string (ofNoneals het type onbekend is), envalueis de body van het AD-record als eenbytearray.
- class ubluepy.DefaultDelegate¶
Basisklasse voor objecten die aan
Peripheral.withDelegate()worden doorgegeven. Maak er een subklasse van en overschrijfhandleConnection()/handleNotification()om op GATT-events te reageren.
Constanten¶
Het constants-attribuut van de module is een naamruimte die GAP/GATT-event-identificatoren, adrestype-waarden en de geneste ad_types-naamruimte bevat.
- constants.EVT_GAP_CONNECTED: int¶
event_id-waarde van dePeripheral-verbindingshandler voor GAP-verbinden (16).
- constants.EVT_GAP_DISCONNECTED: int¶
event_id-waarde van dePeripheral-verbindingshandler voor GAP-verbreken (17).
- constants.EVT_GATTS_WRITE: int¶
event_id-waarde van dePeripheral-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.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_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