bluetooth — niskorazinski Bluetooth¶
Ovaj modul pruža sučelje prema ugrađenom Bluetooth kontroleru. Podržava Bluetooth Low Energy (BLE) u ulogama Central, Peripheral, Broadcaster i Observer, kao i GATT poslužitelj i klijent te L2CAP veze orijentirane na vezu (connection-oriented kanali). Uređaj može istodobno raditi u više uloga. Također su podržani uparivanje (pairing) i povezivanje (bonding).
Ovaj API je osmišljen tako da odgovara niskorazinskom Bluetooth protokolu i pruža gradivne blokove za apstrakcije više razine, poput specifičnih tipova uređaja.
Savjet
Za većinu aplikacija preporučljivo je koristiti biblioteku više razine aioble, koja pruža omotač temeljen na asyncio oko ovog modula. Pogledajte aioble — Asinkroni BLE.
class BLE¶
- class bluetooth.BLE¶
Vraća singleton BLE objekt.
Konfiguracija
- active(active: bool | None = None, /) bool¶
Po izboru mijenja aktivno stanje BLE radija i vraća trenutno stanje.
Radio mora biti aktiviran prije korištenja bilo koje druge metode ove klase.
- config(param: str, /) Any¶
- config(*, **kwargs: Any) None
Dohvaća ili postavlja konfiguracijske vrijednosti BLE sučelja. Za dohvaćanje vrijednosti naziv parametra treba navesti kao niz pod navodnicima, a istodobno se dohvaća samo jedan parametar. Za postavljanje vrijednosti koristite sintaksu ključnih riječi, pri čemu se istodobno može postaviti jedan ili više parametara.
Trenutno podržane vrijednosti su:
'mac': Trenutno korištena adresa, ovisno o trenutnom načinu adresiranja. Vraća n-torku(addr_type, addr).Pogledajte
gap_scanza pojedinosti o tipu adrese.Ovo se može dohvatiti samo dok je sučelje trenutno aktivno.
'addr_mode': Postavlja način adresiranja. Vrijednosti su:Vrijednost
Naziv
Ponašanje
0x00PUBLIC
Koristi javnu adresu kontrolera.
0x01RANDOM
Koristi generiranu statičku adresu.
0x02RPA
Koristi razrješive privatne adrese (resolvable private addresses).
0x03NRPA
Koristi nerazrješive privatne adrese (non-resolvable private addresses).
Prema zadanim postavkama sučelje će koristiti PUBLIC adresu ako je dostupna, a u suprotnom će koristiti RANDOM adresu.
'gap_name': Dohvaća/postavlja GAP naziv uređaja koji koristi Generic Access usluga (UUID0x1800), karakteristika Device Name (UUID0x2a00). Ovo se može postaviti u bilo kojem trenutku i mijenjati više puta.'rxbuf': Dohvaća/postavlja veličinu u bajtovima internog međuspremnika koji se koristi za pohranu dolaznih događaja. Ovaj je međuspremnik globalan za cijeli BLE upravljački program i stoga obrađuje dolazne podatke za sve događaje, uključujući sve karakteristike. Povećavanjem se omogućuje bolja obrada naglih navala dolaznih podataka (na primjer rezultata skeniranja) te mogućnost primanja većih vrijednosti karakteristika.'mtu': Dohvaća/postavlja MTU koji će se koristiti tijekom ATT MTU razmjene. Rezultirajući MTU bit će minimum ove vrijednosti i MTU-a udaljenog uređaja. ATT MTU razmjena neće se dogoditi automatski (osim ako je udaljeni uređaj ne pokrene) te se mora ručno pokrenuti pomoćugattc_exchange_mtu. Koristite događaj_IRQ_MTU_EXCHANGEDza otkrivanje MTU-a za danu vezu.'bond': Postavlja hoće li povezivanje (bonding) biti omogućeno tijekom uparivanja. Kada je omogućeno, zahtjevi za uparivanje postavit će zastavicu „bond” i oba uređaja pohranit će ključeve.'mitm': Postavlja je li za uparivanje potrebna MITM zaštita.'io': Postavlja U/I (I/O) mogućnosti ovog uređaja.Dostupne opcije su:
Konstanta
Vrijednost
Mogućnost
_IO_CAPABILITY_DISPLAY_ONLY0
Samo prikaz
_IO_CAPABILITY_DISPLAY_YESNO1
Prikaz s da/ne unosom
_IO_CAPABILITY_KEYBOARD_ONLY2
Samo tipkovnica
_IO_CAPABILITY_NO_INPUT_OUTPUT3
Bez ulaza ili izlaza
_IO_CAPABILITY_KEYBOARD_DISPLAY4
Tipkovnica i prikaz
'le_secure': Postavlja je li potrebno „LE Secure” uparivanje. Zadano je false (tj. dopušteno je „Legacy Pairing”).
Obrada događaja
- irq(handler: Callable[[int, Tuple], Any | None], /) None¶
Registrira povratni poziv za događaje iz BLE skupa (stack). handler prima dva argumenta,
event(koji će biti jedan od kodova navedenih u nastavku) idata(što je n-torka vrijednosti specifična za događaj).Napomena: Kao optimizacija radi sprječavanja nepotrebnih alokacija, unosi
addr,adv_data,char_data,notify_dataiuuidu n-torkama su instance memoryview samo za čitanje koje pokazuju na interni kružni međuspremnik (ringbuffer) modulabluetoothi valjani su samo tijekom poziva IRQ handler funkcije. Ako vaš program treba spremiti jednu od tih vrijednosti kako bi joj pristupio nakon što se IRQ handler vrati (npr. spremanjem u instancu klase ili globalnu varijablu), tada treba napraviti kopiju podataka, bilo pomoćubytes()ilibluetooth.UUID(), ovako:connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
Na primjer, IRQ handler za rezultat skeniranja mogao bi pregledati
adv_datakako bi odlučio je li to ispravan uređaj te tek tada kopirati podatke o adresi za korištenje drugdje u programu. Za ispis podataka iz samog IRQ handlera bit će potrebanprint(bytes(addr)).Handler tipično grana izvođenje prema kodu događaja i raspakirava n-torku korisnog tereta (payload) specifičnu za događaj:
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 ...
Svaki kod događaja, koristan teret (payload) koji isporučuje i kratki opis navedeni su u nastavku. Za događaje kod kojih se spominje polje
status,statusje0u slučaju uspjeha i nenulta vrijednost specifična za implementaciju u slučaju neuspjeha.Konstanta
Vrijednost
Događaj
N-torka korisnog tereta
_IRQ_CENTRAL_CONNECT1
Central se povezao s ovim periferalom.
(conn_handle, addr_type, addr)_IRQ_CENTRAL_DISCONNECT2
Central se odspojio s ovog periferala.
(conn_handle, addr_type, addr)_IRQ_GATTS_WRITE3
Povezani klijent zapisao je u lokalnu karakteristiku ili deskriptor. Koristite
gatts_readza dohvaćanje nove vrijednosti.(conn_handle, attr_handle)_IRQ_GATTS_READ_REQUEST4
Povezani klijent izdao je zahtjev za čitanje. Vratite nenulti kod pogreške iz tablice u nastavku da biste odbili čitanje ili
0/Noneda biste ga prihvatili.(conn_handle, attr_handle)_IRQ_SCAN_RESULT5
Tijekom aktivnog skeniranja primljen je jedan oglasni paket (advertising packet).
(addr_type, addr, adv_type, rssi, adv_data)_IRQ_SCAN_DONE6
Trenutno skeniranje je završilo, bilo zato što je isteklo konfigurirano trajanje ili zato što je pozvan
gap_scan(None).()_IRQ_PERIPHERAL_CONNECT7
Prethodno izdani
gap_connectje uspio.(conn_handle, addr_type, addr)_IRQ_PERIPHERAL_DISCONNECT8
Povezani periferal se odspojio.
(conn_handle, addr_type, addr)_IRQ_GATTC_SERVICE_RESULT9
Jedna usluga pronađena je pomoću
gattc_discover_services.(conn_handle, start_handle, end_handle, uuid)_IRQ_GATTC_SERVICE_DONE10
Otkrivanje usluga je završilo.
(conn_handle, status)_IRQ_GATTC_CHARACTERISTIC_RESULT11
Jedna karakteristika pronađena je pomoću
gattc_discover_characteristics.(conn_handle, end_handle, value_handle, properties, uuid)_IRQ_GATTC_CHARACTERISTIC_DONE12
Otkrivanje karakteristika je završilo.
(conn_handle, status)_IRQ_GATTC_DESCRIPTOR_RESULT13
Jedan deskriptor pronađen je pomoću
gattc_discover_descriptors.(conn_handle, dsc_handle, uuid)_IRQ_GATTC_DESCRIPTOR_DONE14
Otkrivanje deskriptora je završilo.
(conn_handle, status)_IRQ_GATTC_READ_RESULT15
Prethodno izdani
gattc_readvratio je podatke.(conn_handle, value_handle, char_data)_IRQ_GATTC_READ_DONE16
Prethodno izdani
gattc_readje završio.(conn_handle, value_handle, status)_IRQ_GATTC_WRITE_DONE17
Prethodno izdani
gattc_writeje potvrđen.(conn_handle, value_handle, status)_IRQ_GATTC_NOTIFY18
Udaljeni poslužitelj poslao je (nepotvrđenu) obavijest.
(conn_handle, value_handle, notify_data)_IRQ_GATTC_INDICATE19
Udaljeni poslužitelj poslao je (potvrđenu) indikaciju.
(conn_handle, value_handle, notify_data)_IRQ_GATTS_INDICATE_DONE20
Prethodno poslanu indikaciju klijent je potvrdio (ili je isteklo vrijeme).
(conn_handle, value_handle, status)_IRQ_MTU_EXCHANGED21
ATT MTU razmjena je dovršena (pokrenuta od bilo koje strane).
(conn_handle, mtu)_IRQ_L2CAP_ACCEPT22
Udaljeni uređaj zatražio je L2CAP vezu na PSM-u koji ovaj uređaj osluškuje. Vratite nenulti cijeli broj za odbijanje ili
0/Noneza prihvaćanje.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_CONNECT23
L2CAP kanal je sada uspostavljen, bilo prihvaćanjem dolaznog zahtjeva ili dovršavanjem odlaznog
l2cap_connect.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_DISCONNECT24
L2CAP kanal je odspojen.
statusje0za čisto odspajanje ili nenulti ako odlazni pokušaj povezivanja nije uspio.(conn_handle, cid, psm, status)_IRQ_L2CAP_RECV25
Podaci su stigli na L2CAP kanal. Pozovite
l2cap_recvintoza njihovo čitanje.(conn_handle, cid)_IRQ_L2CAP_SEND_READY26
Prethodni
l2cap_sendkoji je vratioFalsese ispraznio i kanal je ponovno spreman. Nenultistatusznači da se međuspremnik za slanje prepunio i aplikacija mora ponovno poslati podatke.(conn_handle, cid, status)_IRQ_CONNECTION_UPDATE27
Udaljeni uređaj ažurirao je parametre veze (interval, latency, supervision timeout).
(conn_handle, conn_interval, conn_latency, supervision_timeout, status)_IRQ_ENCRYPTION_UPDATE28
Stanje enkripcije veze se promijenilo, tipično nakon dovršetka uparivanja ili povezivanja.
(conn_handle, encrypted, authenticated, bonded, key_size)_IRQ_GET_SECRET29
Skup (stack) zahtijeva pohranjenu tajnu povezivanja (bonding secret). Ako je
keyjednakNone, vratiteindex-tu pohranjenu vrijednost tipasec_type; u suprotnom vratite vrijednost povezanu s danim(sec_type, key). VratiteNoneako ništa nije pohranjeno.(sec_type, index, key)_IRQ_SET_SECRET30
Skup (stack) traži od aplikacije da trajno pohrani tajnu povezivanja (bonding secret). Vratite
Truenakon pohrane.(sec_type, key, value)_IRQ_PASSKEY_ACTION31
Kao dio uparivanja potrebna je radnja s pristupnim ključem (passkey). Odgovorite pomoću
gap_passkey; pogledajte tablicu radnji s pristupnim ključem u nastavku za moguće radnje.(conn_handle, action, passkey)Za događaj
_IRQ_GATTS_READ_REQUESTdostupni povratni kodovi su:Konstanta
Vrijednost
Značenje
_GATTS_NO_ERROR0x00Prihvati čitanje.
_GATTS_ERROR_READ_NOT_PERMITTED0x02Čitanje nije dopušteno.
_GATTS_ERROR_WRITE_NOT_PERMITTED0x03Pisanje nije dopušteno.
_GATTS_ERROR_INSUFFICIENT_AUTHENTICATION0x05Klijent nije autentificiran.
_GATTS_ERROR_INSUFFICIENT_AUTHORIZATION0x08Klijent nije ovlašten.
_GATTS_ERROR_INSUFFICIENT_ENCRYPTION0x0fVeza nije šifrirana.
Za događaj
_IRQ_PASSKEY_ACTIONdostupne radnje su:Konstanta
Vrijednost
Značenje
_PASSKEY_ACTION_NONE0
Nije potrebna radnja.
_PASSKEY_ACTION_INPUT2
Zatraži od korisnika da unese pristupni ključ (passkey) prikazan na udaljenom uređaju.
_PASSKEY_ACTION_DISPLAY3
Prikaži 6-znamenkasti pristupni ključ (passkey) koji udaljeni uređaj treba unijeti.
_PASSKEY_ACTION_NUMERIC_COMPARISON4
Potvrdi da se pristupni ključ (passkey) podudara s onim prikazanim na udaljenom uređaju.
Kako bi se uštedio prostor u ugrađenom programu (firmware), ove konstante nisu uključene u modul
bluetooth. Dodajte one koje su vam potrebne iz gornjih popisa u svoj program.
Broadcaster uloga (oglašivač)
- gap_advertise(interval_us: int | None, adv_data: bytes | None = None, *, resp_data: bytes | None = None, connectable: bool = True) None¶
Započinje oglašavanje na navedenom intervalu (u mikrosekundama). Ovaj će interval biti zaokružen prema dolje na najbližih 625us. Za zaustavljanje oglašavanja postavite interval_us na
None.adv_data i resp_data mogu biti bilo koji tip koji implementira buffer protokol (npr.
bytes,bytearray,str). adv_data je uključen u sva odašiljanja, a resp_data se šalje kao odgovor na aktivno skeniranje.Napomena: ako je adv_data (ili resp_data) jednak
None, tada će se ponovno upotrijebiti podaci proslijeđeni prethodnom pozivugap_advertise. To omogućuje oglašivaču da nastavi oglašavanje samo sgap_advertise(interval_us). Za brisanje korisnog tereta (payload) oglašavanja proslijedite prazanbytes, tj.b''.
Observer uloga (skener)
- gap_scan(duration_ms: int | None, interval_us: int = 1280000, window_us: int = 11250, active: bool = False, /) None¶
Pokreće operaciju skeniranja koja traje navedeno vrijeme (u milisekundama).
Za neograničeno skeniranje postavite duration_ms na
0.Za zaustavljanje skeniranja postavite duration_ms na
None.Koristite interval_us i window_us za opcionalno konfiguriranje radnog ciklusa (duty cycle). Skener će raditi window_us mikrosekundi svakih interval_us mikrosekundi, ukupno tijekom duration_ms milisekundi. Zadani interval i prozor su 1,28 sekundi odnosno 11,25 milisekundi (skeniranje u pozadini).
Za svaki rezultat skeniranja podići će se događaj
_IRQ_SCAN_RESULTs podacima događaja(addr_type, addr, adv_type, rssi, adv_data).Vrijednosti
addr_typeoznačavaju javne ili nasumične adrese:Vrijednost
Naziv
Značenje
0x00PUBLIC
Javna adresa uređaja.
0x01RANDOM
Nasumična adresa (statička, RPA ili NRPA; tip je kodiran u samoj adresi).
Vrijednosti
adv_typeodgovaraju Bluetooth specifikaciji:Vrijednost
Naziv
Značenje
0x00ADV_IND
Povezivo i skenirajuće neusmjereno oglašavanje.
0x01ADV_DIRECT_IND
Povezivo usmjereno oglašavanje.
0x02ADV_SCAN_IND
Skenirajuće neusmjereno oglašavanje.
0x03ADV_NONCONN_IND
Nepovezivo neusmjereno oglašavanje.
0x04SCAN_RSP
Odgovor na skeniranje.
activese može postaviti naTrueako želite primati odgovore na skeniranje u rezultatima.Kada se skeniranje zaustavi (bilo zbog isteka trajanja ili eksplicitnog zaustavljanja), podići će se događaj
_IRQ_SCAN_DONE.
Central uloga
Central uređaj može se povezati s periferalima koje je otkrio koristeći observer ulogu (pogledajte
gap_scan) ili s poznatom adresom.- 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¶
Povezuje se s periferalom.
Pogledajte
gap_scanza pojedinosti o tipovima adresa.Za rano otkazivanje neriješenog pokušaja povezivanja pozovite
gap_connect(None).U slučaju uspjeha podići će se događaj
_IRQ_PERIPHERAL_CONNECT. Ako se otkazuje pokušaj povezivanja, podići će se događaj_IRQ_PERIPHERAL_DISCONNECT.Uređaj će čekati do scan_duration_ms da primi korisni teret (payload) oglašavanja od uređaja.
Interval veze može se konfigurirati u mikrosekundama korištenjem jednog ili oba parametra min_conn_interval_us i max_conn_interval_us. U suprotnom će se odabrati zadani interval, tipično između 30000 i 50000 mikrosekundi. Kraći interval povećat će propusnost, ali na štetu potrošnje energije.
Peripheral uloga
Od periferalnog uređaja očekuje se da šalje poveziva oglašavanja (pogledajte
gap_advertise). Obično će djelovati kao GATT poslužitelj, nakon što je prvo registrirao usluge i karakteristike pomoćugatts_register_services.Kada se central poveže, podići će se događaj
_IRQ_CENTRAL_CONNECT.Central i Peripheral uloge
- gap_disconnect(conn_handle: int, /) bool¶
Odspaja navedeni handle veze. Ovo može biti central koji se povezao s ovim uređajem (ako djeluje kao periferal) ili periferal s kojim se ovaj uređaj prethodno povezao (ako djeluje kao central).
U slučaju uspjeha podići će se događaj
_IRQ_PERIPHERAL_DISCONNECTili_IRQ_CENTRAL_DISCONNECT.Vraća
Falseako handle veze nije bio povezan, a inačeTrue.
GATT poslužitelj
GATT poslužitelj ima skup registriranih usluga. Svaka usluga može sadržavati karakteristike, od kojih svaka ima vrijednost. Karakteristike također mogu sadržavati deskriptore, koji i sami imaju vrijednosti.
Te vrijednosti pohranjuju se lokalno, a pristupa im se putem njihovog „value handle” koji se generira tijekom registracije usluge. Također ih može čitati ili u njih pisati udaljeni klijentski uređaj. Dodatno, poslužitelj može „obavijestiti” povezanog klijenta o karakteristici putem handle veze.
Uređaj u central ili peripheral ulozi može funkcionirati kao GATT poslužitelj, no u većini će slučajeva biti uobičajenije da periferalni uređaj djeluje kao poslužitelj.
Karakteristike i deskriptori imaju zadanu maksimalnu veličinu od 20 bajtova (zadani ATT MTU od 23 bajta umanjen za 3-bajtno ATT zaglavlje; veći dogovoreni MTU sam po sebi ne podiže ovo ograničenje). Sve što klijent u njih zapiše bit će skraćeno na tu duljinu. Međutim, svaki lokalni upis povećat će maksimalnu veličinu, pa ako želite dopustiti veće upise od klijenta u danu karakteristiku, koristite
gatts_writenakon registracije. Npr.gatts_write(char_handle, bytes(100)).- gatts_register_services(services_definition: Sequence[Sequence], /) Sequence[Sequence[int]]¶
Konfigurira poslužitelj s navedenim uslugama, zamjenjujući sve postojeće usluge.
services_definition je popis usluga, gdje je svaka usluga dvoelementna n-torka koja sadrži UUID i popis karakteristika.
Svaka karakteristika je n-torka s dva ili tri elementa koja sadrži UUID, vrijednost flags i opcionalno popis deskriptora.
Svaki deskriptor je dvoelementna n-torka koja sadrži UUID i vrijednost flags.
flags su kombinacija zastavica definiranih u nastavku pomoću bitovnog OR-a. One postavljaju i ponašanje karakteristike (ili deskriptora) te zahtjeve sigurnosti i privatnosti.
Povratna vrijednost je popis (jedan element po usluzi) n-torki (svaki je element value handle). Handlevi karakteristika i deskriptora spljošteni su u istu n-torku, redoslijedom kojim su definirani.
Sljedeći primjer registrira dvije usluge (Heart Rate i 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), )
Tri value handlea (
hr,tx,rx) mogu se koristiti sgatts_read,gatts_write,gatts_notifyigatts_indicate.Napomena: Oglašavanje se mora zaustaviti prije registracije usluga.
Dostupne zastavice za karakteristike i deskriptore su:
Konstanta
Vrijednost
Značenje
_FLAG_BROADCAST0x0001Karakteristika se može odašiljati.
_FLAG_READ0x0002Klijent može čitati vrijednost.
_FLAG_WRITE_NO_RESPONSE0x0004Klijent može pisati bez očekivanja odgovora.
_FLAG_WRITE0x0008Klijent može pisati s potvrđenim odgovorom.
_FLAG_NOTIFY0x0010Poslužitelj može slati obavijesti (nepotvrđene).
_FLAG_INDICATE0x0020Poslužitelj može slati indikacije (potvrđene).
_FLAG_AUTHENTICATED_SIGNED_WRITE0x0040Klijent može izdavati potpisane upise.
_FLAG_AUX_WRITE0x0100Proširena svojstva: dopušteni su upisi u redu čekanja / pouzdani upisi.
_FLAG_READ_ENCRYPTED0x0200Čitanje zahtijeva šifriranu vezu.
_FLAG_READ_AUTHENTICATED0x0400Čitanje zahtijeva autentificiranu (MITM-zaštićenu) vezu.
_FLAG_READ_AUTHORIZED0x0800Čitanje zahtijeva ovlaštenje na razini aplikacije.
_FLAG_WRITE_ENCRYPTED0x1000Pisanje zahtijeva šifriranu vezu.
_FLAG_WRITE_AUTHENTICATED0x2000Pisanje zahtijeva autentificiranu (MITM-zaštićenu) vezu.
_FLAG_WRITE_AUTHORIZED0x4000Pisanje zahtijeva ovlaštenje na razini aplikacije.
Kao i kod gornjih konstanti događaja, ove zastavice ne pruža modul
bluetooth; kopirajte one koje su vam potrebne u svoj program.
- gatts_read(value_handle: int, /) bytes¶
Čita lokalnu vrijednost za ovaj handle (koja je zapisana ili pomoću
gatts_writeili od strane udaljenog klijenta).
- gatts_write(value_handle: int, data: bytes, send_update: bool = False, /) None¶
Zapisuje lokalnu vrijednost za ovaj handle, koju klijent može pročitati.
Ako je send_update jednak
True, tada će svi pretplaćeni klijenti biti obaviješteni (ili će im biti indicirano, ovisno o tome na što su pretplaćeni i koje operacije karakteristika podržava) o ovom upisu.
- gatts_notify(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Šalje zahtjev za obavijest povezanom klijentu.
Ako je data jednak
None(zadano), tada će se poslati trenutna lokalna vrijednost (kako je postavljena sgatts_write).U suprotnom, ako data nije
None, tada se ta vrijednost šalje klijentu kao dio obavijesti. Lokalna vrijednost neće se mijenjati.Napomena: Obavijest će se poslati bez obzira na status pretplate klijenta na ovu karakteristiku.
- gatts_indicate(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Šalje zahtjev za indikaciju povezanom klijentu.
Ako je data jednak
None(zadano), tada će se poslati trenutna lokalna vrijednost (kako je postavljena sgatts_write).U suprotnom, ako data nije
None, tada se ta vrijednost šalje klijentu kao dio indikacije. Lokalna vrijednost neće se mijenjati.Po potvrdi (ili neuspjehu, npr. isteku vremena) podići će se događaj
_IRQ_GATTS_INDICATE_DONE.Napomena: Indikacija će se poslati bez obzira na status pretplate klijenta na ovu karakteristiku.
- gatts_set_buffer(value_handle: int, len: int, append: bool = False, /) None¶
Postavlja veličinu internog međuspremnika za vrijednost u bajtovima. To će ograničiti najveći mogući upis koji se može primiti. Zadano je 20 bajtova (zadani ATT MTU od 23 umanjen za 3-bajtno ATT zaglavlje).
Postavljanje append na
Trueučinit će da se svi udaljeni upisi dodaju trenutnoj vrijednosti, umjesto da je zamijene. Na ovaj se način može međuspremiti najviše len bajtova. Kada koristitegatts_read, vrijednost će biti obrisana nakon čitanja. Ova je značajka korisna pri implementaciji nečega poput Nordic UART usluge.
GATT klijent
GATT klijent može otkrivati i čitati/pisati karakteristike na udaljenom GATT poslužitelju.
Uobičajenije je da uređaj u central ulozi djeluje kao GATT klijent, no također je moguće da periferal djeluje kao klijent kako bi otkrio informacije o centralu koji se s njim povezao (npr. za čitanje naziva uređaja iz usluge informacija o uređaju).
- gattc_discover_services(conn_handle: int, uuid: UUID | None = None, /) None¶
Upituje povezani poslužitelj o njegovim uslugama.
Po izboru navedite uuid usluge za upit samo o toj usluzi.
Za svaku otkrivenu uslugu podići će se događaj
_IRQ_GATTC_SERVICE_RESULT, a po dovršetku_IRQ_GATTC_SERVICE_DONE.
- gattc_discover_characteristics(conn_handle: int, start_handle: int, end_handle: int, uuid: UUID | None = None, /) None¶
Upituje povezani poslužitelj o karakteristikama u navedenom rasponu.
Po izboru navedite uuid karakteristike za upit samo o toj karakteristici.
Prosljeđivanje
start_handle=1iend_handle=0xffffpokriva cijeli raspon GATT handleva atributa, pa ova kombinacija zapravo pretražuje svaku uslugu na udaljenom uređaju.Za svaku otkrivenu karakteristiku podići će se događaj
_IRQ_GATTC_CHARACTERISTIC_RESULT, a po dovršetku_IRQ_GATTC_CHARACTERISTIC_DONE.
- gattc_discover_descriptors(conn_handle: int, start_handle: int, end_handle: int, /) None¶
Upituje povezani poslužitelj o deskriptorima u navedenom rasponu.
Za svaki otkriveni deskriptor podići će se događaj
_IRQ_GATTC_DESCRIPTOR_RESULT, a po dovršetku_IRQ_GATTC_DESCRIPTOR_DONE.
- gattc_read(conn_handle: int, value_handle: int, /) None¶
Izdaje udaljeno čitanje povezanom poslužitelju za navedeni handle karakteristike ili deskriptora.
Kada vrijednost postane dostupna, podići će se događaj
_IRQ_GATTC_READ_RESULT, a po dovršetku_IRQ_GATTC_READ_DONE.
- gattc_write(conn_handle: int, value_handle: int, data: bytes, mode: int = 0, /) None¶
Izdaje udaljeni upis povezanom poslužitelju za navedeni handle karakteristike ili deskriptora.
Argument mode određuje ponašanje upisa, pri čemu su trenutno podržane vrijednosti:
mode=0(zadano) je upis bez odgovora (write-without-response): upis će biti poslan udaljenom poslužitelju, ali neće se vratiti potvrda i neće se podići nijedan događaj.mode=1je upis s odgovorom (write-with-response): od udaljenog poslužitelja zahtijeva se da pošalje odgovor/potvrdu da je primio podatke.
Ako se od udaljenog poslužitelja primi odgovor, podići će se događaj
_IRQ_GATTC_WRITE_DONE.
- gattc_exchange_mtu(conn_handle: int, /) None¶
Pokreće MTU razmjenu s povezanim poslužiteljem, koristeći preferirani MTU postavljen pomoću
BLE.config(mtu=value).Događaj
_IRQ_MTU_EXCHANGEDpodići će se kada MTU razmjena završi.MTU razmjenu tipično pokreće central; NimBLE podržava obje uloge.
L2CAP kanali orijentirani na vezu (connection-oriented)
Ova značajka omogućuje razmjenu podataka sličnu socketima između dva BLE uređaja. Nakon što su uređaji povezani putem GAP-a, bilo koji uređaj može osluškivati da se drugi poveže na numeričkom PSM-u (Protocol/Service Multiplexer).
Istodobno može biti aktivan samo jedan L2CAP kanal (tj. ne možete se povezivati dok osluškujete).
Aktivni L2CAP kanali identificiraju se prema handleu veze na kojem su uspostavljeni i prema CID-u (channel ID).
Kanali orijentirani na vezu imaju ugrađenu kontrolu protoka temeljenu na kreditima (credit-based flow control). Za razliku od ATT-a, gdje uređaji dogovaraju zajednički MTU, i uređaj koji osluškuje i onaj koji se povezuje svaki postavljaju neovisan MTU koji ograničava maksimalnu količinu neobrađenih podataka koje udaljeni uređaj može poslati prije nego što se u potpunosti potroše u
l2cap_recvinto.- l2cap_listen(psm: int, mtu: int, /) None¶
Započinje osluškivanje dolaznih zahtjeva za L2CAP kanal na navedenom psm s lokalnim MTU-om postavljenim na mtu.
Kada udaljeni uređaj pokrene vezu, podići će se događaj
_IRQ_L2CAP_ACCEPT, koji poslužitelju koji osluškuje daje priliku da odbije dolaznu vezu (vraćanjem nenultog cijelog broja).Nakon što se veza prihvati, podići će se događaj
_IRQ_L2CAP_CONNECT, omogućujući poslužitelju da dobije channel ID (CID) te lokalni i udaljeni MTU.Napomena: Trenutno nije moguće zaustaviti osluškivanje.
- l2cap_connect(conn_handle: int, psm: int, mtu: int, /) None¶
Povezuje se s peerom koji osluškuje na navedenom psm s lokalnim MTU-om postavljenim na mtu.
Po uspješnom povezivanju podići će se događaj
_IRQ_L2CAP_CONNECT, omogućujući klijentu da dobije CID te lokalni i udaljeni (peer) MTU.Neuspješno povezivanje podići će događaj
_IRQ_L2CAP_DISCONNECTs nenultim statusom.
- l2cap_disconnect(conn_handle: int, cid: int, /) None¶
Odspaja aktivni L2CAP kanal s navedenim conn_handle i cid.
- l2cap_send(conn_handle: int, cid: int, buf: bytes, /) bool¶
Šalje navedeni buf (koji mora podržavati buffer protokol) na L2CAP kanalu identificiranom pomoću conn_handle i cid.
Međuspremnik mora zadovoljiti oba ograničenja: ne smije premašiti udaljeni (peer) MTU i ne smije premašiti dvostruki lokalni MTU.
Ovo će vratiti
Falseako je kanal sada „zaustavljen” (stalled), što znači da sel2cap_sendne smije ponovno pozvati dok se ne primi događaj_IRQ_L2CAP_SEND_READY(što će se dogoditi kada udaljeni uređaj dodijeli više kredita, tipično nakon što je primio i obradio podatke).
- l2cap_recvinto(conn_handle: int, cid: int, buf: Any | None, /) int¶
Prima podatke s navedenih conn_handle i cid u priloženi buf (koji mora podržavati buffer protokol, npr. bytearray ili memoryview).
Vraća broj bajtova pročitanih s kanala.
Ako je buf jednak
None, tada vraća broj dostupnih bajtova.Napomena: Nakon primanja događaja
_IRQ_L2CAP_RECV, aplikacija treba nastaviti pozivatil2cap_recvintodok u prijemnom međuspremniku više nema dostupnih bajtova (tipično do veličine udaljenog (peer) MTU-a).Dok prijemni međuspremnik nije prazan, udaljenom uređaju neće biti dodijeljeno više kreditâ kanala i neće moći slati više podataka.
Uparivanje i povezivanje (pairing i bonding)
Uparivanje omogućuje da veza bude šifrirana i autentificirana razmjenom tajni (uz opcionalnu MITM zaštitu putem autentifikacije pristupnim ključem).
Povezivanje (bonding) je proces pohranjivanja tih tajni u nepostojanu pohranu. Kada je povezan, uređaj može razriješiti razrješivu privatnu adresu (RPA) drugog uređaja na temelju pohranjenog identitetskog razrješujućeg ključa (IRK). Za podršku povezivanju aplikacija mora implementirati događaje
_IRQ_GET_SECRETi_IRQ_SET_SECRET.- gap_pair(conn_handle: int, /) None¶
Pokreće uparivanje s udaljenim uređajem.
Prije nego što ovo pozovete, provjerite jesu li postavljene konfiguracijske opcije
io,mitm,le_secureibond(putemconfig).Po uspješnom uparivanju podići će se događaj
_IRQ_ENCRYPTION_UPDATE.
- gap_passkey(conn_handle: int, action: int, passkey: int, /) None¶
Odgovara na događaj
_IRQ_PASSKEY_ACTIONza navedeni conn_handle i action. Značenje passkey ovisi o action (što pak ovisi o konfiguriranoj U/I (I/O) mogućnosti):Radnja
Potreban odgovor passkey
_PASSKEY_ACTION_INPUTPristupni ključ (passkey) koji korisnik očita s udaljenog uređaja.
_PASSKEY_ACTION_DISPLAYLokalno generiran nasumični 6-znamenkasti pristupni ključ (passkey) prikazan korisniku.
_PASSKEY_ACTION_NUMERIC_COMPARISON1za prihvaćanje pristupnog ključa prikazanog u događaju_IRQ_PASSKEY_ACTIONili0za otkazivanje uparivanja.
class UUID¶
- class bluetooth.UUID(value: int | bytes | str, /)¶
Stvara instancu UUID-a s navedenom
value. Bluetooth koristi tri širine UUID-a;UUIDprihvaća bilo koju od njih:Širina UUID-a
Prihvaćeni tipovi
valuePrimjer
16-bitni
intili 2-bajtni međuspremnik (little-endian)UUID(0x2908)iliUUID(b'\x08\x29')32-bitni
4-bajtni međuspremnik (little-endian)
UUID(b'\x08\x29\x00\x00')128-bitni
16-bajtni međuspremnik ili niz s crticama
UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')16- i 32-bitni UUID-ovi tipično su identifikatori koje dodjeljuje SIG (pogledajte Bluetooth dodijeljeni brojevi); 128-bitni UUID-ovi obično su definirani od strane proizvođača.