ubluepy — Bluetooth LE periferie a centrála¶
Modul ubluepy je starší Bluetooth LE API dodávané s nRF portem MicroPythonu. Je volně modelováno podle Linuxové Python knihovny bluepy a leží přímo nad Nordic SoftDevice — neexistuje žádný přenositelný back-end, takže modul je dostupný pouze na Nordic cílech (v nabídce OpenMV jde o Arduino Nano 33 BLE Sense). Novější API bluetooth / aioble v tomto sestavení nejsou povolena, takže ubluepy je jediný způsob, jak ovládat integrovaný radiový modul.
Dostupná sada funkcí závisí na SoftDevice naprogramovaném firmwarem:
s140 (Nano 33 BLE Sense) — jak role periferie, tak centrály (skener). Toto dodává firmware OpenMV.
s132 — jak periferie, tak centrála.
s110 — pouze periferie; metody skeneru / připojení jsou vyřazeny z kompilace.
Příklad periferie¶
Inzeruje se jako Bluetooth LE periferie s jedinou službou environmentálního snímání a notifikuje charakteristiku teploty při každém zápisu do svého 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])
Příklad centrály¶
Skenuje okolní inzerující zařízení po dobu 100 ms a dekóduje data inzerce každého 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))
Obsah modulu¶
Třídy¶
- class ubluepy.UUID(value)¶
Sestaví 16- nebo 128bitové Bluetooth UUID.
valueJedna z hodnot:
int— 16bitové číselné UUID (UUID(0x180A)).6znakový řetězec
"0xXXXX"— 16bitové UUID, např.UUID("0x181A").36znakový řetězec
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"— úplné 128bitové UUID. Část specifická pro výrobce je při konstrukci zaregistrována u SoftDevice.Jiná instance
UUID— provede kopii.
Jakákoli jiná délka vyvolá
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definuje GATT službu, která bude zaregistrována u SoftDevice po přidání k
Peripheral.uuidInstance
UUID. Předání objektu, který není UUID, vyvoláValueError.typeBuď
Service.PRIMARY(výchozí), neboService.SECONDARY. Jiné hodnoty vyvolajíValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Zaregistruje
Characteristicke službě. GATT handle charakteristiky je přiřazen během tohoto volání.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Vyhledá dříve přidanou
Characteristicpodle UUID. Vrací instanci charakteristiky, neboNone, pokud není nalezena žádná shoda.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definuje GATT charakteristiku. Přidejte ji ke
ServicepomocíService.addCharacteristic()dříve, než nadřazenáPeripheralzačne inzerovat.uuidInstance
UUID.props(pouze klíčové slovo)Bitová maska jedné nebo více hodnot
Characteristic.PROP_*popisujících, jaké operace charakteristika podporuje.attrs(pouze klíčové slovo)Bitová maska dalších GATT atributů. Použijte
Characteristic.ATTR_CCCDpro připojení Client Characteristic Configuration Descriptor — nezbytné pro fungování charakteristikPROP_NOTIFY/PROP_INDICATE.
- read() bytearray¶
Pouze role centrály. Přečte hodnotu charakteristiky z připojeného protějšku. Vrací
bytearrays nejnovější hodnotou. Na periferii nemá tato operace efekt a vracíNone.
- write(data, *, with_response: bool = False) None¶
Zapíše do charakteristiky.
Na periferii, pokud je ve vlastnostech charakteristiky nastaveno
PROP_NOTIFY, je hodnota odeslána jako GATT notifikace připojené centrále; jinak se aktualizuje hodnota lokálního atributu.Na centrále se hodnota zapíše do vzdáleného protějšku. Nastavte
with_response=Truepro vydání write requestu a čekání na potvrzení protějšku namísto write commandu.
dataje libovolný objekt podporující buffer protokol (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Pahýlová třída pro reprezentaci GATT deskriptorů. Aktuální implementace pouze ukládá UUID a nevystavuje žádné metody — je poskytována pro dopřednou kompatibilitu s budoucími verzemi modulu.
- class ubluepy.Peripheral¶
Lokální Bluetooth LE zařízení. Stejná třída se používá pro role periferie i centrály; role je vybrána podle toho, které metody zavoláte (
advertise()vybírá periferii,connect()vybírá centrálu).- addService(service: Service) None¶
Zaregistruje
Service(a všechny její dříve přidané charakteristiky) u lokálního GATT serveru.
- getServices() list¶
Vrací seznam služeb aktuálně zaregistrovaných u této
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Spustí inzerci v roli periferie.
device_nameÚplný lokální název inzerovaný v GAP payloadu.
servicesSeznam instancí
Service, které se mají inzerovat. UUID každé služby je zahrnuto v inzerci.dataVolitelný surový payload inzerce (
bytes/bytearray) připojený za automaticky generovanou hlavičku. Použijte jej pro payloady specifické pro výrobce nebo beacony, jako je Eddystone.connectablePři
True(výchozí) se inzeruje jako připojitelné zařízení a registrují se obslužné rutiny GAP / GATTS událostí, takže nakonfigurovaný callbacksetConnectionHandler()se spustí při připojení, odpojení a zápisech do CCCD. PřiFalsese inzeruje jako beacon — nepřipojují se žádné obslužné rutiny a k zařízení se nelze připojit.
- setConnectionHandler(func) None¶
Zaregistruje callback vyvolávaný při GAP a GATTS událostech. Callback je volán jako
func(event_id, conn_handle, data), kdeevent_idje jedna z hodnotconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDneboconstants.EVT_GATTS_WRITE,conn_handleje SoftDevice connection handle (nebo attribute handle pro GATTS zápisy) adataje surový payload události jakobytearray(neboNonepro připojení / odpojení).
- setNotificationHandler(func) None¶
Zaregistruje callback pro notifikační události přijaté v roli centrály.
- withDelegate(delegate: DefaultDelegate) None¶
Připojí instanci
DefaultDelegatepro příjem dekódovaných GATT událostí.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Pouze role centrály. Připojí se k protějšku se zadanou adresou a synchronně zjistí jeho primární služby a charakteristiky. Blokuje, dokud není připojení navázáno a zjišťování dokončeno; zjištěné služby jsou poté dostupné přes
getServices().addrAdresa protějšku jako 17znakový řetězec
"xx:xx:xx:xx:xx:xx"(např. získaný zScanEntry.addr()).addr_type(pouze klíčové slovo)Buď
constants.ADDR_TYPE_PUBLIC(výchozí), neboconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
GAP pozorovatel pro zjišťování okolních inzerujících zařízení. Dostupný pouze tehdy, když je firmware sestaven proti SoftDevice s podporou centrály (s132 / s140).
- class ubluepy.ScanEntry¶
Jedna zpráva inzerce zachycená metodou
Scanner.scan(). Instance jsou vraceny ze skeneru — neexistuje žádný veřejný konstruktor.- addr_type() int¶
Vrací typ adresy protějšku (
constants.ADDR_TYPE_PUBLICneboconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Dekóduje payload inzerce do seznamu n-tic
(ad_type, description, value).ad_typeje číselný bajt AD typu (vizconstants.ad_types),descriptionje název odpovídající konstanty jako řetězec (neboNone, pokud je typ neznámý) avalueje tělo AD záznamu jakobytearray.
- class ubluepy.DefaultDelegate¶
Základní třída pro objekty předávané metodě
Peripheral.withDelegate(). Vytvořte její podtřídu a přepištehandleConnection()/handleNotification()pro reakci na GATT události.
Konstanty¶
Atribut constants modulu je jmenný prostor obsahující identifikátory GAP/GATT událostí, hodnoty typů adres a vnořený jmenný prostor ad_types.
- constants.EVT_GAP_CONNECTED: int¶
Hodnota
event_idobslužné rutiny připojeníPeripheralpro GAP připojení (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Hodnota
event_idobslužné rutiny připojeníPeripheralpro GAP odpojení (17).
- constants.EVT_GATTS_WRITE: int¶
Hodnota
event_idobslužné rutiny připojeníPeripheralpro zápis do lokálního GATT atributu, včetně zápisů do CCCD, které povolují/zakazují notifikace (80).
- constants.UUID_CCCD: int¶
Standardní Bluetooth UUID pro Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Jmenný prostor konstant AD typů inzerčních dat z Bluetooth Core Specification Supplement. Každý název mapuje na odpovídající 1bajtový AD typ:
Název
Hodnota
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