ubluepy — periférico e central Bluetooth LE¶
O módulo ubluepy é a API Bluetooth LE legada fornecida com a portação nRF do MicroPython. Baseia-se livremente na biblioteca Python bluepy para Linux e assenta diretamente sobre o Nordic SoftDevice — não existe um backend portável, pelo que o módulo está disponível apenas em alvos Nordic (o Arduino Nano 33 BLE Sense na gama da OpenMV). As APIs mais recentes bluetooth / aioble não estão ativadas nesta compilação, pelo que ubluepy é a única forma de controlar o rádio integrado.
O conjunto de funcionalidades disponíveis depende do SoftDevice instalado pelo firmware:
s140 (Nano 33 BLE Sense) — funções de periférico e central (scanner). É o que o firmware da OpenMV inclui.
s132 — funções de periférico e central.
s110 — apenas periférico; os métodos de scanner/ligação são excluídos da compilação.
Exemplo de periférico¶
Anunciar como periférico Bluetooth LE com um único serviço de monitorização ambiental e notificar uma característica de temperatura em cada escrita no seu 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])
Exemplo de central¶
Procurar dispositivos a anunciar nas proximidades durante 100 ms e descodificar os dados de anúncio 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))
Conteúdos do módulo¶
Classes¶
- class ubluepy.UUID(value)¶
Constrói um UUID Bluetooth de 16 ou 128 bits.
valueUm dos seguintes:
int— um UUID numérico de 16 bits (UUID(0x180A)).Cadeia de caracteres
"0xXXXX"de 6 caracteres — um UUID de 16 bits, por exemploUUID("0x181A").Cadeia de caracteres
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"de 36 caracteres — um UUID completo de 128 bits. A parte específica do fornecedor é registada no SoftDevice na construção.Outra instância de
UUID— efetua uma cópia.
Qualquer outro comprimento lança
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Define um serviço GATT que será registado no SoftDevice quando adicionado a um
Peripheral.uuidUma instância de
UUID. Passar um objeto que não seja UUID lançaValueError.typeOu
Service.PRIMARY(predefinição) ouService.SECONDARY. Outros valores lançamValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Regista uma
Characteristicno serviço. O handle GATT da característica é atribuído durante esta chamada.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Procura uma
Characteristicanteriormente adicionada pelo UUID. Devolve a instância da característica, ouNonese não for encontrada correspondência.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Define uma característica GATT. Adicioná-la a um
ServicecomService.addCharacteristic()antes doPeripheralpai começar a anunciar.uuidUma instância de
UUID.props(apenas por palavra-chave)Máscara de bits de um ou mais valores
Characteristic.PROP_*que descrevem quais as operações que a característica suporta.attrs(apenas por palavra-chave)Máscara de bits de atributos GATT adicionais. Use
Characteristic.ATTR_CCCDpara anexar um Client Characteristic Configuration Descriptor — necessário para que as característicasPROP_NOTIFY/PROP_INDICATEfuncionem.
- read() bytearray¶
Apenas função central. Lê o valor da característica a partir do par ligado. Devolve um
bytearraycom o valor mais recente. Num periférico, esta operação não tem efeito e devolveNone.
- write(data, *, with_response: bool = False) None¶
Escreve na característica.
Num periférico, se
PROP_NOTIFYestiver definido nas propriedades da característica, o valor é enviado como uma notificação GATT para o central ligado; caso contrário, o valor do atributo local é atualizado.Num central, o valor é escrito no par remoto. Defina
with_response=Truepara emitir um pedido de escrita e aguardar a confirmação do par, em vez de um comando de escrita.
dataé qualquer objeto com protocolo buffer (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Classe de atalho para representar descritores GATT. A implementação atual armazena apenas o UUID e não expõe métodos — é fornecida por compatibilidade futura com revisões futuras do módulo.
- class ubluepy.Peripheral¶
O dispositivo Bluetooth LE local. A mesma classe é utilizada para funções de periférico e central; a função é selecionada pelos métodos que se chamam (
advertise()seleciona periférico,connect()seleciona central).- addService(service: Service) None¶
Regista um
Service(e todas as suas características anteriormente adicionadas) no servidor GATT local.
- getServices() list¶
Devolve a lista de serviços atualmente registados neste
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Inicia o anúncio em função de periférico.
device_nameNome local completo anunciado no payload GAP.
servicesLista de instâncias
Servicea anunciar. O UUID de cada serviço é incluído no anúncio.dataPayload de anúncio bruto opcional (
bytes/bytearray) acrescentado ao cabeçalho gerado automaticamente. Use isto para payloads específicos do fornecedor ou de beacon, como Eddystone.connectableQuando
True(predefinição), anuncia como dispositivo ligável e regista handlers de eventos GAP / GATTS para que o callbacksetConnectionHandler()configurado seja acionado na ligação, desconexão e escritas CCCD. QuandoFalse, anuncia como beacon — não são anexados handlers e o dispositivo não pode ser ligado.
- setConnectionHandler(func) None¶
Regista um callback invocado em eventos GAP e GATTS. O callback é chamado como
func(event_id, conn_handle, data)ondeevent_idé um dos valoresconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDouconstants.EVT_GATTS_WRITE,conn_handleé o handle de ligação do SoftDevice (ou handle de atributo para escritas GATTS), edataé o payload bruto do evento comobytearray(ouNonepara ligar / desligar).
- setNotificationHandler(func) None¶
Regista um callback para eventos de notificação recebidos em função central.
- withDelegate(delegate: DefaultDelegate) None¶
Anexa uma instância de
DefaultDelegatepara receber eventos GATT descodificados.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Apenas função central. Liga ao par com o endereço fornecido e descobre de forma síncrona os seus serviços primários e características. Bloqueia até que a ligação seja estabelecida e a descoberta esteja concluída; os serviços descobertos ficam então disponíveis via
getServices().addrEndereço do par como cadeia de caracteres
"xx:xx:xx:xx:xx:xx"de 17 caracteres (por exemplo, retirado deScanEntry.addr()).addr_type(apenas por palavra-chave)Ou
constants.ADDR_TYPE_PUBLIC(predefinição) ouconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
Observador GAP para descobrir dispositivos a anunciar nas proximidades. Disponível apenas quando o firmware é compilado com um SoftDevice com suporte central (s132 / s140).
- class ubluepy.ScanEntry¶
Um único relatório de anúncio capturado por
Scanner.scan(). As instâncias são devolvidas pelo scanner — não existe construtor público.- addr() str¶
Devolve o endereço do par como cadeia de caracteres
"xx:xx:xx:xx:xx:xx"de 17 caracteres.
- addr_type() int¶
Devolve o tipo de endereço do par (
constants.ADDR_TYPE_PUBLICouconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Descodifica o payload de anúncio numa lista de tuplos
(ad_type, description, value).ad_typeé o byte numérico do tipo AD (verconstants.ad_types),descriptioné o nome da constante correspondente como cadeia de caracteres (ouNonese o tipo for desconhecido), evalueé o corpo do registo AD comobytearray.
- class ubluepy.DefaultDelegate¶
Classe base para objetos passados a
Peripheral.withDelegate(). Crie uma subclasse e substituahandleConnection()/handleNotification()para reagir a eventos GATT.
Constantes¶
O atributo constants do módulo é um espaço de nomes que contém identificadores de eventos GAP/GATT, valores de tipo de endereço e o espaço de nomes aninhado ad_types.
- constants.EVT_GAP_CONNECTED: int¶
Valor de
event_iddo handler de ligação doPeripheralpara ligação GAP (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Valor de
event_iddo handler de ligação doPeripheralpara desconexão GAP (17).
- constants.EVT_GATTS_WRITE: int¶
Valor de
event_iddo handler de ligação doPeripheralpara uma escrita num atributo GATT local, incluindo escritas num CCCD que ativam/desativam notificações (80).
- constants.UUID_CCCD: int¶
UUID Bluetooth padrão para o Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Espaço de nomes das constantes de tipo AD de dados de anúncio da Bluetooth Core Specification Supplement. Cada nome mapeia para o tipo AD de 1 byte correspondente:
Nome
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