11.5. Veze¶
Kada središnji uređaj (central) odabere periferiju iz toka oglašavanja i pošalje joj zahtjev za povezivanje, obje strane izlaze iz načina oglašavanja / skeniranja i prelaze u vezu. Radio sada raspoređuje svoju aktivnost na podatkovnim kanalima sloja veze (link layer), preskačući pseudo-nasumično između njih prema slijedu dogovorenom pri uspostavi veze. Sve iznad sloja veze – GATT, sigurnost, L2CAP – radi na vrhu veze koja se ovdje uspostavlja.
11.5.1. Događaj veze¶
Dva uređaja u BLE vezi ne emitiraju neprekidno. Dogovore interval veze, i pri svakom intervalu obje strane bude radio, izmijene sve pakete koji su u redu čekanja, potvrde ono što su primile i vrate se na spavanje. Svaka od tih izmjena naziva se događaj veze.
Radio na svakoj strani budan je samo tijekom kratkih događaja veze, dok je sve ostalo na spavanju. Periferija može preskočiti događaje pod latencijom periferije.¶
Brojevi koji ovime upravljaju pregovaraju se pri uspostavi veze, a sloj veze ih provodi. Vidljivi su aplikaciji kako kao parametri na strani zahtjeva, tako i kao rezultirajuće vrijednosti koje se vraćaju.
Interval veze. Od 7,5 ms do 4 s, u koracima od 1,25 ms. Središnji uređaj odabire vrijednost koju periferija traži, osim ako je zahtjev nerazuman. Kraći intervali isporučuju podatke s nižim kašnjenjem uz cijenu veće aktivnosti radija; dulji štede energiju, ali svaki obilazak čine sporijim.
Latencija periferije. Nenegativni cijeli broj N. Periferija smije preskočiti do N događaja veze kada nema ništa za poslati, vraćajući se na spavanje umjesto da budi radio za praznu izmjenu. Korisno za senzore koji se bude kako bi izvijestili jednom u sekundi, ali žele nizak responzivan interval veze za rijetku trenutnu poruku.
Nadzorno vremensko ograničenje (supervision timeout). Od 100 ms do 32 s. Ako bilo koja strana ovoliko dugo ne čuje ništa od druge, veza se proglašava izgubljenom i obje strane vraćaju se na oglašavanje / skeniranje. Vremensko ograničenje mora biti dulje od
connection_interval * (1 + peripheral_latency)– sloj veze odbija vrijednosti koje to krše.
aioble.Device.connect() prima min_conn_interval_us i max_conn_interval_us kako bi središnji uređaj mogao zatražiti određeni raspon; stvarna vrijednost na koju se radio ustalio može se očitati kroz konfiguraciju sloja veze nakon što je veza uspostavljena.
11.5.2. Što „central” i „peripheral” znače unutar veze¶
Uloge postavljene u vrijeme oglašavanja ostaju nakon što se veza uspostavi:
Središnji uređaj (central) upravlja vremenskim rasporedom – posjeduje glavnu (master) stranu slijeda preskakanja i događaja veze.
Periferija je reaktivna. Može zatražiti promjenu parametara veze (recimo, sporiji interval radi uštede energije), ali središnji uređaj odlučuje hoće li to prihvatiti.
Uloge su neovisne o tome tko ugošćuje GATT bazu podataka, što je zasebna os. Po konvenciji je periferija ujedno i GATT poslužitelj (server), a središnji uređaj GATT klijent (client), ali BLE dopušta da bilo koja strana ugošćuje GATT usluge. Kamere gotovo uvijek slijede konvenciju: periferija + poslužitelj za aplikacije tipa „kamera objavljuje podatke”, središnji uređaj + klijent za aplikacije tipa „kamera čita iz senzora”.
11.5.3. Maksimalna jedinica prijenosa (MTU)¶
Sloj veze prenosi pakete koji su prema zadanim postavkama kratki – 27 bajtova korisnog tereta, od kojih je samo 23 dostupno GATT-u. To je dovoljno za malo očitanje ili kratku naredbu, ali sitno u usporedbi s bilo čime višebajtnim. Obje strane mogu pregovarati o povećanju toga, sve do granice koju podržava ugrađeni program (firmware) radija (obično nekoliko stotina bajtova na suvremenim kontrolerima).
aioble API vodi pregovaranje kroz aioble.DeviceConnection.exchange_mtu(), a rezultat postaje dostupan u atributu mtu. Veći MTU znači manje obilazaka za bilo koju vrijednost veću od ~20 bajtova, uz malu cijenu u memoriji međuspremnika.
11.5.4. Životni vijek¶
Veza traje sve dok se ne dogodi jedno od sljedećeg:
bilo koja strana pozove
disconnect(),okine nadzorno vremensko ograničenje (izvan dometa, isključen radio, ravnopravni član se srušio), ili
izričiti kvar sloja veze (neusklađenost enkripcije, odbijanje uparivanja).
Kada veza padne, svaka GATT operacija koja je na njoj u redu čekanja ili u tijeku podiže aioble.DeviceDisconnectedError, a svi async with connection blokovi u kojima se aplikacija nalazi uredno izlaze. Periferija obično reagira vraćanjem na aioble.advertise() i čekanjem sljedećeg središnjeg uređaja; središnji uređaj reagira ili ponovnim skeniranjem ili iznošenjem prekida veze u aplikaciju.
Životni vijek jedan je od razloga zašto je aioble koristan. Sinkroni BLE API morao bi izložiti povratne pozive za prekid veze i maske događaja; asyncio inačica pretvara prekide veze u iznimke unutar korutine koja je čekala na operaciju, što je upravo ono za što je async with čišćenje napravljeno.