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.

A timeline with the central on the top track and the peripheral on the bottom track. At each connection interval boundary both tracks show a short pulse labelled "TX/RX". The gap between pulses is labelled "connection interval"; the duration of each pulse is "connection event". The peripheral has a few skipped events labelled "peripheral latency: peripheral may skip if idle".

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.