12.1. Zašto biblioteka za protokol

Par kabela i brzina prijenosa (baud) dovoljni su za prijenos bajtova s kamere na PC domaćina. USB-CDC i UART oboje daju programu na kameri tok podataka u kojem write stavlja bajtove na jedan kraj, a read ih uzima s drugog. Pa što onda biblioteka za protokol dodaje povrh toga?

Tri stvari koje biste morali napisati sami, svaki put, kada biste pokušali izgraditi ozbiljan kanal između kamere i domaćina izravno na sirovim bajtovima:

Uokvirivanje. Tok bajtova nema svojstvenu strukturu. Kamera napiše temp=42, a domaćin pročita temp= plus prekid koji stigne kasnije, zatim 42 plus sljedeća poruka koja počinje s humid=... već se nadovezuje na to. Bajtovi nemaju granice. Svaka netrivijalna veza s domaćinom na kraju izmišlja neki marker – \n između poruka, zaglavlja s prefiksom duljine, escape sekvence za binarne sadržaje – kako bi primatelj znao gdje jedna poruka završava, a sljedeća počinje. Biblioteka za protokol daje vam jedinstveni format paketa sa sinkronizacijskom riječi i poljem duljine, pa primatelj nikada ne mora nagađati.

Pouzdanost. USB-CDC ne ispušta bajtove tiho u normalnom radu, ali UART ispušta (kada domaćin ne opslužuje port dovoljno brzo), a serijski kabel koji se izvuče i ponovno priključi može jednoj strani ostaviti djelomični paket. Ispravan postupak je otkriti oštećenje, zatražiti od druge strane ponovni prijenos i aplikacijskom kodu predati samo poruke koje su stigle netaknute. Biblioteka za protokol to čini za svaki paket pomoću CRC-a i potvrda po paketu – uključeno prema zadanim postavkama; aplikacija ne vidi ponovne pokušaje.

Multipleksiranje. Između kamere i domaćina postoji točno jedan USB-CDC port. Ako kamera prenosi sliku i domaćin joj šalje konfiguraciju i IDE čita stdout za izlaz print, sve tri razmjene moraju dijeliti taj jedinstveni tok bajtova. Biblioteka za protokol svakom neovisnom toku daje broj kanala, dopušta kameri da za svaki registrira Python klasu i sprječava da čitanja domaćina na jednom kanalu ometaju ostale. Iz aplikacijskog koda svaki kanal izgleda kao vlastita privatna veza.

12.1.1. Zašto to ne napisati sami

Možete. Potrebno je nekoliko tjedana rada da se sve troje ispravno postavi na serijskoj liniji i još nekoliko tjedana da uokvirivanje uredno obrađuje oporavak od ponovnog priključivanja, da ponovni prijenosi rade bez trošenja energije na povratne puteve i da multiplekser preživi djelomična čitanja bez da bajtove jednog kanala pomiješa s bajtovima drugoga.

Biblioteka za protokol taj je posao već obavila, provjerena je na svakoj podržanoj kameri i ima odgovarajuće biblioteke na strani domaćina koje govore isti format na žici. Njezino korištenje znači da je kod na strani kamere jedna mala klasa po kanalu, a kod na strani domaćina objekt Camera s metodama channel_read i channel_write. Ušteđeni mentalni prostor odlazi na ono što aplikacija zapravo radi.

Ovo poglavlje podučava protokol od temelja: format na žici, pravila uokvirivanja, mehanizam pouzdanosti, model kanala i naposljetku Python klase na oba kraja. Do kraja čitatelj može izgraditi GUI domaćina koji razgovara s kamerom, skriptu koja prenosi podatke sa senzora s kamere na prijenosno računalo te onakav interaktivni alat za kalibraciju koji dolazi u openmv-projects/tools/.