ubluepy — Bluetooth LE-kringutrustning och -central¶
Modulen ubluepy är det äldre Bluetooth LE-API:et som levereras med MicroPythons nRF-port. Det är löst modellerat efter Linux-biblioteket bluepy för Python och ligger direkt ovanpå Nordic SoftDevice — det finns ingen portabel back-end, så modulen är endast tillgänglig på Nordic-mål (Arduino Nano 33 BLE Sense i OpenMV:s sortiment). De nyare API:erna bluetooth / aioble är inte aktiverade i detta bygge, så ubluepy är det enda sättet att driva den inbyggda radion.
Den tillgängliga uppsättningen funktioner beror på vilken SoftDevice som flashats av den fasta programvaran:
s140 (Nano 33 BLE Sense) — både kringutrustnings- och central- (scanner-) roller. Detta är vad OpenMV-firmware levererar.
s132 — både kringutrustning och central.
s110 — endast kringutrustning; scanner-/connect-metoder är bortkompilerade.
Exempel på kringutrustning¶
Annonsera som en Bluetooth LE-kringutrustning med en enda environmental sensing-tjänst och notifiera en temperaturkaraktäristik vid varje skrivning till dess 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])
Exempel på central¶
Sök efter närliggande annonserande enheter i 100 ms och avkoda annonseringsdata för varje 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))
Modulinnehåll¶
Klasser¶
- class ubluepy.UUID(value)¶
Konstruera ett 16- eller 128-bitars Bluetooth-UUID.
valueEn av:
int— ett 16-bitars numeriskt UUID (UUID(0x180A)).6-teckens
"0xXXXX"-sträng — ett 16-bitars UUID, t.ex.UUID("0x181A").36-teckens
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"-sträng — ett fullständigt 128-bitars UUID. Den leverantörsspecifika delen registreras hos SoftDevice vid konstruktion.En annan
UUID-instans — utför en kopiering.
Alla andra längder utlöser
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definiera en GATT-tjänst som registreras hos SoftDevice när den läggs till i en
Peripheral.uuidEn
UUID-instans. Att skicka ett objekt som inte är ett UUID utlöserValueError.typeAntingen
Service.PRIMARY(standard) ellerService.SECONDARY. Andra värden utlöserValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Registrera en
Characteristicmed tjänsten. Karaktäristikens GATT-handtag tilldelas under detta anrop.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Slå upp en tidigare tillagd
Characteristicvia UUID. Returnerar karaktäristikinstansen, ellerNoneom ingen matchning hittas.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definiera en GATT-karaktäristik. Lägg till den i en
ServicemedService.addCharacteristic()innan den överordnadePeripheralbörjar annonsera.uuidEn
UUID-instans.props(endast nyckelord)Bitmask med ett eller flera
Characteristic.PROP_*-värden som beskriver vilka operationer karaktäristiken stöder.attrs(endast nyckelord)Bitmask med ytterligare GATT-attribut. Använd
Characteristic.ATTR_CCCDför att koppla en Client Characteristic Configuration Descriptor — krävs för att fåPROP_NOTIFY- /PROP_INDICATE-karaktäristiker att fungera.
- read() bytearray¶
Endast centralroll. Läs karaktäristikens värde från den anslutna motparten. Returnerar en
bytearraymed det senaste värdet. På en kringutrustning är detta en no-op och returnerarNone.
- write(data, *, with_response: bool = False) None¶
Skriv till karaktäristiken.
På en kringutrustning, om
PROP_NOTIFYär inställt i karaktäristikens egenskaper skickas värdet som en GATT-notifiering till den anslutna centralen; annars uppdateras det lokala attributvärdet.På en central skrivs värdet till den fjärranslutna motparten. Ange
with_response=Trueför att utfärda en skrivbegäran och vänta på motpartens bekräftelse i stället för ett skrivkommando.
dataär vilket objekt som helst med buffertprotokoll (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Stub-klass för att representera GATT-deskriptorer. Den nuvarande implementationen lagrar endast UUID:et och exponerar inga metoder — den tillhandahålls för framåtkompatibilitet med framtida revisioner av modulen.
- class ubluepy.Peripheral¶
Den lokala Bluetooth LE-enheten. Samma klass används för både kringutrustnings- och centralroller; rollen väljs utifrån vilka metoder du anropar (
advertise()väljer kringutrustning,connect()väljer central).- addService(service: Service) None¶
Registrera en
Service(och alla dess tidigare tillagda karaktäristiker) med den lokala GATT-servern.
- getServices() list¶
Returnerar listan över de tjänster som för närvarande är registrerade med denna
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Börja annonsera i kringutrustningsroll.
device_nameFullständigt lokalt namn som annonseras i GAP-nyttolasten.
servicesLista över
Service-instanser att annonsera. Varje tjänsts UUID inkluderas i annonseringen.dataValfri rå annonseringsnyttolast (
bytes/bytearray) som läggs till efter det automatiskt genererade huvudet. Använd detta för leverantörsspecifika nyttolaster eller beacon-nyttolaster såsom Eddystone.connectableNär
True(standard), annonsera som en anslutningsbar enhet och registrera GAP-/GATTS-händelsehanterare så att det konfigureradesetConnectionHandler()-återanropet utlöses vid anslutning, frånkoppling och CCCD-skrivningar. NärFalse, annonsera som en beacon — inga hanterare kopplas och enheten kan inte anslutas till.
- setConnectionHandler(func) None¶
Registrera ett återanrop som anropas vid GAP- och GATTS-händelser. Återanropet anropas som
func(event_id, conn_handle, data)därevent_idär ett av värdenaconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDellerconstants.EVT_GATTS_WRITE,conn_handleär SoftDevices anslutningshandtag (eller attributhandtag för GATTS-skrivningar), ochdataär den råa händelsenyttolasten som enbytearray(ellerNonevid anslutning/frånkoppling).
- setNotificationHandler(func) None¶
Registrera ett återanrop för notifieringshändelser som tas emot i centralroll.
- withDelegate(delegate: DefaultDelegate) None¶
Koppla en
DefaultDelegate-instans för att ta emot avkodade GATT-händelser.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Endast centralroll. Anslut till motparten med den angivna adressen och upptäck synkront dess primära tjänster och karaktäristiker. Blockerar tills anslutningen är upprättad och upptäckten slutförts; de upptäckta tjänsterna är därefter tillgängliga via
getServices().addrMotpartsadress som en 17-teckens
"xx:xx:xx:xx:xx:xx"-sträng (t.ex. hämtad frånScanEntry.addr()).addr_type(endast nyckelord)Antingen
constants.ADDR_TYPE_PUBLIC(standard) ellerconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
GAP-observatör för att upptäcka närliggande annonserande enheter. Tillgänglig endast när den fasta programvaran är byggd mot en SoftDevice med centralstöd (s132 / s140).
- class ubluepy.ScanEntry¶
En enskild annonseringsrapport som fångats av
Scanner.scan(). Instanser returneras från scannern — det finns ingen publik konstruktor.- addr_type() int¶
Returnerar motpartens adresstyp (
constants.ADDR_TYPE_PUBLICellerconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Avkoda annonseringsnyttolasten till en lista över
(ad_type, description, value)-tupplar.ad_typeär den numeriska AD-typbyten (seconstants.ad_types),descriptionär den matchande konstantens namn som en sträng (ellerNoneom typen är okänd), ochvalueär AD-postens kropp som enbytearray.
- class ubluepy.DefaultDelegate¶
Basklass för objekt som skickas till
Peripheral.withDelegate(). Subklassa den och åsidosätthandleConnection()/handleNotification()för att reagera på GATT-händelser.
Konstanter¶
Modulens constants-attribut är en namnrymd som innehåller GAP-/GATT-händelseidentifierare, adresstypvärden och den nästlade ad_types-namnrymden.
- constants.EVT_GAP_CONNECTED: int¶
event_id-värde förPeripheral-anslutningshanteraren vid GAP-anslutning (16).
- constants.EVT_GAP_DISCONNECTED: int¶
event_id-värde förPeripheral-anslutningshanteraren vid GAP-frånkoppling (17).
- constants.EVT_GATTS_WRITE: int¶
event_id-värde förPeripheral-anslutningshanteraren vid en skrivning till ett lokalt GATT-attribut, inklusive skrivningar till en CCCD som aktiverar/inaktiverar notifieringar (80).
- constants.UUID_CCCD: int¶
Standard Bluetooth-UUID för Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Namnrymd med AD-typkonstanter för annonseringsdata från Bluetooth Core Specification Supplement. Varje namn mappar till motsvarande 1-byte AD-typ:
Namn
Värde
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