12.2. Neljä kerrosta¶
Protokollakirjasto on rakennettu neljän kerroksen pinona, joista kukin ratkaisee yhden ongelman ja rakentuu allaan olevan kerroksen päälle. Luvun loppuosa käy pinon läpi alhaalta ylös.
12.2.1. Siirtotie¶
Alimpana on tavuputki kameran ja isännän välillä. Protokollakirjasto ei välitä siitä, kumpi kuljettaa tavut:
USB-CDC sen USB-portin yli, johon kamera on kytketty. Oletus- ja suurikaistaisin vaihtoehto jokaiselle kameralle.
UART kameran GPIO-nastaparin yli, joka on kytketty isännän sarjasovittimeen. Hyödyllinen näytöttömissä käyttöönotoissa, joissa USB-portti on varattu tai ei ole fyysisesti saavutettavissa.
Siirtotien ainoa tehtävä on ”tavut menevät sisään, tavut tulevat ulos, järjestyksessä”. Kaikki tämän kerroksen yläpuolella olettaa, että siirtotie toimittaa tavut siinä järjestyksessä, jossa ne kirjoitettiin, mutta sallii sen, että tavut itse korruptoituvat tai linkki katkeaa kokonaan. Häviölliset purskeet (muutama tavu puuttuu) ja siistit katkokset (koko linkki poissa hetken, sitten takaisin) käsitellään molemmat ylempänä.
12.2.2. Kehystys¶
Seuraava kerros ylöspäin asettaa rakenteen tavuvirtaan. Jokaisesta viestistä tulee paketti – 10-tavuinen otsake, jota seuraa hyötykuorma ja sitä 4-tavuinen lopuke. Otsake sisältää:
2-tavuisen synkronointisanan (
0xD5AA), jonka avulla vastaanottaja löytää uudelleen paketin alun desynkronoinnin jälkeen.1-tavuisen järjestysnumeron, jota luotettavuuskerros käyttää.
1-tavuisen kanavatunnuksen, joka kertoo, mihin loogiseen virtaan paketti kuuluu.
1-tavuisen lippukentän ACK / NAK / fragmentti / tapahtuma -biteille.
1-tavuisen operaatiokoodin, joka erottaa protokollakomennot, järjestelmäkomennot ja kanavakomennot.
2-tavuisen hyötykuorman pituuden.
2-tavuisen CRC:n edellisistä kahdeksasta otsaketavusta.
Hyötykuorma seuraa, sitten 4-tavuinen CRC itse hyötykuormasta. Kaksi CRC:tä havaitsevat korruption itsenäisesti: otsakkeessa kääntynyt bitti mitätöi otsakkeen CRC:n, ja vastaanottaja voi hylätä paketin tarvitsematta koskaan lukea hyötykuormaa.
12.2.3. Luotettavuus¶
Luotettavuuskerros muuntaa ”paketit, jotka saattavat saapua” ”paketeiksi, jotka ovat saapuneet”. Se seuraa otsakkeen järjestysnumeroita, pyytää toista osapuolta lähettämään kuittauksen jokaisesta sitä vaativasta paketista ja lähettää uudelleen, kun kuittaus ei saavu aikakatkaisun sisällä. Oletuksena uudelleenlähetyksen aikakatkaisu alkaa 500 ms:sta ja kaksinkertaistuu jokaisella yrityksellä, kolmella uudelleenyrityksellä ennen luovuttamista.
Jokainen näistä käyttäytymisistä on määritettävissä protocol.init() -kutsussa: ACK voidaan kytkeä pois yksisuuntaisille virroille, CRC-tarkistus voidaan ohittaa täysin puhtailla siirtoteillä, ja uudelleenlähetysparametrit voidaan virittää hitaille tai suuriviiveisille linkeille.
12.2.4. Kanavat¶
Ylin kerros on se, mitä sovelluskoodi näkee. Kanava on nimetty looginen virta, joka tunnistetaan kanavatunnuksella välillä 0–31. Yhdessä siirtotiessä voi olla rinnakkain jopa 32 kanavaa; kukin on muista riippumaton ja osoitettu tunnuksellaan jokaisen paketin otsakkeessa. Kamera käynnistyy neljällä sisäänrakennetulla kanavalla – stdin, stdout, stream ja profile – ja sovelluskoodi rekisteröi niiden päälle lisää kutsumalla protocol.register() -funktiota Python-luokalla.
Neljä kerrosta eivät sekoita vastuita. Kehystys ei tiedä kanavista; luotettavuus ei tiedä pakettien sisällöstä; kanavakerros ei tiedä, miten tavut saapuvat. Tuon erottelun ansiosta siirtotien vaihto (esimerkiksi USB:stä UARTiin) ei kulkeudu ylöspäin kanavakoodiin, ja juuri se tekee luvun loppuosasta läpikäytävän kerros kerrokselta.