12.1. Tại sao cần thư viện giao thức¶
Một cặp cáp và tốc độ baud là đủ để truyền các byte từ cam đến máy chủ. USB-CDC và UART đều cung cấp cho chương trình cam một luồng dữ liệu, nơi write đưa các byte vào một đầu và read lấy chúng ra ở đầu kia. Vậy thì thư viện giao thức bổ sung thêm điều gì?
Ba điều mà bạn phải tự viết, mỗi lần, nếu cố gắng xây dựng kênh cam-đến-máy chủ trực tiếp trên các byte thô:
Đóng khung. Luồng byte không có cấu trúc vốn có. Cam ghi temp=42 và máy chủ đọc temp= cộng với một ngắt đến sau, rồi 42 cộng với thông điệp tiếp theo bắt đầu bằng humid=... đã chạy vào nó. Các byte không có ranh giới. Mọi liên kết máy chủ không tầm thường đều phải phát minh ra một số dấu hiệu -- \n giữa các thông điệp, tiêu đề tiền tố độ dài, chuỗi thoát cho các tải trọng nhị phân -- để bộ nhận biết một thông điệp kết thúc và thông điệp tiếp theo bắt đầu ở đâu. Thư viện giao thức cung cấp cho bạn định dạng gói tin thống nhất với từ đồng bộ và trường độ dài, và bộ nhận không bao giờ phải đoán.
Độ tin cậy. USB-CDC không bỏ mất byte trong hoạt động bình thường, nhưng UART thì có (khi máy chủ ngừng phục vụ cổng đủ nhanh), và một cáp nối tiếp bị rút và cắm lại có thể để lại một bên với một gói tin không đầy đủ. Điều đúng đắn cần làm là phát hiện sự hỏng hóc, yêu cầu phía kia truyền lại, và chỉ bàn giao cho mã ứng dụng những thông điệp đến nguyên vẹn. Thư viện giao thức thực hiện điều đó cho mỗi gói tin với CRC và các xác nhận từng gói -- được bật theo mặc định; ứng dụng không thấy các lần thử lại.
Ghép kênh. Có đúng một cổng USB-CDC giữa cam và máy chủ. Nếu cam đang truyền phát một ảnh và máy chủ đang gửi cấu hình cho nó và IDE đang đọc stdout để lấy đầu ra print, cả ba trao đổi phải chia sẻ luồng byte đơn lẻ đó. Thư viện giao thức cấp cho mỗi luồng độc lập một số kênh, cho phép cam đăng ký một lớp Python cho từng kênh, và giữ cho các lần đọc của máy chủ trên mỗi kênh không ảnh hưởng lẫn nhau. Từ mã ứng dụng, mỗi kênh trông như một liên kết riêng tư của nó.
12.1.1. Tại sao không tự viết¶
Bạn có thể. Cần vài tuần để hoàn thiện cả ba điều trên một đường nối tiếp và thêm vài tuần nữa để làm cho việc đóng khung xử lý phục hồi kết nối nóng một cách sạch sẽ, các lần truyền lại hoạt động mà không lãng phí năng lượng vào các vòng lặp, và bộ ghép kênh tồn tại khi đọc một phần mà không làm hỏng các byte của kênh này sang kênh khác.
Thư viện giao thức đã thực hiện công việc đó, đã được xác thực trên mọi cam được hỗ trợ, và có các thư viện tương ứng ở phía máy chủ nói cùng định dạng dây. Sử dụng nó có nghĩa là mã phía cam là một lớp nhỏ cho mỗi kênh và mã phía máy chủ là một đối tượng Camera với các phương thức channel_read và channel_write. Không gian tư duy tiết kiệm được dành cho những gì ứng dụng thực sự làm.
Chương này dạy giao thức từ đầu: định dạng dây, các quy tắc đóng khung, cơ chế độ tin cậy, mô hình kênh, và cuối cùng là các lớp Python ở cả hai đầu. Đến cuối, người đọc có thể xây dựng một GUI máy chủ giao tiếp với cam, một tập lệnh truyền dữ liệu cảm biến từ cam đến laptop, và loại công cụ hiệu chuẩn tương tác được cung cấp trong openmv-projects/tools/.