12.2. Četiri sloja¶
Protokolna biblioteka izgrađena je kao stog od četiri sloja, od kojih svaki rješava jedan problem i nadograđuje se na sloj ispod sebe. Ostatak poglavlja prolazi kroz stog odozdo prema gore.
12.2.1. Transport¶
Na dnu je cijev bajtova između kamere i domaćina. Protokolnoj biblioteci nije važno koja od njih prenosi bajtove:
USB-CDC preko USB priključka u koji je kamera priključena. Zadana i opcija s najvećom propusnošću za svaku kameru.
UART preko para GPIO pinova na kameri spojenih na serijski prilagodnik na domaćinu. Korisno za primjene bez zaslona gdje je USB priključak zauzet ili nije fizički dostupan.
Jedini posao transporta je „bajtovi ulaze, bajtovi izlaze, po redu”. Sve iznad ovog sloja pretpostavlja da transport isporučuje bajtove redoslijedom kojim su zapisani, ali dopušta da sami bajtovi budu oštećeni ili da veza posve otpadne. I gubitnički naleti (nekoliko bajtova nedostaje) i čisti prekidi (cijela veza nestane na neko vrijeme, a zatim se vrati) obrađuju se na višim slojevima.
12.2.2. Uokvirivanje¶
Sljedeći sloj nameće strukturu toku bajtova. Svaka poruka postaje paket – zaglavlje od 10 bajtova nakon kojeg slijedi korisni teret nakon kojeg slijedi prikolica od 4 bajta. Zaglavlje nosi:
Sinkronizacijsku riječ od 2 bajta (
0xD5AA) koja omogućuje primatelju da ponovno pronađe početak paketa nakon gubitka sinkronizacije.Sekvencijalni broj od 1 bajta koji koristi sloj pouzdanosti.
ID kanala od 1 bajta koji govori kojem logičkom toku paket pripada.
Polje zastavica od 1 bajta za bitove ACK / NAK / fragment / događaj.
Operacijski kod od 1 bajta koji razlikuje protokolne naredbe, sistemske naredbe i naredbe kanala.
Duljinu korisnog tereta od 2 bajta.
CRC od 2 bajta nad prethodnih osam bajtova zaglavlja.
Slijedi korisni teret, zatim CRC od 4 bajta nad samim korisnim teretom. Dva CRC-a otkrivaju oštećenja neovisno: prevrnuti bit u zaglavlju poništava CRC zaglavlja, a primatelj može odbaciti paket bez potrebe da ikada pročita korisni teret.
12.2.3. Pouzdanost¶
Sloj pouzdanosti pretvara „pakete koji možda stignu” u „pakete koji su stigli„. Prati sekvencijalne brojeve u zaglavlju, traži od druge strane da pošalje potvrde za svaki paket koji to zahtijeva i ponovno prenosi kada potvrda ne stigne unutar isteka vremena. Prema zadanim postavkama istek vremena za ponovni prijenos počinje na 500 ms i udvostručuje se pri svakom ponovnom pokušaju, s tri ponovna pokušaja prije odustajanja.
Svako od tih ponašanja može se konfigurirati u pozivu protocol.init(): ACK se može isključiti za jednosmjerne tokove, validacija CRC-a može se preskočiti na savršeno čistim transportima, a parametri ponovnog prijenosa mogu se podesiti za spore veze ili veze s velikim kašnjenjem.
12.2.4. Kanali¶
Najviši sloj jest ono što aplikacijski kod vidi. Kanal je imenovani logički tok identificiran ID-om kanala od 0 do 31. Do 32 kanala mogu koegzistirati na jednom transportu; svaki je neovisan o ostalima, adresiran svojim ID-om u zaglavlju svakog paketa. Kamera se pokreće s četiri ugrađena kanala – stdin, stdout, stream i profile – a aplikacijski kod registrira dodatne pozivanjem protocol.register() s Python klasom.
Četiri sloja ne miješaju nadležnosti. Uokvirivanje ne zna za kanale; pouzdanost ne zna za sadržaj paketa; sloj kanala ne zna kako bajtovi stižu. To razdvajanje razlog je zašto zamjena transporta (USB u UART, na primjer) ne propagira prema gore u kod kanala, i ono je ono što čini ostatak poglavlja prohodnim sloj po sloj.