ubluepy — periferica e centrale Bluetooth LE¶
Il modulo ubluepy è la vecchia API Bluetooth LE distribuita con il port nRF di MicroPython. È modellato approssimativamente sulla libreria Python Linux bluepy e si appoggia direttamente sul SoftDevice Nordic — non esiste alcun back-end portabile, quindi il modulo è disponibile solo sui target Nordic (l’Arduino Nano 33 BLE Sense nella gamma OpenMV). Le più recenti API bluetooth / aioble non sono abilitate in questa build, quindi ubluepy è l’unico modo per pilotare la radio integrata nel chip.
L’insieme di funzionalità disponibili dipende dal SoftDevice flashato dal firmware:
s140 (Nano 33 BLE Sense) — entrambi i ruoli, periferica e centrale (scanner). È quanto distribuisce il firmware OpenMV.
s132 — sia periferica che centrale.
s110 — solo periferica; i metodi scanner / connect sono esclusi dalla compilazione.
Esempio di periferica¶
Pubblicizza il dispositivo come periferica Bluetooth LE con un singolo servizio di rilevamento ambientale e notifica una caratteristica di temperatura a ogni scrittura sul suo 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])
Esempio di centrale¶
Esegue la scansione dei dispositivi in advertising nelle vicinanze per 100 ms e decodifica i dati di advertising di ciascun 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))
Contenuto del modulo¶
Classi¶
- class ubluepy.UUID(value)¶
Costruisce un UUID Bluetooth a 16 o 128 bit.
valueUno tra:
int— un UUID numerico a 16 bit (UUID(0x180A)).Stringa
"0xXXXX"di 6 caratteri — un UUID a 16 bit, ad esempioUUID("0x181A").Stringa
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"di 36 caratteri — un UUID completo a 128 bit. La porzione specifica del vendor viene registrata con il SoftDevice al momento della costruzione.Un’altra istanza
UUID— esegue una copia.
Qualsiasi altra lunghezza solleva
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definisce un servizio GATT che verrà registrato con il SoftDevice quando viene aggiunto a un
Peripheral.uuidUn’istanza
UUID. Passare un oggetto non UUID sollevaValueError.typeUno tra
Service.PRIMARY(predefinito) oService.SECONDARY. Altri valori sollevanoValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Registra una
Characteristiccon il servizio. L’handle GATT della caratteristica viene assegnato durante questa chiamata.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Cerca per UUID una
Characteristicprecedentemente aggiunta. Restituisce l’istanza della caratteristica, oppureNonese non viene trovata alcuna corrispondenza.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definisce una caratteristica GATT. Aggiungila a un
ServiceconService.addCharacteristic()prima che ilPeripheralgenitore inizi l’advertising.uuidUn’istanza
UUID.props(solo keyword)Maschera di bit di uno o più valori
Characteristic.PROP_*che descrivono quali operazioni la caratteristica supporta.attrs(solo keyword)Maschera di bit di attributi GATT aggiuntivi. Usa
Characteristic.ATTR_CCCDper associare un Client Characteristic Configuration Descriptor — necessario per far funzionare le caratteristichePROP_NOTIFY/PROP_INDICATE.
- read() bytearray¶
Solo ruolo centrale. Legge il valore della caratteristica dal peer connesso. Restituisce un
bytearraycon il valore più recente. Su una periferica è un’operazione nulla e restituisceNone.
- write(data, *, with_response: bool = False) None¶
Scrive sulla caratteristica.
Su una periferica, se
PROP_NOTIFYè impostato nelle proprietà della caratteristica, il valore viene inviato come notifica GATT alla centrale connessa; altrimenti viene aggiornato il valore dell’attributo locale.Su una centrale, il valore viene scritto sul peer remoto. Imposta
with_response=Trueper emettere una richiesta di scrittura e attendere la conferma del peer invece di un comando di scrittura.
dataè qualsiasi oggetto conforme al buffer protocol (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Classe stub per rappresentare i descrittori GATT. L’implementazione attuale si limita a memorizzare l’UUID e non espone alcun metodo — è fornita per compatibilità futura con revisioni successive del modulo.
- class ubluepy.Peripheral¶
Il dispositivo Bluetooth LE locale. La stessa classe viene usata sia per il ruolo di periferica che per quello di centrale; il ruolo è selezionato in base ai metodi che si chiamano (
advertise()seleziona la periferica,connect()seleziona la centrale).- addService(service: Service) None¶
Registra un
Service(e tutte le caratteristiche precedentemente aggiunte ad esso) con il server GATT locale.
- getServices() list¶
Restituisce l’elenco dei servizi attualmente registrati con questo
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Avvia l’advertising nel ruolo di periferica.
device_nameNome locale completo pubblicizzato nel payload GAP.
servicesElenco di istanze
Serviceda pubblicizzare. L’UUID di ciascun servizio è incluso nell’advertising.dataPayload di advertising raw opzionale (
bytes/bytearray) accodato all’header generato automaticamente. Usalo per payload specifici del vendor o per beacon come Eddystone.connectableQuando è
True(predefinito), pubblicizza il dispositivo come connettibile e registra i gestori di eventi GAP / GATTS in modo che il callback configurato consetConnectionHandler()venga invocato in caso di connessione, disconnessione e scritture CCCD. Quando èFalse, pubblicizza il dispositivo come beacon — non viene associato alcun gestore e il dispositivo non può essere connesso.
- setConnectionHandler(func) None¶
Registra un callback invocato in caso di eventi GAP e GATTS. Il callback viene chiamato come
func(event_id, conn_handle, data)doveevent_idè uno tra i valoriconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDoconstants.EVT_GATTS_WRITE,conn_handleè l’handle di connessione del SoftDevice (o l’handle di attributo per le scritture GATTS) edataè il payload raw dell’evento comebytearray(oppureNoneper connessione / disconnessione).
- setNotificationHandler(func) None¶
Registra un callback per gli eventi di notifica ricevuti nel ruolo di centrale.
- withDelegate(delegate: DefaultDelegate) None¶
Associa un’istanza
DefaultDelegateper ricevere gli eventi GATT decodificati.
- disconnect() None¶
Chiude la connessione attiva (attualmente uno stub a operazione nulla in questa build).
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Solo ruolo centrale. Si connette al peer con l’indirizzo indicato e ne scopre in modo sincrono i servizi primari e le caratteristiche. Si blocca finché la connessione non è stabilita e la discovery non è completata; i servizi scoperti sono quindi disponibili tramite
getServices().addrIndirizzo del peer come stringa
"xx:xx:xx:xx:xx:xx"di 17 caratteri (ad esempio quella ottenuta daScanEntry.addr()).addr_type(solo keyword)Uno tra
constants.ADDR_TYPE_PUBLIC(predefinito) oconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
Observer GAP per scoprire i dispositivi in advertising nelle vicinanze. Disponibile solo quando il firmware è compilato con un SoftDevice dotato di supporto centrale (s132 / s140).
- class ubluepy.ScanEntry¶
Un singolo report di advertising catturato da
Scanner.scan(). Le istanze vengono restituite dallo scanner — non esiste un costruttore pubblico.- addr_type() int¶
Restituisce il tipo di indirizzo del peer (
constants.ADDR_TYPE_PUBLICoconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Decodifica il payload di advertising in un elenco di tuple
(ad_type, description, value).ad_typeè il byte numerico del tipo AD (vediconstants.ad_types),descriptionè il nome della costante corrispondente come stringa (oppureNonese il tipo è sconosciuto) evalueè il corpo del record AD comebytearray.
- class ubluepy.DefaultDelegate¶
Classe base per gli oggetti passati a
Peripheral.withDelegate(). Crea una sottoclasse ed esegui l’override dihandleConnection()/handleNotification()per reagire agli eventi GATT.
Costanti¶
L’attributo constants del modulo è uno spazio dei nomi contenente gli identificatori degli eventi GAP/GATT, i valori di tipo indirizzo e lo spazio dei nomi annidato ad_types.
- constants.EVT_GAP_CONNECTED: int¶
Valore di
event_iddel gestore di connessione diPeripheralper la connessione GAP (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Valore di
event_iddel gestore di connessione diPeripheralper la disconnessione GAP (17).
- constants.EVT_GATTS_WRITE: int¶
Valore di
event_iddel gestore di connessione diPeripheralper una scrittura su un attributo GATT locale, incluse le scritture su un CCCD che abilitano/disabilitano le notifiche (80).
- constants.UUID_CCCD: int¶
UUID Bluetooth standard per il Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Spazio dei nomi delle costanti di tipo AD per i dati di advertising tratte dal Bluetooth Core Specification Supplement. Ogni nome corrisponde al relativo tipo AD a 1 byte:
Nome
Valore
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