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.

Négy feliratozott réteg függőleges verme: legalul az átvitel (USB vagy UART), felette a keretezés (csomagfejléc CRC-vel), afölött a megbízhatóság (sorszámok, ACK / NAK, újraküldések), és legfelül a csatornák (elnevezett logikai adatfolyamok).

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á.