12.1. Mengapa perlu library protokol¶
Sepasang kabel dan laju baud sudah cukup untuk memindahkan byte dari kamera ke PC host. USB-CDC dan UART keduanya memberikan program kamera sebuah stream di mana write memasukkan byte di satu ujung dan read mengeluarkannya di ujung lain. Jadi apa yang ditambahkan oleh sebuah library protokol di atas itu?
Tiga hal yang harus Anda tulis sendiri, setiap saat, jika mencoba membangun saluran kamera-ke-host langsung di atas byte mentah:
Framing. Stream byte tidak memiliki struktur bawaan. Kamera menulis temp=42 dan host membaca temp= ditambah interupsi yang datang kemudian, lalu 42 ditambah pesan berikutnya yang dimulai dengan humid=... sudah tercampur. Byte tidak memiliki batas. Setiap hubungan host yang tidak trivial akhirnya menciptakan semacam penanda -- \n di antara pesan, header prefiks panjang, urutan escape untuk payload biner -- sehingga penerima tahu di mana satu pesan berakhir dan yang berikutnya dimulai. Library protokol memberi Anda format paket seragam dengan kata sinkronisasi dan field panjang, sehingga penerima tidak perlu menebak.
Reliabilitas. USB-CDC tidak menjatuhkan byte secara diam-diam dalam operasi normal, tetapi UART bisa (ketika host tidak cukup cepat melayani port), dan kabel serial yang dicabut lalu dipasang kembali dapat membuat satu sisi memiliki paket yang tidak lengkap. Yang benar adalah mendeteksi kerusakan, meminta sisi lain untuk mengirim ulang, dan hanya menyerahkan ke kode aplikasi pesan yang tiba dengan utuh. Library protokol melakukan itu untuk setiap paket dengan CRC dan pengakuan per-paket -- diaktifkan secara default; aplikasi tidak melihat pengiriman ulang.
Multiplexing. Hanya ada satu port USB-CDC antara kamera dan host. Jika kamera sedang streaming sebuah citra dan host sedang mengirimkan konfigurasi dan IDE sedang membaca stdout untuk output print, ketiga pertukaran tersebut harus berbagi stream byte tunggal itu. Library protokol memberikan setiap stream independen sebuah nomor channel, memungkinkan kamera mendaftarkan kelas Python untuk masing-masingnya, dan menjaga agar pembacaan host pada setiap channel tidak saling mengganggu. Dari kode aplikasi, setiap channel terlihat seperti tautan pribadinya sendiri.
12.1.1. Mengapa tidak menulisnya sendiri¶
Anda bisa. Dibutuhkan beberapa minggu kerja untuk membuat ketiganya benar pada saluran serial dan beberapa minggu lagi untuk membuat framing menangani pemulihan hot-plug dengan bersih, retransmit bekerja tanpa membuang energi pada round-trip, dan multiplexer bertahan dari pembacaan parsial tanpa merusak byte satu channel ke channel lainnya.
Library protokol sudah melakukan pekerjaan itu, telah divalidasi pada setiap kamera yang didukung, dan memiliki library yang sesuai di sisi host yang menggunakan format wire yang sama. Menggunakannya berarti kode di sisi kamera hanya satu kelas kecil per channel dan kode sisi host adalah objek Camera dengan metode channel_read dan channel_write. Ruang mental yang dihemat dapat digunakan untuk apa pun yang sebenarnya dilakukan aplikasi.
Bab ini mengajarkan protokol dari awal: format wire, aturan framing, mekanisme reliabilitas, model channel, dan akhirnya kelas Python di kedua ujung. Di akhir pembaca dapat membangun GUI host yang berkomunikasi dengan kamera, sebuah skrip yang melakukan streaming data sensor dari kamera ke laptop, dan jenis alat kalibrasi interaktif yang disertakan dalam openmv-projects/tools/.