bluetooth — alacsony szintű Bluetooth¶
Ez a modul interfészt biztosít a beépített Bluetooth vezérlőhöz. Támogatja a Bluetooth Low Energy (BLE) technológiát Central, Peripheral, Broadcaster és Observer szerepkörökben, valamint a GATT Server és Client és az L2CAP kapcsolatorientált csatornákat. Egy eszköz egyszerre több szerepkörben is működhet. A párosítás (pairing) és a kötés (bonding) is támogatott.
Ezt az API-t úgy tervezték, hogy illeszkedjen az alacsony szintű Bluetooth protokollhoz, és építőelemeket biztosítson a magasabb szintű absztrakciókhoz, mint például a konkrét eszköztípusokhoz.
Javaslat
A legtöbb alkalmazáshoz inkább a magasabb szintű aioble könyvtárat érdemes használni, amely egy asyncio-alapú burkolót biztosít e modul köré. Lásd: aioble — Aszinkron BLE.
class BLE¶
- class bluetooth.BLE¶
Visszaadja a singleton BLE objektumot.
Konfiguráció
- active(active: bool | None = None, /) bool¶
Opcionálisan módosítja a BLE rádió aktív állapotát, és visszaadja az aktuális állapotot.
A rádiót aktívvá kell tenni, mielőtt bármilyen más metódust használnánk ezen az osztályon.
- config(param: str, /) Any¶
- config(*, **kwargs: Any) None
Lekérdezi vagy beállítja a BLE interfész konfigurációs értékeit. Egy érték lekérdezéséhez a paraméter nevét sztringként idézőjelbe kell tenni, és egyszerre csak egy paraméter kérdezhető le. Értékek beállításához a kulcsszavas szintaxist kell használni, és egyszerre egy vagy több paraméter is beállítható.
A jelenleg támogatott értékek a következők:
'mac': A jelenleg használt cím, az aktuális címmódtól függően. Ez egy(addr_type, addr)tuple-t ad vissza.A címtípusokról a részleteket lásd a
gap_scanleírásában.Ez csak akkor kérdezhető le, amíg az interfész éppen aktív.
'addr_mode': Beállítja a címmódot. Az értékek a következők:Érték
Név
Viselkedés
0x00PUBLIC
A vezérlő nyilvános címének használata.
0x01RANDOM
Egy generált statikus cím használata.
0x02RPA
Feloldható privát címek (resolvable private address) használata.
0x03NRPA
Nem feloldható privát címek (non-resolvable private address) használata.
Alapértelmezés szerint az interfész PUBLIC címet használ, ha elérhető, egyébként RANDOM címet.
'gap_name': Lekérdezi/beállítja a Generic Access szolgáltatás (UUID0x1800) Device Name karakterisztikája (UUID0x2a00) által használt GAP eszköznevet. Ez bármikor beállítható és többször is módosítható.'rxbuf': Lekérdezi/beállítja a bejövő események tárolására használt belső puffer méretét bájtban. Ez a puffer az egész BLE meghajtó számára globális, így minden esemény bejövő adatait kezeli, beleértve az összes karakterisztikát. Növelésével jobban kezelhető a szakaszosan érkező bejövő adat (például a beolvasási eredmények), és nagyobb karakterisztika-értékek fogadhatók.'mtu': Lekérdezi/beállítja azt az MTU-t, amelyet egy ATT MTU-csere során használnak. Az eredményül kapott MTU ennek és a távoli eszköz MTU-jának a minimuma lesz. Az ATT MTU-csere nem történik meg automatikusan (kivéve, ha a távoli eszköz kezdeményezi), és manuálisan kell elindítani agattc_exchange_mtusegítségével. Az_IRQ_MTU_EXCHANGEDesemény segítségével deríthető ki egy adott kapcsolat MTU-ja.'bond': Beállítja, hogy a kötés (bonding) engedélyezve legyen-e a párosítás során. Ha engedélyezve van, a párosítási kérések beállítják a „bond” jelzőt, és a kulcsokat mindkét eszköz eltárolja.'mitm': Beállítja, hogy szükséges-e MITM-védelem a párosításhoz.'io': Beállítja az eszköz I/O képességeit.Az elérhető opciók a következők:
Konstans
Érték
Képesség
_IO_CAPABILITY_DISPLAY_ONLY0
Csak kijelző
_IO_CAPABILITY_DISPLAY_YESNO1
Kijelző igen/nem bemenettel
_IO_CAPABILITY_KEYBOARD_ONLY2
Csak billentyűzet
_IO_CAPABILITY_NO_INPUT_OUTPUT3
Nincs be- vagy kimenet
_IO_CAPABILITY_KEYBOARD_DISPLAY4
Billentyűzet és kijelző
'le_secure': Beállítja, hogy szükséges-e „LE Secure” párosítás. Az alapértelmezés false (azaz a „Legacy Pairing” engedélyezett).
Eseménykezelés
- irq(handler: Callable[[int, Tuple], Any | None], /) None¶
Regisztrál egy visszahívást a BLE stack eseményeihez. A handler két argumentumot fogad:
event(amely az alábbi kódok egyike lesz) ésdata(amely egy eseményspecifikus értéktuple).Megjegyzés: A szükségtelen allokációk elkerülése érdekében végzett optimalizálásként a tuple-ökben szereplő
addr,adv_data,char_data,notify_dataésuuidbejegyzések csak olvasható memoryview példányok, amelyek abluetoothbelső gyűrűpufferére mutatnak, és csak az IRQ kezelőfüggvény meghívásának ideje alatt érvényesek. Ha a programnak az egyik ilyen értéket el kell mentenie, hogy az IRQ kezelő visszatérése után is hozzáférhessen (pl. egy osztálypéldányban vagy globális változóban mentve), akkor másolatot kell készítenie az adatról, akárbytes(), akárbluetooth.UUID()használatával, így:connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
Például egy beolvasási eredmény IRQ kezelője megvizsgálhatja az
adv_datatartalmát, hogy eldöntse, ez-e a megfelelő eszköz, és csak ezután másolja le a cím adatát a program máshol történő használatára. Az IRQ kezelőn belüli adatok kiírásához pedig aprint(bytes(addr))szükséges.Egy kezelő jellemzően az eseménykód alapján szétoszt (dispatch), és kicsomagolja az eseményspecifikus payload tuple-t:
def bt_irq(event, data): if event == _IRQ_CENTRAL_CONNECT: conn_handle, addr_type, addr = data ... elif event == _IRQ_SCAN_RESULT: addr_type, addr, adv_type, rssi, adv_data = data ...
Az összes eseménykódot, az általuk szállított payloadot és egy rövid leírást az alábbiakban sorolunk fel. Azon eseményeknél, ahol a
statusmező említésre kerül, astatussiker esetén0, hiba esetén pedig egy implementációfüggő, nem nulla érték.Konstans
Érték
Esemény
Payload tuple
_IRQ_CENTRAL_CONNECT1
Egy central csatlakozott ehhez a peripheralhez.
(conn_handle, addr_type, addr)_IRQ_CENTRAL_DISCONNECT2
Egy central lekapcsolódott erről a peripheralről.
(conn_handle, addr_type, addr)_IRQ_GATTS_WRITE3
Egy csatlakozott kliens írt egy helyi karakterisztikába vagy leíróba. Az új érték lekéréséhez használja a
gatts_readmetódust.(conn_handle, attr_handle)_IRQ_GATTS_READ_REQUEST4
Egy csatlakozott kliens olvasást kezdeményezett. Az olvasás elutasításához adjon vissza egy nem nulla hibakódot az alábbi táblázatból, vagy
0/Noneértéket az elfogadásához.(conn_handle, attr_handle)_IRQ_SCAN_RESULT5
Egy aktív beolvasás során egyetlen hirdetési (advertising) csomag érkezett.
(addr_type, addr, adv_type, rssi, adv_data)_IRQ_SCAN_DONE6
Az aktuális beolvasás befejeződött, vagy mert a beállított időtartam letelt, vagy mert a
gap_scan(None)hívás megtörtént.()_IRQ_PERIPHERAL_CONNECT7
Egy korábban kiadott
gap_connectsikeresen lefutott.(conn_handle, addr_type, addr)_IRQ_PERIPHERAL_DISCONNECT8
Egy csatlakozott peripheral lekapcsolódott.
(conn_handle, addr_type, addr)_IRQ_GATTC_SERVICE_RESULT9
A
gattc_discover_servicesegy szolgáltatást talált.(conn_handle, start_handle, end_handle, uuid)_IRQ_GATTC_SERVICE_DONE10
A szolgáltatásfelderítés befejeződött.
(conn_handle, status)_IRQ_GATTC_CHARACTERISTIC_RESULT11
A
gattc_discover_characteristicsegy karakterisztikát talált.(conn_handle, end_handle, value_handle, properties, uuid)_IRQ_GATTC_CHARACTERISTIC_DONE12
A karakterisztika-felderítés befejeződött.
(conn_handle, status)_IRQ_GATTC_DESCRIPTOR_RESULT13
A
gattc_discover_descriptorsegy leírót talált.(conn_handle, dsc_handle, uuid)_IRQ_GATTC_DESCRIPTOR_DONE14
A leíró-felderítés befejeződött.
(conn_handle, status)_IRQ_GATTC_READ_RESULT15
Egy korábban kiadott
gattc_readadatot adott vissza.(conn_handle, value_handle, char_data)_IRQ_GATTC_READ_DONE16
Egy korábban kiadott
gattc_readbefejeződött.(conn_handle, value_handle, status)_IRQ_GATTC_WRITE_DONE17
Egy korábban kiadott
gattc_writenyugtázásra került.(conn_handle, value_handle, status)_IRQ_GATTC_NOTIFY18
Egy távoli szerver (nem nyugtázott) értesítést (notification) küldött.
(conn_handle, value_handle, notify_data)_IRQ_GATTC_INDICATE19
Egy távoli szerver (nyugtázott) jelzést (indication) küldött.
(conn_handle, value_handle, notify_data)_IRQ_GATTS_INDICATE_DONE20
Egy korábban küldött jelzést a kliens nyugtázott (vagy időtúllépés történt).
(conn_handle, value_handle, status)_IRQ_MTU_EXCHANGED21
Egy ATT MTU-csere befejeződött (bármelyik oldal kezdeményezhette).
(conn_handle, mtu)_IRQ_L2CAP_ACCEPT22
Egy távoli eszköz L2CAP kapcsolatot kért egy PSM-en, amelyen ez az eszköz figyel. Az elutasításhoz adjon vissza egy nem nulla egész számot, vagy
0/Noneértéket az elfogadásához.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_CONNECT23
Egy L2CAP csatorna létrejött, akár egy bejövő kérés elfogadásával, akár egy kimenő
l2cap_connectbefejezésével.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_DISCONNECT24
Egy L2CAP csatorna lekapcsolódott. A
status0tiszta lekapcsolódás esetén, vagy nem nulla, ha egy kimenő kapcsolódási kísérlet meghiúsult.(conn_handle, cid, psm, status)_IRQ_L2CAP_RECV25
Adat érkezett egy L2CAP csatornán. Az olvasáshoz hívja meg a
l2cap_recvintometódust.(conn_handle, cid)_IRQ_L2CAP_SEND_READY26
Egy korábbi
l2cap_send, amelyFalseértéket adott vissza, kiürült, és a csatorna ismét készen áll. A nem nullastatusazt jelenti, hogy az adóbuffer túlcsordult, és az alkalmazásnak újra kell küldenie az adatot.(conn_handle, cid, status)_IRQ_CONNECTION_UPDATE27
A távoli eszköz frissítette a kapcsolat paramétereit (intervallum, késleltetés, felügyeleti időtúllépés).
(conn_handle, conn_interval, conn_latency, supervision_timeout, status)_IRQ_ENCRYPTION_UPDATE28
Egy kapcsolat titkosítási állapota megváltozott, jellemzően a párosítás vagy a kötés befejezése után.
(conn_handle, encrypted, authenticated, bonded, key_size)_IRQ_GET_SECRET29
A stack egy tárolt kötési titkot (bonding secret) kér. Ha a
keyNone, adja vissza asec_typeindex. tárolt értékét; egyébként adja vissza az adott(sec_type, key)párhoz tartozó értéket. Adjon visszaNoneértéket, ha semmi sincs tárolva.(sec_type, index, key)_IRQ_SET_SECRET30
A stack arra kéri az alkalmazást, hogy egy kötési titkot tartósan tároljon. A tárolás után adjon vissza
Trueértéket.(sec_type, key, value)_IRQ_PASSKEY_ACTION31
A párosítás részeként egy jelszó (passkey) művelet szükséges. Válaszoljon a
gap_passkeysegítségével; a lehetséges műveleteket lásd az alábbi jelszóművelet-táblázatban.(conn_handle, action, passkey)Az
_IRQ_GATTS_READ_REQUESTeseményhez a rendelkezésre álló visszatérési kódok a következők:Konstans
Érték
Jelentés
_GATTS_NO_ERROR0x00Az olvasás elfogadása.
_GATTS_ERROR_READ_NOT_PERMITTED0x02Olvasás nem engedélyezett.
_GATTS_ERROR_WRITE_NOT_PERMITTED0x03Írás nem engedélyezett.
_GATTS_ERROR_INSUFFICIENT_AUTHENTICATION0x05A kliens nincs hitelesítve.
_GATTS_ERROR_INSUFFICIENT_AUTHORIZATION0x08A kliens nincs feljogosítva.
_GATTS_ERROR_INSUFFICIENT_ENCRYPTION0x0fA kapcsolat nincs titkosítva.
Az
_IRQ_PASSKEY_ACTIONeseményhez a rendelkezésre álló műveletek a következők:Konstans
Érték
Jelentés
_PASSKEY_ACTION_NONE0
Nincs szükség műveletre.
_PASSKEY_ACTION_INPUT2
Kérje meg a felhasználót, hogy adja meg a távoli eszközön megjelenített jelszót.
_PASSKEY_ACTION_DISPLAY3
Jelenítsen meg egy 6 jegyű jelszót, amelyet a távoli eszközön kell megadni.
_PASSKEY_ACTION_NUMERIC_COMPARISON4
Erősítse meg, hogy a jelszó megegyezik a távoli eszközön megjelenítettel.
A firmware helytakarékossága érdekében ezek a konstansok nincsenek belefoglalva a
bluetoothmodulba. A fenti listákból adja hozzá a programjához azokat, amelyekre szüksége van.
Broadcaster szerepkör (hirdető)
- gap_advertise(interval_us: int | None, adv_data: bytes | None = None, *, resp_data: bytes | None = None, connectable: bool = True) None¶
Megkezdi a hirdetést a megadott intervallummal (mikroszekundumban). Ez az intervallum lefelé kerekítődik a legközelebbi 625us-ra. A hirdetés leállításához állítsa az interval_us értékét
None-ra.Az adv_data és a resp_data bármilyen olyan típus lehet, amely megvalósítja a buffer protokollt (pl.
bytes,bytearray,str). Az adv_data minden adásban szerepel, a resp_data pedig egy aktív beolvasásra adott válaszként kerül elküldésre.Megjegyzés: ha az adv_data (vagy a resp_data)
None, akkor agap_advertiseelőző hívásának átadott adatot használja újra. Ez lehetővé teszi, hogy a broadcaster mindössze egygap_advertise(interval_us)hívással folytassa a hirdetést. A hirdetési payload törléséhez adjon át egy üresbytesértéket, azazb''.
Observer szerepkör (beolvasó)
- gap_scan(duration_ms: int | None, interval_us: int = 1280000, window_us: int = 11250, active: bool = False, /) None¶
Lefuttat egy beolvasási műveletet a megadott időtartamra (milliszekundumban).
A határozatlan idejű beolvasáshoz állítsa a duration_ms értékét
0-ra.A beolvasás leállításához állítsa a duration_ms értékét
None-ra.Az interval_us és a window_us segítségével opcionálisan konfigurálható a kitöltési tényező (duty cycle). A beolvasó window_us mikroszekundumig fut minden interval_us mikroszekundumban, összesen duration_ms milliszekundumig. Az alapértelmezett intervallum és ablak 1,28 másodperc, illetve 11,25 milliszekundum (háttérbeli beolvasás).
Minden beolvasási eredményhez kiváltódik az
_IRQ_SCAN_RESULTesemény,(addr_type, addr, adv_type, rssi, adv_data)eseményadattal.Az
addr_typeértékek nyilvános vagy véletlenszerű címeket jeleznek:Érték
Név
Jelentés
0x00PUBLIC
Nyilvános eszközcím.
0x01RANDOM
Véletlenszerű cím (statikus, RPA vagy NRPA; a típus magában a címben van kódolva).
Az
adv_typeértékek a Bluetooth specifikációnak felelnek meg:Érték
Név
Jelentés
0x00ADV_IND
Csatlakoztatható és beolvasható, irányítatlan hirdetés.
0x01ADV_DIRECT_IND
Csatlakoztatható, irányított hirdetés.
0x02ADV_SCAN_IND
Beolvasható, irányítatlan hirdetés.
0x03ADV_NONCONN_IND
Nem csatlakoztatható, irányítatlan hirdetés.
0x04SCAN_RSP
Beolvasási válasz.
Az
activeTrue-ra állítható, ha az eredményekben beolvasási válaszokat is fogadni szeretne.Amikor a beolvasás leáll (akár az időtartam lejárta miatt, akár kifejezett leállításkor), kiváltódik az
_IRQ_SCAN_DONEesemény.
Central szerepkör
Egy central eszköz csatlakozhat olyan peripheralekhez, amelyeket az observer szerepkör segítségével fedezett fel (lásd
gap_scan), vagy ismert cím alapján.- gap_connect(addr_type: int | None, addr: bytes | None = None, scan_duration_ms: int = 2000, min_conn_interval_us: int | None = None, max_conn_interval_us: int | None = None, /) None¶
Csatlakozás egy peripheralhez.
A címtípusokról a részleteket lásd a
gap_scanleírásában.Egy folyamatban lévő kapcsolódási kísérlet korai megszakításához hívja meg a
gap_connect(None)metódust.Siker esetén kiváltódik az
_IRQ_PERIPHERAL_CONNECTesemény. Egy kapcsolódási kísérlet megszakításakor pedig az_IRQ_PERIPHERAL_DISCONNECTesemény váltódik ki.Az eszköz legfeljebb scan_duration_ms ideig vár, hogy hirdetési payloadot kapjon az eszköztől.
A kapcsolat intervalluma mikroszekundumban konfigurálható a min_conn_interval_us és max_conn_interval_us egyikével vagy mindkettővel. Egyébként egy alapértelmezett intervallum kerül kiválasztásra, jellemzően 30000 és 50000 mikroszekundum között. A rövidebb intervallum növeli az átviteli teljesítményt, az energiafogyasztás rovására.
Peripheral szerepkör
Egy peripheral eszköztől elvárt, hogy csatlakoztatható hirdetéseket küldjön (lásd
gap_advertise). Általában GATT szerverként működik, miután először regisztrálta a szolgáltatásokat és karakterisztikákat agatts_register_servicessegítségével.Amikor egy central csatlakozik, kiváltódik az
_IRQ_CENTRAL_CONNECTesemény.Central és Peripheral szerepkörök
- gap_disconnect(conn_handle: int, /) bool¶
Lekapcsolja a megadott kapcsolatkezelőt (connection handle). Ez lehet egy central, amely ehhez az eszközhöz csatlakozott (ha peripheralként működik), vagy egy peripheral, amelyhez ez az eszköz korábban csatlakozott (ha centralként működik).
Siker esetén kiváltódik az
_IRQ_PERIPHERAL_DISCONNECTvagy az_IRQ_CENTRAL_DISCONNECTesemény.Falseértéket ad vissza, ha a kapcsolatkezelő nem volt csatlakoztatva, egyébkéntTrueértéket.
GATT Server
Egy GATT szervernek van egy regisztrált szolgáltatáskészlete. Minden szolgáltatás tartalmazhat karakterisztikákat, amelyeknek mindegyike rendelkezik egy értékkel. A karakterisztikák leírókat is tartalmazhatnak, amelyeknek szintén vannak értékeik.
Ezek az értékek helyileg vannak tárolva, és a szolgáltatásregisztráció során generált „value handle” segítségével érhetők el. Egy távoli kliens eszköz is olvashatja vagy írhatja őket. Ezenkívül egy szerver „értesítheti” (notify) egy karakterisztikáról egy csatlakozott klienst egy kapcsolatkezelőn keresztül.
Egy central vagy peripheral szerepkörű eszköz egyaránt működhet GATT szerverként, azonban a legtöbb esetben gyakoribb, hogy egy peripheral eszköz lát el szerver szerepet.
A karakterisztikák és leírók alapértelmezett maximális mérete 20 bájt (az alapértelmezett 23 bájtos ATT MTU mínusz egy 3 bájtos ATT fejléc; egy nagyobb egyeztetett MTU önmagában nem emeli meg ezt a korlátot). Bármi, amit egy kliens beléjük ír, erre a hosszra csonkolódik. Azonban bármilyen helyi írás megnöveli a maximális méretet, így ha lehetővé szeretné tenni egy kliens számára a nagyobb írásokat egy adott karakterisztikába, használja a
gatts_writemetódust a regisztráció után, pl.gatts_write(char_handle, bytes(100)).- gatts_register_services(services_definition: Sequence[Sequence], /) Sequence[Sequence[int]]¶
Konfigurálja a szervert a megadott szolgáltatásokkal, lecserélve minden meglévő szolgáltatást.
A services_definition a szolgáltatások (services) listája, ahol minden szolgáltatás egy kételemű tuple, amely egy UUID-t és a karakterisztikák listáját tartalmazza.
Minden karakterisztika egy két- vagy háromelemű tuple, amely egy UUID-t, egy flags értéket és opcionálisan a leírók listáját tartalmazza.
Minden leíró egy kételemű tuple, amely egy UUID-t és egy flags értéket tartalmaz.
A flags az alább definiált jelzők bitenkénti VAGY (OR) kombinációja. Ezek beállítják mind a karakterisztika (vagy leíró) viselkedését, mind a biztonsági és adatvédelmi követelményeket.
A visszatérési érték egy lista (szolgáltatásonként egy elem), amely tuple-öket tartalmaz (minden elem egy value handle). A karakterisztika- és leíró-kezelők ugyanabba a tuple-be vannak laposítva, a definiálásuk sorrendjében.
A következő példa két szolgáltatást regisztrál (Heart Rate és Nordic UART):
bt = bluetooth.BLE() bt.active(True) # Heart Rate service: one Heart Rate Measurement characteristic. HR_SERVICE = ( bluetooth.UUID(0x180D), ( (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY), ), ) # Nordic UART service: a TX characteristic the client subscribes # to for notifications, and an RX characteristic it writes to. UART_SERVICE = ( bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E'), ( (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY), (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE), ), ) ((hr,), (tx, rx)) = bt.gatts_register_services( (HR_SERVICE, UART_SERVICE), )
A három value handle (
hr,tx,rx) használható agatts_read,gatts_write,gatts_notifyésgatts_indicatemetódusokkal.Megjegyzés: A hirdetést le kell állítani a szolgáltatások regisztrálása előtt.
A karakterisztikákhoz és leírókhoz elérhető jelzők a következők:
Konstans
Érték
Jelentés
_FLAG_BROADCAST0x0001A karakterisztika sugározható (broadcast).
_FLAG_READ0x0002A kliens olvashatja az értéket.
_FLAG_WRITE_NO_RESPONSE0x0004A kliens írhat anélkül, hogy választ várna.
_FLAG_WRITE0x0008A kliens nyugtázott válasszal írhat.
_FLAG_NOTIFY0x0010A szerver értesítéseket küldhet (nem nyugtázott).
_FLAG_INDICATE0x0020A szerver jelzéseket küldhet (nyugtázott).
_FLAG_AUTHENTICATED_SIGNED_WRITE0x0040A kliens aláírt írásokat hajthat végre.
_FLAG_AUX_WRITE0x0100Kiterjesztett tulajdonságok: sorba állított/megbízható írások engedélyezettek.
_FLAG_READ_ENCRYPTED0x0200Az olvasás titkosított kapcsolatot igényel.
_FLAG_READ_AUTHENTICATED0x0400Az olvasás hitelesített (MITM-védett) kapcsolatot igényel.
_FLAG_READ_AUTHORIZED0x0800Az olvasás alkalmazásszintű feljogosítást igényel.
_FLAG_WRITE_ENCRYPTED0x1000Az írás titkosított kapcsolatot igényel.
_FLAG_WRITE_AUTHENTICATED0x2000Az írás hitelesített (MITM-védett) kapcsolatot igényel.
_FLAG_WRITE_AUTHORIZED0x4000Az írás alkalmazásszintű feljogosítást igényel.
A fenti eseménykonstansokhoz hasonlóan ezeket a jelzőket sem biztosítja a
bluetoothmodul; másolja a programjába azokat, amelyekre szüksége van.
- gatts_read(value_handle: int, /) bytes¶
Beolvassa az ehhez a handle-höz tartozó helyi értéket (amelyet vagy a
gatts_writeírt, vagy egy távoli kliens).
- gatts_write(value_handle: int, data: bytes, send_update: bool = False, /) None¶
Beírja az ehhez a handle-höz tartozó helyi értéket, amelyet egy kliens olvashat.
Ha a send_update
True, akkor minden feliratkozott kliens értesítést (vagy jelzést, attól függően, hogy mire iratkoztak fel, és milyen műveleteket támogat a karakterisztika) kap erről az írásról.
- gatts_notify(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Értesítési kérést küld egy csatlakozott kliensnek.
Ha a data
None(az alapértelmezés), akkor az aktuális helyi érték (amelyet agatts_writeállított be) kerül elküldésre.Egyébként, ha a data nem
None, akkor ez az érték kerül elküldésre a kliensnek az értesítés részeként. A helyi érték nem módosul.Megjegyzés: Az értesítés a kliens ezen karakterisztikára vonatkozó feliratkozási állapotától függetlenül kerül elküldésre.
- gatts_indicate(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Jelzési kérést küld egy csatlakozott kliensnek.
Ha a data
None(az alapértelmezés), akkor az aktuális helyi érték (amelyet agatts_writeállított be) kerül elküldésre.Egyébként, ha a data nem
None, akkor ez az érték kerül elküldésre a kliensnek a jelzés részeként. A helyi érték nem módosul.Nyugtázáskor (vagy hiba, pl. időtúllépés esetén) kiváltódik az
_IRQ_GATTS_INDICATE_DONEesemény.Megjegyzés: A jelzés a kliens ezen karakterisztikára vonatkozó feliratkozási állapotától függetlenül kerül elküldésre.
- gatts_set_buffer(value_handle: int, len: int, append: bool = False, /) None¶
Beállítja egy érték belső pufferméretét bájtban. Ez korlátozza a fogadható legnagyobb írás méretét. Az alapértelmezés 20 bájt (az alapértelmezett 23 bájtos ATT MTU mínusz a 3 bájtos ATT fejléc).
Az append
True-ra állítása azt eredményezi, hogy minden távoli írás hozzáfűződik az aktuális értékhez, ahelyett, hogy lecserélné azt. Ily módon legfeljebb len bájt pufferelhető. Amikor agatts_readmetódust használja, az érték az olvasás után törlődik. Ez a funkció hasznos olyasmi megvalósításakor, mint a Nordic UART Service.
GATT Client
Egy GATT kliens felderítheti és olvashatja/írhatja a karakterisztikákat egy távoli GATT szerveren.
Gyakoribb, hogy egy central szerepkörű eszköz működik GATT kliensként, azonban egy peripheral is működhet kliensként, hogy információt derítsen ki a hozzá csatlakozott centralról (pl. az eszköznevet olvassa ki az eszközinformációs szolgáltatásból).
- gattc_discover_services(conn_handle: int, uuid: UUID | None = None, /) None¶
Lekérdezi egy csatlakozott szerver szolgáltatásait.
Opcionálisan adjon meg egy szolgáltatás uuid értéket, hogy csak azt a szolgáltatást kérdezze le.
Minden felfedezett szolgáltatáshoz kiváltódik az
_IRQ_GATTC_SERVICE_RESULTesemény, majd a befejezéskor az_IRQ_GATTC_SERVICE_DONEesemény.
- gattc_discover_characteristics(conn_handle: int, start_handle: int, end_handle: int, uuid: UUID | None = None, /) None¶
Lekérdezi egy csatlakozott szerver karakterisztikáit a megadott tartományban.
Opcionálisan adjon meg egy karakterisztika uuid értéket, hogy csak azt a karakterisztikát kérdezze le.
A
start_handle=1ésend_handle=0xffffátadása a teljes GATT attribútumkezelő-tartományt lefedi, így ez a kombináció gyakorlatilag a távoli eszköz minden szolgáltatásában keres.Minden felfedezett karakterisztikához kiváltódik az
_IRQ_GATTC_CHARACTERISTIC_RESULTesemény, majd a befejezéskor az_IRQ_GATTC_CHARACTERISTIC_DONEesemény.
- gattc_discover_descriptors(conn_handle: int, start_handle: int, end_handle: int, /) None¶
Lekérdezi egy csatlakozott szerver leíróit a megadott tartományban.
Minden felfedezett leíróhoz kiváltódik az
_IRQ_GATTC_DESCRIPTOR_RESULTesemény, majd a befejezéskor az_IRQ_GATTC_DESCRIPTOR_DONEesemény.
- gattc_read(conn_handle: int, value_handle: int, /) None¶
Távoli olvasást kezdeményez egy csatlakozott szerveren a megadott karakterisztika- vagy leíró-handle-höz.
Amikor egy érték elérhetővé válik, kiváltódik az
_IRQ_GATTC_READ_RESULTesemény, majd a befejezéskor az_IRQ_GATTC_READ_DONEesemény.
- gattc_write(conn_handle: int, value_handle: int, data: bytes, mode: int = 0, /) None¶
Távoli írást kezdeményez egy csatlakozott szerveren a megadott karakterisztika- vagy leíró-handle-höz.
A mode argumentum határozza meg az írási viselkedést, a jelenleg támogatott értékek a következők:
A
mode=0(alapértelmezett) egy válasz nélküli írás: az írás elküldésre kerül a távoli szervernek, de nem érkezik visszaigazolás, és nem váltódik ki esemény.A
mode=1egy válasszal történő írás: a távoli szervert arra kérik, hogy küldjön választ/nyugtázást arról, hogy megkapta az adatot.
Ha válasz érkezik a távoli szervertől, kiváltódik az
_IRQ_GATTC_WRITE_DONEesemény.
- gattc_exchange_mtu(conn_handle: int, /) None¶
Elindítja az MTU-cserét egy csatlakozott szerverrel, a
BLE.config(mtu=value)segítségével beállított preferált MTU használatával.Az
_IRQ_MTU_EXCHANGEDesemény kiváltódik, amikor az MTU-csere befejeződik.Az MTU-cserét jellemzően a central kezdeményezi; a NimBLE mindkét szerepkört támogatja.
L2CAP kapcsolatorientált csatornák
Ez a funkció socket-szerű adatcserét tesz lehetővé két BLE eszköz között. Miután az eszközök GAP-on keresztül csatlakoztak, bármelyik eszköz figyelhet arra, hogy a másik egy numerikus PSM-en (Protocol/Service Multiplexer) csatlakozzon.
Egy adott időpontban csak egy L2CAP csatorna lehet aktív (azaz nem csatlakozhat, miközben figyel).
Az aktív L2CAP csatornákat a kapcsolatkezelő, amelyen létrejöttek, és egy CID (channel ID) azonosítja.
A kapcsolatorientált csatornák beépített kredit-alapú folyamszabályozással rendelkeznek. Az ATT-vel ellentétben, ahol az eszközök egy közös MTU-t egyeztetnek, mind a figyelő, mind a csatlakozó eszköz egymástól független MTU-t állít be, amely korlátozza azt a maximális kintlévő adatmennyiséget, amelyet a távoli eszköz elküldhet, mielőtt az teljesen feldolgozásra kerülne a
l2cap_recvintometódusban.- l2cap_listen(psm: int, mtu: int, /) None¶
Megkezdi a bejövő L2CAP csatornakérések figyelését a megadott psm-en, a helyi MTU-t mtu-ra állítva.
Amikor egy távoli eszköz kapcsolatot kezdeményez, kiváltódik az
_IRQ_L2CAP_ACCEPTesemény, amely lehetőséget ad a figyelő szervernek a bejövő kapcsolat elutasítására (egy nem nulla egész szám visszaadásával).Miután a kapcsolat elfogadásra került, kiváltódik az
_IRQ_L2CAP_CONNECTesemény, lehetővé téve a szerver számára a channel ID (CID), valamint a helyi és a távoli MTU megszerzését.Megjegyzés: Jelenleg nem lehet leállítani a figyelést.
- l2cap_connect(conn_handle: int, psm: int, mtu: int, /) None¶
Csatlakozás egy figyelő partnerhez a megadott psm-en, a helyi MTU-t mtu-ra állítva.
Sikeres kapcsolódáskor kiváltódik az
_IRQ_L2CAP_CONNECTesemény, lehetővé téve a kliens számára a CID, valamint a helyi és a távoli (peer) MTU megszerzését.Egy sikertelen kapcsolódás az
_IRQ_L2CAP_DISCONNECTeseményt váltja ki nem nulla státusszal.
- l2cap_disconnect(conn_handle: int, cid: int, /) None¶
Lekapcsol egy aktív L2CAP csatornát a megadott conn_handle és cid segítségével.
- l2cap_send(conn_handle: int, cid: int, buf: bytes, /) bool¶
Elküldi a megadott buf-ot (amelynek támogatnia kell a buffer protokollt) a conn_handle és cid által azonosított L2CAP csatornán.
A puffernek mindkét korlátnak meg kell felelnie: nem haladhatja meg a távoli (peer) MTU-t, és nem haladhatja meg a helyi MTU kétszeresét.
Ez
Falseértéket ad vissza, ha a csatorna most „elakadt” (stalled), ami azt jelenti, hogy al2cap_sendmetódust nem szabad újra meghívni, amíg az_IRQ_L2CAP_SEND_READYesemény meg nem érkezik (ami akkor történik, amikor a távoli eszköz több kreditet ad, jellemzően miután megkapta és feldolgozta az adatot).
- l2cap_recvinto(conn_handle: int, cid: int, buf: Any | None, /) int¶
Adatot fogad a megadott conn_handle és cid segítségével a megadott buf-ba (amelynek támogatnia kell a buffer protokollt, pl. bytearray vagy memoryview).
Visszaadja a csatornáról beolvasott bájtok számát.
Ha a buf
None, akkor a rendelkezésre álló bájtok számát adja vissza.Megjegyzés: Az
_IRQ_L2CAP_RECVesemény fogadása után az alkalmazásnak addig kell folytatnia al2cap_recvintohívását, amíg nincs több bájt a fogadópufferben (jellemzően a távoli (peer) MTU méretéig).Amíg a fogadópuffer ki nem ürül, a távoli eszköz nem kap több csatornakreditet, és nem tud több adatot küldeni.
Párosítás és kötés
A párosítás (pairing) lehetővé teszi egy kapcsolat titkosítását és hitelesítését titkok cseréjén keresztül (opcionális MITM-védelemmel jelszó-hitelesítés révén).
A kötés (bonding) e titkok nem felejtő tárolóban való tárolásának folyamata. Kötés esetén egy eszköz képes feloldani egy másik eszköz feloldható privát címét (RPA) a tárolt identitásfeloldó kulcs (IRK) alapján. A kötés támogatásához az alkalmazásnak meg kell valósítania az
_IRQ_GET_SECRETés_IRQ_SET_SECRETeseményeket.- gap_pair(conn_handle: int, /) None¶
Elindítja a párosítást a távoli eszközzel.
Mielőtt ezt meghívná, győződjön meg róla, hogy az
io,mitm,le_secureésbondkonfigurációs opciók be vannak állítva (aconfigsegítségével).Sikeres párosításkor kiváltódik az
_IRQ_ENCRYPTION_UPDATEesemény.
- gap_passkey(conn_handle: int, action: int, passkey: int, /) None¶
Válaszol egy
_IRQ_PASSKEY_ACTIONeseményre a megadott conn_handle és action esetén. A passkey jelentése az action-tól függ (amely viszont a konfigurált I/O képességtől függ):Művelet
Szükséges passkey válasz
_PASSKEY_ACTION_INPUTAz a jelszó, amelyet a felhasználó leolvas a távoli eszközről.
_PASSKEY_ACTION_DISPLAYEgy helyileg generált, véletlenszerű 6 jegyű jelszó, amelyet a felhasználónak megjelenítenek.
_PASSKEY_ACTION_NUMERIC_COMPARISON1az_IRQ_PASSKEY_ACTIONeseményben megjelenített jelszó elfogadásához, vagy0a párosítás megszakításához.
class UUID¶
- class bluetooth.UUID(value: int | bytes | str, /)¶
Létrehoz egy UUID példányt a megadott
valueértékkel. A Bluetooth három UUID-szélességet használ; azUUIDbármelyiket elfogadja:UUID szélesség
Elfogadott
valuetípusokPélda
16 bites
intvagy egy 2 bájtos puffer (little-endian)UUID(0x2908)vagyUUID(b'\x08\x29')32 bites
4 bájtos puffer (little-endian)
UUID(b'\x08\x29\x00\x00')128 bites
16 bájtos puffer vagy egy kötőjeles sztring
UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')A 16 és 32 bites UUID-k jellemzően SIG által kiosztott azonosítók (lásd a Bluetooth assigned numbers oldalt); a 128 bites UUID-k általában gyártó által definiáltak.