12.4. Handshake a vyjednání schopností¶
Kamera i hostitel přicházejí k přenosu s vlastními představami o tom, jak má protokol běžet: které režimy CRC, zda jsou vyžadována potvrzení (ACK) a jaký je největší užitečný obsah (payload), který dokážou uložit do bufferu. Než začne skutečný provoz, vymění si handshake, který tyto parametry zafixuje pro zbytek relace.
12.4.1. Hostitel otevírá spojení¶
Strana kamery spouští zásobník protokolu při startu (nebo jej aplikace restartuje pomocí protocol.init() ke změně parametrů) a poté tiše čeká na hostitele. Z pohledu kamery není co dělat, dokud nedorazí paket.
Strana hostitele otevře přenos – USB port nebo UART – a okamžitě odešle paket PROTO_SYNC (opcode 0x00). Tento paket má magický užitečný obsah (payload), který umožňuje kameře jej rozpoznat, i když se obě strany rozsynchronizovaly, a je to jediný paket, na který kamera kdy odpovídá před vyjednáním schopností.
Pokud kamera neodpoví v rámci časového limitu pro opětovné odeslání, hostitel odešle PROTO_SYNC znovu, až rtx_retries krát. Poté to vzdá a ohlásí selhání spojení. Právě opakování je to, co umožňuje, aby „odpoj, znovu připoj, restartuj hostitelský skript“ fungovalo, aniž by kamera musela vědět, že hostitel odešel.
12.4.2. Výměna schopností¶
Jakmile kamera potvrdí synchronizaci, hostitel odešle PROTO_GET_CAPS (opcode 0x01), aby zjistil, co kamera podporuje. Užitečný obsah (payload) odpovědi hlásí:
validaci CRC povolenou nebo zakázanou
sledování pořadových čísel povolené nebo zakázané
potvrzení (ACK) povolená nebo zakázaná
oznámení událostí povolená nebo zakázaná
maximální velikost užitečného obsahu (payload) kamery v bajtech
aktuální počet pokusů o opětovné odeslání, časový limit a parametry dotazování (polling)
Hostitel je porovná s vlastní konfigurací. Pokud hostitel potřebuje kterýkoli z nich změnit – například vyjednat menší maximální užitečný obsah (payload), protože jeho přijímací buffer je menší než ten kamery – odešle PROTO_SET_CAPS (opcode 0x02) s novými hodnotami. Kamera překonfiguruje svůj zásobník a potvrdí. Od této chvíle každý paket, který projde přes vedení, dodržuje tuto sdílenou dohodu.
Pokud hostitel nic nepřepíše, jsou všechny výchozí hodnoty zapnuté: validace CRC, sledování pořadových čísel, potvrzení (ACK) a oznámení událostí. Výchozí maximální užitečný obsah (payload) je buffer kamery specifický pro danou desku mínus 14 bajtů režie rámcování (10bajtová hlavička plus 4bajtové koncové CRC užitečného obsahu). Pro většinu práce mezi kamerou a notebookem jsou výchozí hodnoty správným výchozím bodem; stránka o spolehlivosti popisuje, kdy a proč aplikace některé jejich části vypne.
12.4.3. Zjišťování kanálů¶
Po schopnostech odešle hostitel CHANNEL_LIST (opcode 0x20). Kamera odpoví seznamem zaregistrovaných kanálů – čtyř vestavěných (stdin, stdout, stream, profile) plus jakýchkoli, které aplikace zaregistrovala pomocí protocol.register(). Každá položka nese ID kanálu, jeho název a jeho příznaky schopností (jen pro čtení, jen pro zápis, uzamykatelný).
Hostitel si seznam uloží a použije jej později, když aplikační kód požádá o channel_read("frame") nebo channel_write("config", ...) – název se jednou vyhledá na ID kanálu a poté každý následující paket na tomto kanálu používá přímo ID.
Pokud kamera zaregistruje nový kanál po počátečním seznamu – což je běžné, když se aplikace začne spouštět až po handshaku – kamera vyšle paket události CHANNEL_REGISTERED. Hostitel jim naslouchá a obnoví svůj interní seznam kanálů, takže hostitelský skript, který se připojil brzy, vidí nově zaregistrované kanály bez restartu.
Handshake zabere při navazování spojení pár výměn tam a zpět a poté se už nikdy neopakuje. Provoz v ustáleném stavu jsou jen pakety: zarámované bajty dovnitř, zarámované bajty ven, ID kanálů už známá na obou stranách.