ubluepy — periférico y central Bluetooth LE¶
El módulo ubluepy es la API heredada de Bluetooth LE que se distribuye con la adaptación nRF de MicroPython. Está vagamente modelado a partir de la biblioteca de Python bluepy de Linux y se asienta directamente sobre el Nordic SoftDevice — no hay un back-end portable, por lo que el módulo solo está disponible en plataformas Nordic (la Arduino Nano 33 BLE Sense en la gama de OpenMV). Las APIs más recientes bluetooth / aioble no están habilitadas en esta compilación, por lo que ubluepy es la única forma de controlar la radio integrada en el chip.
El conjunto de funciones disponible depende del SoftDevice grabado por el firmware:
s140 (Nano 33 BLE Sense) — ambos roles, periférico y central (escáner). Esto es lo que distribuye el firmware de OpenMV.
s132 — tanto periférico como central.
s110 — solo periférico; los métodos de escáner / conexión se excluyen de la compilación.
Ejemplo de periférico¶
Anuncia como periférico Bluetooth LE con un único servicio de detección ambiental y notifica una característica de temperatura en cada escritura a su descriptor de configuración de característica de cliente (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])
Ejemplo de central¶
Busca dispositivos cercanos que estén anunciando durante 100 ms y decodifica los datos de anuncio de cada 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))
Contenido del módulo¶
Clases¶
- class ubluepy.UUID(value)¶
Construye un UUID de Bluetooth de 16 o 128 bits.
valueUno de:
int— un UUID numérico de 16 bits (UUID(0x180A)).Cadena
"0xXXXX"de 6 caracteres — un UUID de 16 bits, p. ej.UUID("0x181A").Cadena
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"de 36 caracteres — un UUID completo de 128 bits. La parte específica del proveedor se registra en el SoftDevice durante la construcción.Otra instancia de
UUID— realiza una copia.
Cualquier otra longitud genera
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Define un servicio GATT que se registrará en el SoftDevice cuando se añada a un
Peripheral.uuidUna instancia de
UUID. Pasar un objeto que no sea un UUID generaValueError.typeService.PRIMARY(predeterminado) oService.SECONDARY. Otros valores generanValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Registra una
Characteristicen el servicio. El identificador GATT de la característica se asigna durante esta llamada.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Busca una
Characteristicañadida previamente por UUID. Devuelve la instancia de la característica, oNonesi no se encuentra ninguna coincidencia.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Define una característica GATT. Añádala a un
ServiceconService.addCharacteristic()antes de que elPeripheralpadre empiece a anunciar.uuidUna instancia de
UUID.props(solo por palabra clave)Máscara de bits de uno o más valores
Characteristic.PROP_*que describen qué operaciones admite la característica.attrs(solo por palabra clave)Máscara de bits de atributos GATT adicionales. Use
Characteristic.ATTR_CCCDpara adjuntar un descriptor de configuración de característica de cliente (CCCD) — necesario para que funcionen las característicasPROP_NOTIFY/PROP_INDICATE.
- read() bytearray¶
Solo rol central. Lee el valor de la característica desde el par conectado. Devuelve un
bytearraycon el valor más reciente. En un periférico esto no hace nada y devuelveNone.
- write(data, *, with_response: bool = False) None¶
Escribe en la característica.
En un periférico, si
PROP_NOTIFYestá establecido en las propiedades de la característica, el valor se envía como notificación GATT al central conectado; de lo contrario se actualiza el valor del atributo local.En un central, el valor se escribe en el par remoto. Establezca
with_response=Truepara emitir una solicitud de escritura y esperar el reconocimiento del par en lugar de un comando de escritura.
dataes cualquier objeto que admita el protocolo de búfer (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Clase de relleno para representar descriptores GATT. La implementación actual solo almacena el UUID y no expone ningún método — se proporciona para compatibilidad futura con próximas revisiones del módulo.
- class ubluepy.Peripheral¶
El dispositivo Bluetooth LE local. Se usa la misma clase para los roles de periférico y de central; el rol se selecciona según los métodos que se llamen (
advertise()selecciona periférico,connect()selecciona central).- addService(service: Service) None¶
Registra un
Service(y todas sus características añadidas previamente) en el servidor GATT local.
- getServices() list¶
Devuelve la lista de servicios registrados actualmente en este
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Comienza a anunciar en rol de periférico.
device_nameNombre local completo anunciado en la carga útil GAP.
servicesLista de instancias
Serviceque se van a anunciar. El UUID de cada servicio se incluye en el anuncio.dataCarga útil de anuncio sin procesar opcional (
bytes/bytearray) que se añade a la cabecera generada automáticamente. Úsela para cargas útiles específicas del proveedor o de baliza, como Eddystone.connectableCuando es
True(predeterminado), anuncia como dispositivo conectable y registra los manejadores de eventos GAP / GATTS para que la función de retorno (callback)setConnectionHandler()configurada se active al conectarse, desconectarse y en las escrituras de CCCD. Cuando esFalse, anuncia como baliza — no se adjunta ningún manejador y no es posible conectarse al dispositivo.
- setConnectionHandler(func) None¶
Registra una función de retorno (callback) invocada en los eventos GAP y GATTS. La función de retorno se llama como
func(event_id, conn_handle, data)dondeevent_ides uno de los valoresconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDoconstants.EVT_GATTS_WRITE,conn_handlees el identificador de conexión del SoftDevice (o el identificador de atributo para las escrituras GATTS), ydataes la carga útil sin procesar del evento comobytearray(oNonepara conexión / desconexión).
- setNotificationHandler(func) None¶
Registra una función de retorno (callback) para los eventos de notificación recibidos en rol central.
- withDelegate(delegate: DefaultDelegate) None¶
Adjunta una instancia de
DefaultDelegatepara recibir los eventos GATT decodificados.
- disconnect() None¶
Cierra la conexión activa (actualmente es un relleno que no hace nada en esta compilación).
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Solo rol central. Se conecta al par con la dirección indicada y descubre de forma síncrona sus servicios y características primarios. Se bloquea hasta que se establece la conexión y se completa el descubrimiento; los servicios descubiertos quedan entonces disponibles mediante
getServices().addrDirección del par como cadena
"xx:xx:xx:xx:xx:xx"de 17 caracteres (p. ej. la obtenida deScanEntry.addr()).addr_type(solo por palabra clave)constants.ADDR_TYPE_PUBLIC(predeterminado) oconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
Observador GAP para descubrir dispositivos cercanos que estén anunciando. Disponible únicamente cuando el firmware está compilado contra un SoftDevice con soporte de central (s132 / s140).
- class ubluepy.ScanEntry¶
Un único informe de anuncio capturado por
Scanner.scan(). Las instancias las devuelve el escáner — no hay un constructor público.- addr_type() int¶
Devuelve el tipo de dirección del par (
constants.ADDR_TYPE_PUBLICoconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Decodifica la carga útil del anuncio en una lista de tuplas
(ad_type, description, value).ad_typees el byte numérico del tipo de AD (consulteconstants.ad_types),descriptiones el nombre de la constante coincidente como cadena (oNonesi el tipo es desconocido), yvaluees el cuerpo del registro AD comobytearray.
- class ubluepy.DefaultDelegate¶
Clase base para los objetos que se pasan a
Peripheral.withDelegate(). Cree una subclase y sobrescribahandleConnection()/handleNotification()para reaccionar a los eventos GATT.
Constantes¶
El atributo constants del módulo es un espacio de nombres que contiene identificadores de eventos GAP/GATT, valores de tipo de dirección y el espacio de nombres anidado ad_types.
- constants.EVT_GAP_CONNECTED: int¶
Valor
event_iddel manejador de conexión dePeripheralpara la conexión GAP (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Valor
event_iddel manejador de conexión dePeripheralpara la desconexión GAP (17).
- constants.EVT_GATTS_WRITE: int¶
Valor
event_iddel manejador de conexión dePeripheralpara una escritura a un atributo GATT local, incluidas las escrituras a un CCCD que habilitan/deshabilitan notificaciones (80).
- constants.UUID_CCCD: int¶
UUID estándar de Bluetooth para el descriptor de configuración de característica de cliente (
0x2902).
- constants.ad_types: type¶
Espacio de nombres de las constantes de tipo de AD de los datos de anuncio del Bluetooth Core Specification Supplement. Cada nombre se corresponde con el tipo de AD de 1 byte correspondiente:
Nombre
Valor
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