12.2. A négy réteg¶
A protokollkönyvtár négy réteg vermeként épül fel, amelyek mindegyike egyetlen problémát old meg, és az alatta lévő rétegre épít. A fejezet hátralévő része alulról felfelé járja végig a vermet.
12.2.1. Átvitel¶
Legalul a bájtcsővezeték van a kamera és a gazdagép között. A protokollkönyvtárt nem érdekli, hogy melyik viszi a bájtokat:
USB-CDC azon az USB-porton, amelyhez a kamera csatlakoztatva van. Az alapértelmezett és legnagyobb sávszélességű opció minden kamera számára.
UART egy pár GPIO-lábon a kamerán, amely a gazdagépen lévő soros adapterhez csatlakozik. Hasznos a fej nélküli telepítéseknél, ahol az USB-port foglalt vagy fizikailag nem hozzáférhető.
Az átvitel egyetlen feladata az, hogy „bájtok mennek be, bájtok jönnek ki, sorrendben”. A réteg fölött minden feltételezi, hogy az átvitel a bájtokat abban a sorrendben kézbesíti, ahogy azokat kiírták, de megengedi, hogy maguk a bájtok megsérüljenek, vagy hogy a kapcsolat teljesen megszakadjon. A veszteséges kitöréseket (néhány hiányzó bájt) és a tiszta megszakadásokat (a teljes kapcsolat egy ideig eltűnik, majd visszatér) egyaránt feljebb kezelik.
12.2.2. Keretezés¶
A következő réteg struktúrát kényszerít a bájtfolyamra. Minden üzenet csomaggá válik – egy 10 bájtos fejléc, amelyet egy hasznos terhelés követ, majd egy 4 bájtos lezáró. A fejléc a következőket hordozza:
Egy 2 bájtos szinkronszó (
0xD5AA), amely lehetővé teszi a vevő számára, hogy egy elcsúszás után újra megtalálja egy csomag kezdetét.Egy 1 bájtos sorszám, amelyet a megbízhatósági réteg használ.
Egy 1 bájtos csatornaazonosító, amely megmondja, melyik logikai adatfolyamhoz tartozik a csomag.
Egy 1 bájtos jelzőmező az ACK / NAK / töredék / esemény bitekhez.
Egy 1 bájtos opkód, amely megkülönbözteti a protokollparancsokat, a rendszerparancsokat és a csatornaparancsokat.
Egy 2 bájtos hasznos terhelés hossza.
Egy 2 bájtos CRC az előző nyolc fejlécbájton.
A hasznos terhelés következik, majd egy 4 bájtos CRC magán a hasznos terhelésen. A két CRC egymástól függetlenül kapja el a sérülést: a fejlécben átbillent bit érvényteleníti a fejléc CRC-jét, és a vevő eldobhatja a csomagot anélkül, hogy valaha is el kellene olvasnia a hasznos terhelést.
12.2.3. Megbízhatóság¶
A megbízhatósági réteg a „csomagok, amelyek talán megérkeznek” helyzetet „csomagok, amelyek megérkeztek„ helyzetté alakítja. Nyomon követi a fejlécben lévő sorszámokat, megkéri a másik oldalt, hogy küldjön visszaigazolást minden olyan csomagra, amely megköveteli, és újraküld, amikor egy visszaigazolás nem érkezik meg egy időtúllépésen belül. Alapértelmezés szerint az újraküldési időtúllépés 500 ms-nál kezdődik, és minden újrapróbálkozásnál megduplázódik, három újrapróbálkozással a feladás előtt.
Ezen viselkedések mindegyike konfigurálható a protocol.init() hívásban: az ACK kikapcsolható az egyirányú adatfolyamoknál, a CRC-ellenőrzés kihagyható a tökéletesen tiszta átviteleknél, és az újraküldési paraméterek finomhangolhatók a lassú vagy nagy késleltetésű kapcsolatokhoz.
12.2.4. Csatornák¶
A legfelső réteg az, amit az alkalmazáskód lát. Egy csatorna egy elnevezett logikai adatfolyam, amelyet egy 0 és 31 közötti csatornaazonosító azonosít. Legfeljebb 32 csatorna létezhet egyszerre egy átvitelen; mindegyik független a többitől, minden csomag fejlécében az azonosítója alapján címezve. A kamera négy beépített csatornával indul – stdin, stdout, stream és profile –, és az alkalmazáskód továbbiakat regisztrál ezek tetejére a protocol.register() Python osztállyal való meghívásával.
A négy réteg nem keveri a felelősségi köröket. A keretezés nem tud a csatornákról; a megbízhatóság nem tud a csomagok tartalmáról; a csatornaréteg nem tudja, hogyan érkeznek a bájtok. Ez az elkülönítés az oka annak, hogy egy átviteli csere (például USB-ről UART-ra) nem gyűrűzik fel a csatornakódba, és ez teszi a fejezet hátralévő részét rétegenként bejárhatóvá.