12.4. Handshake dan negosiasi kapabilitas

Kamera dan host keduanya tiba di transport dengan gagasan masing-masing tentang cara protokol harus berjalan: mode CRC mana yang digunakan, apakah ACK diperlukan, berapa ukuran payload terbesar yang dapat di-buffer. Sebelum lalu lintas nyata dimulai, keduanya bertukar handshake yang menetapkan parameter-parameter tersebut untuk sisa sesi.

12.4.1. Host membuka koneksi

Sisi kamera memulai stack protokol saat boot (atau aplikasi me-restart-nya dengan protocol.init() untuk mengubah parameter), lalu diam menunggu host. Dari sudut pandang kamera, tidak ada yang perlu dilakukan sampai sebuah paket tiba.

Sisi host membuka transport -- port USB atau UART -- dan segera mengirimkan paket PROTO_SYNC (opcode 0x00). Paket ini memiliki payload ajaib yang memungkinkan kamera mengenalinya bahkan jika kedua sisi tidak sinkron, dan ini adalah satu-satunya paket yang direspons kamera sebelum kapabilitas dinegosiasikan.

Jika kamera tidak membalas dalam batas waktu retransmit, host mengirimkan PROTO_SYNC lagi, hingga rtx_retries kali. Setelah itu, host menyerah dan melaporkan kegagalan koneksi. Pengiriman ulang inilah yang membuat "cabut, pasang kembali, restart skrip host" bekerja tanpa kamera perlu mengetahui bahwa host telah pergi.

12.4.2. Pertukaran kapabilitas

Setelah kamera mengakui sinkronisasi, host mengirimkan PROTO_GET_CAPS (opcode 0x01) untuk menanyakan apa yang didukung kamera. Payload balasannya melaporkan:

  • Validasi CRC diaktifkan atau dinonaktifkan

  • Pelacakan sequence-number diaktifkan atau dinonaktifkan

  • ACK diaktifkan atau dinonaktifkan

  • Notifikasi event diaktifkan atau dinonaktifkan

  • Ukuran payload maksimum kamera dalam byte

  • Jumlah retry retransmit saat ini, timeout, dan parameter polling

Host membandingkan nilai-nilai tersebut dengan konfigurasinya sendiri. Jika host perlu mengubah salah satunya -- misalnya, untuk menegosiasikan payload maksimum yang lebih kecil karena buffer penerimaannya lebih kecil dari kamera -- host mengirimkan PROTO_SET_CAPS (opcode 0x02) dengan nilai-nilai baru. Kamera mengonfigurasi ulang stacknya dan mengakui. Mulai sekarang, setiap paket yang melewati wire mengikuti kontrak bersama tersebut.

Jika host tidak mengganti apa pun, semua default aktif: validasi CRC, pelacakan sequence-number, ACK, dan notifikasi event. Payload maksimum default adalah buffer per-board kamera dikurangi 14 byte overhead framing (header 10-byte ditambah trailing payload CRC 4-byte). Untuk sebagian besar pekerjaan kamera-ke-laptop, default adalah titik awal yang tepat; halaman reliabilitas membahas kapan dan mengapa sebuah aplikasi memilih untuk menonaktifkan sebagiannya.

12.4.3. Penemuan channel

Setelah kapabilitas, host mengirimkan CHANNEL_LIST (opcode 0x20). Kamera membalas dengan daftar channel yang terdaftar -- empat channel bawaan (stdin, stdout, stream, profile) ditambah channel mana pun yang didaftarkan aplikasi dengan protocol.register(). Setiap entri membawa ID channel, namanya, dan flag kapabilitasnya (read-only, write-only, lockable).

Host menyimpan daftar tersebut dan menggunakannya nanti ketika kode aplikasi meminta channel_read("frame") atau channel_write("config", ...) -- nama dicari ke ID channel sekali, lalu setiap paket berikutnya di channel tersebut menggunakan ID secara langsung.

Jika kamera mendaftarkan channel baru setelah daftar awal -- umum terjadi ketika aplikasi mulai berjalan setelah handshake -- kamera memancarkan paket event CHANNEL_REGISTERED. Host mendengarkan event tersebut dan memperbarui daftar channel internalnya, sehingga skrip host yang terhubung lebih awal melihat channel yang baru terdaftar muncul tanpa perlu restart.

Handshake hanya membutuhkan beberapa round-trip saat pengaturan koneksi dan tidak pernah diulangi. Lalu lintas steady-state hanyalah paket: byte berframes masuk, byte berframes keluar, ID channel sudah diketahui di kedua sisi.