ubluepy — periferic și central Bluetooth LE#
Modulul ubluepy este vechea API Bluetooth LE livrată cu portul nRF al MicroPython. Este modelat în linii mari după biblioteca Python Linux bluepy și se află direct deasupra Nordic SoftDevice — nu există un back-end portabil, așa că modulul este disponibil doar pe ținte Nordic (Arduino Nano 33 BLE Sense din gama OpenMV). Noile API-uri bluetooth / aioble nu sunt activate în acest build, deci ubluepy este singura modalitate de a controla radioul integrat în cip.
Setul de funcționalități disponibile depinde de SoftDevice-ul scris în firmware:
s140 (Nano 33 BLE Sense) — atât rolul de periferic cât și cel de central (scaner). Acesta este cel livrat cu firmware-ul OpenMV.
s132 — atât periferic, cât și central.
s110 — doar periferic; metodele de scanare / conectare sunt excluse la compilare.
Exemplu de periferic#
Anunță-te ca periferic Bluetooth LE cu un singur serviciu de detectare a mediului și notifică o caracteristică de temperatură la fiecare scriere în Client Characteristic Configuration Descriptor (CCCD) al acesteia:
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])
Exemplu central#
Scanează dispozitivele care fac advertising din apropiere timp de 100 ms și decodează datele de advertising ale fiecărui 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))
Conținutul modulului#
Clase#
- class ubluepy.UUID(value)#
Construiește un UUID Bluetooth pe 16 sau 128 de biți.
valueUna dintre:
int— un UUID numeric pe 16 biți (UUID(0x180A)).șir de 6 caractere
"0xXXXX"— un UUID pe 16 biți, de exempluUUID("0x181A").șir de 36 de caractere
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"— un UUID complet pe 128 de biți. Partea specifică furnizorului este înregistrată cu SoftDevice-ul la construire.O altă instanță
UUID— realizează o copie.
Orice altă lungime generează
ValueError("Invalid UUID string length").
- binVal() int#
Returnează cei mai puțin semnificativi 16 biți ai UUID-ului ca
int. Pentru UUID-urile pe 128 de biți se returnează doar câmpul de 16 biți încorporat în UUID-ul specific furnizorului (valoarea completă pe 128 de biți este accesibilă numai prin indexul specific furnizorului al SoftDevice-ului).
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)#
Definește un serviciu GATT care va fi înregistrat cu SoftDevice-ul atunci când este adăugat la un
Peripheral.uuidO instanță
UUID. Transmiterea unui obiect care nu este UUID genereazăValueError.typeFie
Service.PRIMARY(implicit), fieService.SECONDARY. Alte valori genereazăValueError.
- addCharacteristic(characteristic: Characteristic) None#
Înregistrează o
Characteristicîn serviciu. Handle-ul GATT al caracteristicii este atribuit în timpul acestui apel.
- getCharacteristic(uuid: UUID) Characteristic | None#
Caută după UUID o
Characteristicadăugată anterior. Returnează instanța caracteristicii sauNonedacă nu se găsește nicio potrivire.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)#
Definește o caracteristică GATT. Adaug-o la un
ServicecuService.addCharacteristic()înainte caPeripheral-ul părinte să înceapă advertising-ul.uuidO instanță
UUID.props(doar cuvânt-cheie)Mască de biți cu una sau mai multe valori
Characteristic.PROP_*care descriu ce operații suportă caracteristica.attrs(doar cuvânt-cheie)Mască de biți cu atribute GATT suplimentare. Folosiți
Characteristic.ATTR_CCCDpentru a atașa un Client Characteristic Configuration Descriptor — necesar pentru a face să funcționeze caracteristicilePROP_NOTIFY/PROP_INDICATE.
- read() bytearray#
Numai rolul central. Citește valoarea caracteristicii de la peer-ul conectat. Returnează un
bytearraycu cea mai recentă valoare. Pe un periferic aceasta nu face nimic și returneazăNone.
- write(data, *, with_response: bool = False) None#
Scrie în caracteristică.
Pe un periferic, dacă
PROP_NOTIFYeste setat în proprietățile caracteristicii, valoarea este trimisă ca notificare GATT către centralul conectat; în caz contrar, valoarea atributului local este actualizată.Pe un central, valoarea este scrisă în peer-ul de la distanță. Setați
with_response=Truepentru a emite o cerere de scriere și a aștepta confirmarea peer-ului în loc de o comandă de scriere.
dataeste orice obiect compatibil cu protocolul buffer (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)#
Clasă stub pentru reprezentarea descriptorilor GATT. Implementarea actuală stochează doar UUID-ul și nu expune nicio metodă — este furnizată pentru compatibilitatea ulterioară cu viitoarele revizii ale modulului.
- class ubluepy.Peripheral#
Dispozitivul Bluetooth LE local. Aceeași clasă este folosită atât pentru rolul de periferic, cât și pentru cel de central; rolul este selectat de metodele pe care le apelați (
advertise()selectează perifericul,connect()selectează centralul).- addService(service: Service) None#
Înregistrează un
Service(și toate caracteristicile adăugate anterior la acesta) cu serverul GATT local.
- getServices() list#
Returnează lista serviciilor înregistrate în prezent cu acest
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None#
Începe advertising-ul în rolul de periferic.
device_nameNumele local complet anunțat în payload-ul GAP.
servicesLista instanțelor
Servicede anunțat. UUID-ul fiecărui serviciu este inclus în advertising.dataPayload brut opțional de advertising (
bytes/bytearray) atașat antetului generat automat. Folosiți acest lucru pentru payload-uri specifice furnizorului sau de tip beacon, cum ar fi Eddystone.connectableCând este
True(implicit), anunță ca dispozitiv conectabil și înregistrează gestionari de evenimente GAP / GATTS, astfel încât funcția de retroapelare (callback) configurată prinsetConnectionHandler()să se declanșeze la conectare, deconectare și scrieri CCCD. Când esteFalse, anunță ca beacon — niciun gestionar nu este atașat, iar dispozitivul nu poate fi conectat.
- setConnectionHandler(func) None#
Înregistrează o funcție de retroapelare (callback) invocată la evenimente GAP și GATTS. Funcția de retroapelare este apelată ca
func(event_id, conn_handle, data), undeevent_ideste una dintre valorileconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDsauconstants.EVT_GATTS_WRITE,conn_handleeste handle-ul de conexiune SoftDevice (sau handle-ul de atribut pentru scrierile GATTS), iardataeste payload-ul brut al evenimentului sub forma unuibytearray(sauNonepentru conectare / deconectare).
- setNotificationHandler(func) None#
Înregistrează o funcție de retroapelare (callback) pentru evenimentele de notificare primite în rolul de central.
- withDelegate(delegate: DefaultDelegate) None#
Atașează o instanță
DefaultDelegatepentru a primi evenimente GATT decodate.
- disconnect() None#
Întrerupe conexiunea activă (în prezent un stub care nu face nimic în acest build).
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None#
Numai rolul central. Se conectează la peer-ul cu adresa dată și descoperă sincron serviciile și caracteristicile sale primare. Blochează până când conexiunea este stabilită și descoperirea se finalizează; serviciile descoperite sunt apoi disponibile prin
getServices().addrAdresa peer-ului sub forma unui șir de 17 caractere
"xx:xx:xx:xx:xx:xx"(de exemplu, preluată dinScanEntry.addr()).addr_type(doar cuvânt-cheie)Fie
constants.ADDR_TYPE_PUBLIC(implicit), fieconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner#
Observator GAP pentru descoperirea dispozitivelor din apropiere care fac advertising. Disponibil numai atunci când firmware-ul este construit cu un SoftDevice cu suport pentru rolul central (s132 / s140).
- class ubluepy.ScanEntry#
Un singur raport de advertising capturat de
Scanner.scan(). Instanțele sunt returnate de scaner — nu există un constructor public.- addr_type() int#
Returnează tipul adresei peer-ului (
constants.ADDR_TYPE_PUBLICsauconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list#
Decodează payload-ul de advertising într-o listă de tupluri
(ad_type, description, value).ad_typeeste octetul numeric al tipului AD (consultațiconstants.ad_types),descriptioneste numele constantei corespunzătoare sub formă de șir (sauNonedacă tipul este necunoscut), iarvalueeste corpul înregistrării AD sub forma unuibytearray.
- class ubluepy.DefaultDelegate#
Clasă de bază pentru obiectele transmise către
Peripheral.withDelegate(). Creați o subclasă a acesteia și suprascriețihandleConnection()/handleNotification()pentru a reacționa la evenimente GATT.
Constante#
Atributul constants al modulului este un spațiu de nume care conține identificatori de evenimente GAP/GATT, valori de tip de adresă și spațiul de nume imbricat ad_types.
- constants.EVT_GAP_CONNECTED: int#
Valoarea
event_ida gestionarului de conexiune alPeripheralpentru conectare GAP (16).
- constants.EVT_GAP_DISCONNECTED: int#
Valoarea
event_ida gestionarului de conexiune alPeripheralpentru deconectare GAP (17).
- constants.EVT_GATTS_WRITE: int#
Valoarea
event_ida gestionarului de conexiune alPeripheralpentru o scriere într-un atribut GATT local, inclusiv scrieri într-un CCCD care activează/dezactivează notificările (80).
- constants.UUID_CCCD: int#
UUID Bluetooth standard pentru Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type#
Spațiu de nume al constantelor de tip AD pentru datele de advertising din Bluetooth Core Specification Supplement. Fiecare nume se mapează la tipul AD corespunzător de 1 octet:
Nume
Valoare
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