11.5. Yhteydet

Kun keskuslaite valitsee oheislaitteen mainosvirrasta ja lähettää sille connect request -pyynnön, molemmat osapuolet poistuvat mainostus- ja skannaustilasta ja siirtyvät yhteyteen. Radio ajoittaa nyt toimintansa linkkikerroksen datakanaville hyppien niiden välillä pseudosatunnaisesti yhteyden muodostuksen yhteydessä sovitun sekvenssin mukaisesti. Kaikki linkkikerroksen yläpuolella – GATT, tietoturva, L2CAP – toimii tässä muodostetun yhteyden päällä.

11.5.1. Yhteystapahtuma

Kaksi BLE-yhteydessä olevaa laitetta eivät lähetä jatkuvasti. Ne sopivat yhteysvälistä, ja jokaisella välillä molemmat osapuolet herättävät radion, vaihtavat jonossa olevat paketit, kuittaavat vastaanottamansa ja palaavat takaisin lepotilaan. Jokaista tällaista vaihtoa kutsutaan yhteystapahtumaksi.

Aikajana, jossa keskuslaite on ylemmällä raidalla ja oheislaite alemmalla raidalla. Jokaisella yhteysvälin rajalla molemmilla raidoilla näkyy lyhyt pulssi, joka on merkitty "TX/RX". Pulssien väli on merkitty "yhteysväli"; kunkin pulssin kesto on "yhteystapahtuma". Oheislaitteella on muutamia ohitettuja tapahtumia, jotka on merkitty "oheislaitteen viive: oheislaite voi ohittaa, jos se on jouten".

Kummankin osapuolen radio on hereillä vain lyhyiden yhteystapahtumien aikana, ja kaikki muu on lepotilassa. Oheislaite voi ohittaa tapahtumia oheislaitteen viiveen mukaisesti.

Tätä ohjaavat luvut neuvotellaan yhteyden muodostuksen yhteydessä, ja linkkikerros valvoo niitä. Ne ovat sovelluksen näkyvissä sekä pyyntöpuolen säätiminä että takaisin raportoituina lopullisina arvoina.

  • Yhteysväli. 7,5 ms - 4 s, 1,25 ms:n askelin. Keskuslaite valitsee oheislaitteen pyytämän arvon, ellei pyyntö ole kohtuuton. Lyhyemmät välit toimittavat dataa pienemmällä viiveellä lisääntyneen radiotoiminnan kustannuksella; pidemmät säästävät virtaa mutta hidastavat jokaista edestakaista kierrosta.

  • Oheislaitteen viive. Ei-negatiivinen kokonaisluku N. Oheislaite saa ohittaa enintään N yhteystapahtumaa, kun sillä ei ole mitään lähetettävää, ja palata lepotilaan sen sijaan että herättäisi radion tyhjää vaihtoa varten. Hyödyllinen sensoreille, jotka heräävät raportoimaan kerran sekunnissa mutta haluavat pienen reagoivan yhteysvälin harvinaista välitöntä viestiä varten.

  • Valvonta-aikakatkaisu. 100 ms - 32 s. Jos kumpikaan osapuoli ei kuule toisesta tämän aikaa, linkki julistetaan menetetyksi ja molemmat osapuolet palaavat mainostukseen / skannaukseen. Aikakatkaisun on oltava pidempi kuin connection_interval * (1 + peripheral_latency) – linkkikerros hylkää arvot, jotka rikkovat tätä.

aioble.Device.connect() ottaa parametrit min_conn_interval_us ja max_conn_interval_us, joten keskuslaite voi pyytää tietyn vaihteluvälin; radion lopullisesti valitseman arvon voi lukea linkkikerroksen kokoonpanosta yhteyden muodostumisen jälkeen.

11.5.2. Mitä ”keskuslaite” ja ”oheislaite” tarkoittavat yhteyden sisällä

Mainostusvaiheessa asetetut roolit pysyvät yhteyden muodostumisen jälkeen:

  • Keskuslaite ohjaa ajoitusta – se omistaa hyppysekvenssin ja yhteystapahtumien isäntäpuolen.

  • Oheislaite on reaktiivinen. Se voi pyytää muutosta yhteysparametreihin (esimerkiksi hitaampaa väliä virran säästämiseksi), mutta keskuslaite päättää, hyväksytäänkö se.

Roolit ovat riippumattomia siitä, kumpi isännöi GATT-tietokantaa, mikä on erillinen ulottuvuus. Käytännön mukaan oheislaite on myös GATT-palvelin ja keskuslaite GATT-asiakas, mutta BLE sallii kummankin osapuolen isännöidä GATT-palveluja. Kamerat noudattavat lähes aina tätä käytäntöä: oheislaite + palvelin ”kamera julkaisee dataa” -sovelluksissa ja keskuslaite + asiakas ”kamera lukee sensorista” -sovelluksissa.

11.5.3. Suurin siirtoyksikkö (MTU)

Linkkikerros kuljettaa oletuksena lyhyitä paketteja – 27 tavua hyötykuormaa, joista vain 23 on GATT:n käytettävissä. Se riittää pienelle lukemalle tai lyhyelle komennolle, mutta on pieni minkä tahansa monitavuisen rinnalla. Molemmat osapuolet voivat neuvotella tämän suuremmaksi radion laiteohjelmiston tukemaan rajaan asti (tyypillisesti muutama sata tavua moderneissa ohjaimissa).

aioble-rajapinta ohjaa neuvottelua metodilla aioble.DeviceConnection.exchange_mtu(), ja tulos tulee saataville mtu -attribuuttiin. Suuremmat MTU:t tarkoittavat vähemmän edestakaisia kierroksia kaikille noin 20 tavua suuremmille arvoille, pienen puskurimuistin kustannuksella.

11.5.4. Elinkaari

Yhteys kestää, kunnes jokin seuraavista tapahtuu:

  • kumpi tahansa osapuoli kutsuu metodia disconnect(),

  • valvonta-aikakatkaisu laukeaa (kantaman ulkopuolella, radio pois päältä, vastapuoli kaatui), tai

  • tapahtuu eksplisiittinen linkkikerroksen virhe (salauksen epäsuhta, parinmuodostuksen hylkäys).

Kun yhteys katkeaa, jokainen siinä jonossa oleva tai käynnissä oleva GATT-operaatio nostaa poikkeuksen aioble.DeviceDisconnectedError, ja kaikki sovelluksessa olevat async with connection -lohkot poistuvat siististi. Oheislaite vastaa tyypillisesti palaamalla funktioon aioble.advertise() ja odottamalla seuraavaa keskuslaitetta; keskuslaite vastaa joko skannaamalla uudelleen tai tuomalla yhteyden katkeamisen sovelluksen tietoon.

Elinkaari on yksi syistä, miksi aioble on hyödyllinen. Synkronisen BLE-rajapinnan olisi paljastettava yhteyden katkeamisen takaisinkutsut ja tapahtumamaskit; asyncio-versio muuttaa yhteyden katkeamiset poikkeuksiksi siinä korutiinissa, joka odotti operaatiota, mihin async with -siivous on suunniteltu.