12.4. Bắt tay và thương lượng khả năng¶
Cả cam và máy chủ đều đến với phương tiện truyền dẫn với những ý tưởng riêng về cách chạy giao thức: các chế độ CRC nào, liệu có cần ACK hay không, kích thước tải trọng lớn nhất mà chúng có thể đệm là bao nhiêu. Trước khi lưu lượng thực sự bắt đầu, chúng trao đổi một cái bắt tay để cố định những thông số đó cho phần còn lại của phiên.
12.4.1. Máy chủ mở kết nối¶
Phía cam khởi động ngăn xếp giao thức khi khởi động (hoặc ứng dụng khởi động lại nó bằng protocol.init() để thay đổi thông số), sau đó ngồi yên chờ máy chủ. Từ góc độ của cam, không có gì cần làm cho đến khi một gói tin đến.
Phía máy chủ mở phương tiện truyền dẫn -- cổng USB hoặc UART -- và ngay lập tức gửi một gói tin PROTO_SYNC (mã lệnh 0x00). Gói tin này có một tải trọng ma thuật cho phép cam nhận ra nó ngay cả khi cả hai bên mất đồng bộ, và đây là gói tin duy nhất cam phản hồi trước khi khả năng được thương lượng.
Nếu cam không trả lời trong thời gian chờ truyền lại, máy chủ sẽ gửi lại PROTO_SYNC, tối đa rtx_retries lần. Sau đó nó bỏ cuộc và báo cáo lỗi kết nối. Việc thử lại là điều làm cho "rút phích cắm, cắm lại, khởi động lại tập lệnh máy chủ" hoạt động mà cam không cần biết máy chủ đã đi.
12.4.2. Trao đổi khả năng¶
Khi cam xác nhận đồng bộ, máy chủ gửi PROTO_GET_CAPS (mã lệnh 0x01) để hỏi cam hỗ trợ những gì. Tải trọng trả lời báo cáo:
Xác thực CRC được bật hay tắt
Theo dõi số thứ tự được bật hay tắt
ACK được bật hay tắt
Thông báo sự kiện được bật hay tắt
Kích thước tải trọng tối đa của cam tính bằng byte
Số lần thử truyền lại hiện tại, thời gian chờ và các thông số thăm dò
Máy chủ so sánh những thông số đó với cấu hình của chính nó. Nếu máy chủ cần thay đổi bất kỳ thông số nào -- ví dụ, để thương lượng tải trọng tối đa nhỏ hơn vì bộ đệm nhận của nó nhỏ hơn của cam -- nó gửi PROTO_SET_CAPS (mã lệnh 0x02) với các giá trị mới. Cam cấu hình lại ngăn xếp của nó và xác nhận. Từ đây, mọi gói tin qua dây đều tuân theo hợp đồng chung đó.
Nếu máy chủ không ghi đè bất cứ thứ gì, mặc định là tất cả đều bật: xác thực CRC, theo dõi số thứ tự, ACK và thông báo sự kiện. Kích thước tải trọng tối đa mặc định là bộ đệm mỗi bo mạch của cam trừ 14 byte chi phí đóng khung (tiêu đề 10 byte cộng với CRC tải trọng đầu cuối 4 byte). Đối với hầu hết công việc cam-đến-laptop, các mặc định là điểm khởi đầu đúng; trang độ tin cậy đề cập đến khi nào và tại sao một ứng dụng chọn tắt một số phần trong số chúng.
12.4.3. Khám phá kênh¶
Sau khi thương lượng khả năng, máy chủ gửi CHANNEL_LIST (mã lệnh 0x20). Cam trả lời với danh sách các kênh đã đăng ký -- bốn kênh tích hợp sẵn (stdin, stdout, stream, profile) cộng với bất kỳ kênh nào ứng dụng đã đăng ký với protocol.register(). Mỗi mục mang ID của kênh, tên của nó và các cờ khả năng (chỉ đọc, chỉ ghi, có thể khóa).
Máy chủ lưu danh sách và sử dụng nó sau khi mã ứng dụng yêu cầu channel_read("frame") hoặc channel_write("config", ...) -- tên được tra cứu thành ID kênh một lần, sau đó mỗi gói tin tiếp theo trên kênh đó sử dụng ID trực tiếp.
Nếu cam đăng ký một kênh mới sau danh sách ban đầu -- phổ biến khi một ứng dụng bắt đầu chạy sau khi bắt tay -- cam phát ra một gói tin sự kiện CHANNEL_REGISTERED. Máy chủ lắng nghe những gói tin đó và làm mới danh sách kênh nội bộ của nó, do đó một tập lệnh máy chủ đã kết nối sớm thấy các kênh đăng ký mới xuất hiện mà không cần khởi động lại.
Quá trình bắt tay mất vài vòng lặp khi thiết lập kết nối và sau đó không bao giờ lặp lại. Lưu lượng ổn định chỉ là các gói tin: byte đóng khung vào, byte đóng khung ra, các ID kênh đã được biết ở cả hai phía.