ubluepy — Bluetooth LE periféria és központ¶
Az ubluepy modul a MicroPython nRF portjával szállított örökölt Bluetooth LE API. Lazán a Linux bluepy Python könyvtárra épül, és közvetlenül a Nordic SoftDevice tetején helyezkedik el — nincs hordozható háttérrendszer, így a modul csak Nordic célplatformokon érhető el (az OpenMV kínálatában az Arduino Nano 33 BLE Sense). Az újabb bluetooth / aioble API-k nincsenek engedélyezve ebben a build-ben, így az ubluepy az egyetlen módja a chipbe integrált rádió vezérlésének.
Az elérhető funkciókészlet a firmware által flashelt SoftDevice-tól függ:
s140 (Nano 33 BLE Sense) — mind a periféria, mind a központ (szkenner) szerepkör. Ezt szállítja az OpenMV firmware.
s132 — mind a periféria, mind a központ.
s110 — csak periféria; a szkenner / csatlakozási metódusok ki vannak fordítva.
Periféria példa¶
Bluetooth LE perifériaként hirdet egyetlen környezetérzékelő szolgáltatással, és értesítést küld egy hőmérséklet-karakterisztikáról a Client Characteristic Configuration Descriptor (CCCD) minden írásakor:
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])
Központ példa¶
100 ms-ig keres a közelben lévő hirdető eszközöket, és dekódolja az egyes ScanEntry hirdetési adatait:
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))
Modul tartalma¶
Osztályok¶
- class ubluepy.UUID(value)¶
Létrehoz egy 16 vagy 128 bites Bluetooth UUID-t.
valueAz alábbiak egyike:
int— egy 16 bites numerikus UUID (UUID(0x180A)).6 karakteres
"0xXXXX"karakterlánc — egy 16 bites UUID, pl.UUID("0x181A").36 karakteres
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"karakterlánc — egy teljes 128 bites UUID. A gyártóspecifikus rész a létrehozáskor regisztrálódik a SoftDevice-ban.Egy másik
UUIDpéldány — másolatot készít.
Bármely más hossz
ValueError("Invalid UUID string length")hibát vált ki.
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definiál egy GATT szolgáltatást, amely a SoftDevice-ban regisztrálódik, amikor hozzáadják egy
Peripheralobjektumhoz.uuidEgy
UUIDpéldány. Nem UUID objektum átadásaValueErrorhibát vált ki.typeVagy a
Service.PRIMARY(alapértelmezett), vagy aService.SECONDARY. Más értékekValueErrorhibát váltanak ki.
- addCharacteristic(characteristic: Characteristic) None¶
Regisztrál egy
Characteristicobjektumot a szolgáltatáshoz. A karakterisztika GATT leírója (handle) ennek a hívásnak során kerül kiosztásra.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Megkeres egy korábban hozzáadott
Characteristicobjektumot UUID alapján. Visszaadja a karakterisztika példányt, vagyNoneértéket, ha nincs találat.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definiál egy GATT karakterisztikát. Add hozzá egy
Serviceobjektumhoz aService.addCharacteristic()segítségével, mielőtt a szülőPeripheralelkezdene hirdetni.uuidEgy
UUIDpéldány.props(csak kulcsszóként)Egy vagy több
Characteristic.PROP_*érték bitmaszkja, amely leírja, hogy a karakterisztika milyen műveleteket támogat.attrs(csak kulcsszóként)További GATT attribútumok bitmaszkja. Használd a
Characteristic.ATTR_CCCDértéket egy Client Characteristic Configuration Descriptor csatolásához — ez szükséges ahhoz, hogy aPROP_NOTIFY/PROP_INDICATEkarakterisztikák működjenek.
- read() bytearray¶
Csak központ szerepkörben. Beolvassa a karakterisztika értékét a csatlakoztatott társeszközről. Egy
bytearrayobjektumot ad vissza a legutóbbi értékkel. Periférián ez egy üres művelet, ésNoneértéket ad vissza.
- write(data, *, with_response: bool = False) None¶
Ír a karakterisztikába.
Periférián, ha a
PROP_NOTIFYbe van állítva a karakterisztika tulajdonságaiban, az érték GATT értesítésként kerül elküldésre a csatlakoztatott központnak; egyébként a helyi attribútum értéke frissül.Központon az érték a távoli társeszközre íródik. Állítsd a
with_response=Trueértéket egy írási kérés kiadásához és a társeszköz visszaigazolásának bevárásához egy írási parancs helyett.
A
databármely puffer-protokollt megvalósító objektum (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Csonkosztály a GATT leírók (descriptor) reprezentálásához. A jelenlegi megvalósítás csak az UUID-t tárolja, és nem tesz elérhetővé metódusokat — a modul jövőbeli verzióival való előremutató kompatibilitás érdekében biztosított.
- class ubluepy.Peripheral¶
A helyi Bluetooth LE eszköz. Ugyanaz az osztály szolgál mind a periféria, mind a központ szerepkörhöz; a szerepkört az határozza meg, hogy mely metódusokat hívod meg (az
advertise()a perifériát választja, aconnect()a központot).- addService(service: Service) None¶
Regisztrál egy
Serviceobjektumot (és annak összes korábban hozzáadott karakterisztikáját) a helyi GATT szerverrel.
- getServices() list¶
Visszaadja az ehhez a
Peripheralobjektumhoz jelenleg regisztrált szolgáltatások listáját.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Elkezd hirdetni periféria szerepkörben.
device_nameA GAP terhelésben hirdetett teljes helyi név.
servicesA hirdetendő
Servicepéldányok listája. Minden szolgáltatás UUID-ja bekerül a hirdetésbe.dataOpcionális nyers hirdetési terhelés (
bytes/bytearray), amely az automatikusan generált fejléchez fűződik hozzá. Ezt gyártóspecifikus vagy beacon terhelésekhez használd, mint amilyen az Eddystone.connectableHa
True(alapértelmezett), csatlakoztatható eszközként hirdet, és regisztrálja a GAP / GATTS eseménykezelőket, így a beállítottsetConnectionHandler()visszahívás aktiválódik csatlakozáskor, bontáskor és CCCD írásokkor. HaFalse, beaconként hirdet — nincsenek kezelők csatolva, és az eszközhöz nem lehet csatlakozni.
- setConnectionHandler(func) None¶
Regisztrál egy visszahívást, amely a GAP és GATTS eseményekre hívódik meg. A visszahívás
func(event_id, conn_handle, data)formában kerül meghívásra, ahol azevent_idaconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDvagyconstants.EVT_GATTS_WRITEértékek egyike, aconn_handlea SoftDevice kapcsolatleírója (vagy GATTS írások esetén az attribútumleíró), adatapedig a nyers eseményterhelésbytearrayformában (vagyNonecsatlakozáskor / bontáskor).
- setNotificationHandler(func) None¶
Regisztrál egy visszahívást a központ szerepkörben fogadott értesítési eseményekhez.
- withDelegate(delegate: DefaultDelegate) None¶
Csatol egy
DefaultDelegatepéldányt a dekódolt GATT események fogadásához.
- disconnect() None¶
Bontja az aktív kapcsolatot (jelenleg üres műveletet végző csonk ebben a build-ben).
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Csak központ szerepkörben. Csatlakozik a megadott című társeszközhöz, és szinkron módon felderíti annak elsődleges szolgáltatásait és karakterisztikáit. Blokkol, amíg a kapcsolat létre nem jön és a felderítés be nem fejeződik; a felderített szolgáltatások ezután a
getServices()segítségével érhetők el.addrA társeszköz címe 17 karakteres
"xx:xx:xx:xx:xx:xx"karakterláncként (pl. aScanEntry.addr()metódusból véve).addr_type(csak kulcsszóként)Vagy a
constants.ADDR_TYPE_PUBLIC(alapértelmezett), vagy aconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
GAP megfigyelő a közelben lévő hirdető eszközök felderítéséhez. Csak akkor érhető el, ha a firmware központtámogatással rendelkező SoftDevice ellen lett fordítva (s132 / s140).
- class ubluepy.ScanEntry¶
Egyetlen hirdetési jelentés, amelyet a
Scanner.scan()rögzített. A példányokat a szkenner adja vissza — nincs nyilvános konstruktor.- addr_type() int¶
Visszaadja a társeszköz címtípusát (
constants.ADDR_TYPE_PUBLICvagyconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Dekódolja a hirdetési terhelést egy
(ad_type, description, value)rendezett párokból álló listára. Azad_typea numerikus AD-típus bájt (lásdconstants.ad_types), adescriptiona megfelelő konstans neve karakterláncként (vagyNone, ha a típus ismeretlen), avaluepedig az AD rekord törzsebytearrayformában.
- class ubluepy.DefaultDelegate¶
Az
Peripheral.withDelegate()metódusnak átadott objektumok alaposztálya. Származtasd le, és írd felül ahandleConnection()/handleNotification()metódusokat a GATT eseményekre való reagáláshoz.
Konstansok¶
A modul constants attribútuma egy névtér, amely GAP/GATT eseményazonosítókat, címtípus-értékeket és a beágyazott ad_types névteret tartalmazza.
- constants.EVT_GAP_CONNECTED: int¶
A
Peripheralkapcsolatkezelőevent_idértéke GAP csatlakozáshoz (16).
- constants.EVT_GAP_DISCONNECTED: int¶
A
Peripheralkapcsolatkezelőevent_idértéke GAP bontáshoz (17).
- constants.EVT_GATTS_WRITE: int¶
A
Peripheralkapcsolatkezelőevent_idértéke egy helyi GATT attribútumba történő íráshoz, beleértve az értesítéseket engedélyező/letiltó CCCD-be történő írásokat is (80).
- constants.UUID_CCCD: int¶
A Client Characteristic Configuration Descriptor szabványos Bluetooth UUID-ja (
0x2902).
- constants.ad_types: type¶
A hirdetési adatok AD-típus konstansainak névtere a Bluetooth Core Specification Supplement alapján. Minden név a megfelelő 1 bájtos AD-típushoz tartozik:
Név
Érték
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