12.4. לחיצת יד ומשא ומתן על יכולות¶
המצלמה והמארח מגיעים שניהם אל שכבת התעבורה עם רעיונות משלהם לגבי אופן ההפעלה של הפרוטוקול: אילו מצבי CRC, האם נדרשים ACK, ומהו עומס המטען הגדול ביותר שהם יכולים לאגור בחוצץ. לפני שתעבורה אמיתית מתחילה הם מחליפים לחיצת יד שמקבעת את הפרמטרים הללו ליתר ההפעלה (session).
12.4.1. המארח פותח את החיבור¶
צד המצלמה מאתחל את מחסנית הפרוטוקול באתחול (או שהיישום מאתחל אותה מחדש באמצעות protocol.init() כדי לשנות פרמטרים), ואז יושב בשקט וממתין למארח. מנקודת מבטה של המצלמה אין מה לעשות עד שמגיעה מנה.
צד המארח פותח את שכבת התעבורה – יציאת USB או UART – ומיד שולח מנת PROTO_SYNC (אופקוד 0x00). למנה זו יש עומס מטען קסום שמאפשר למצלמה לזהות אותה גם אם שני הצדדים יצאו מסנכרון, וזו המנה היחידה שהמצלמה מגיבה לה אי-פעם לפני שמתבצע משא ומתן על יכולות.
אם המצלמה אינה משיבה בתוך פסק-הזמן של השידור החוזר, המארח שולח שוב PROTO_SYNC, עד rtx_retries פעמים. לאחר מכן הוא מוותר ומדווח על כשל בחיבור. הניסיון החוזר הוא מה שגורם ל“לנתק, לחבר מחדש, להפעיל מחדש את סקריפט המארח“ לעבוד מבלי שהמצלמה תצטרך לדעת שהמארח נעלם.
12.4.2. החלפת יכולות¶
ברגע שהמצלמה מאשרת את הסנכרון, המארח שולח PROTO_GET_CAPS (אופקוד 0x01) כדי לשאול מה המצלמה תומכת בו. עומס המטען של התשובה מדווח:
אימות CRC מופעל או מושבת
מעקב מספרי-רצף מופעל או מושבת
ACK מופעלים או מושבתים
התראות אירועים מופעלות או מושבתות
גודל עומס המטען המרבי של המצלמה בבייטים
ספירת הניסיונות החוזרים, פסק-הזמן ופרמטרי הסקירה הנוכחיים של השידור החוזר
המארח משווה אותם מול התצורה שלו עצמו. אם המארח צריך לשנות כל אחד מהם – למשל, לנהל משא ומתן על עומס מטען מרבי קטן יותר משום שחוצץ הקבלה שלו קטן מזה של המצלמה – הוא שולח PROTO_SET_CAPS (אופקוד 0x02) עם הערכים החדשים. המצלמה מגדירה מחדש את המחסנית שלה ומאשרת. מכאן ואילך, כל מנה שחוצה את התיל פועלת לפי אותו חוזה משותף.
אם המארח אינו עוקף דבר, כל ברירות המחדל מופעלות: אימות CRC, מעקב מספרי-רצף, ACK והתראות אירועים. עומס המטען המרבי שבברירת המחדל הוא החוצץ של המצלמה לכל לוח פחות 14 בייטים של עומס תקורת מסגור (כותרת בת 10 בייטים בתוספת 4 בייטים של CRC עומס מטען סופי). עבור רוב העבודה בין מצלמה למחשב נייד ברירות המחדל הן נקודת ההתחלה הנכונה; עמוד האמינות מסביר מתי ולמה יישום מבטל מהן חלקים.
12.4.3. גילוי ערוצים¶
לאחר היכולות, המארח שולח CHANNEL_LIST (אופקוד 0x20). המצלמה משיבה ברשימה של ערוצים רשומים – ארבעת המובנים (stdin, stdout, stream, profile) בתוספת כל אלה שהיישום רשם באמצעות protocol.register(). כל רשומה נושאת את מזהה הערוץ, שמו ודגלי היכולת שלו (קריאה-בלבד, כתיבה-בלבד, ניתן-לנעילה).
המארח שומר את הרשימה ומשתמש בה מאוחר יותר כשקוד היישום מבקש channel_read("frame") או channel_write("config", ...) – השם מתורגם למזהה ערוץ פעם אחת, ואז כל מנה עוקבת באותו ערוץ משתמשת במזהה ישירות.
אם המצלמה רושמת ערוץ חדש לאחר הרשימה הראשונית – דבר נפוץ כשיישום מתחיל לרוץ לאחר לחיצת היד – המצלמה פולטת מנת אירוע CHANNEL_REGISTERED. המארח מאזין להן ומרענן את רשימת הערוצים הפנימית שלו, כך שסקריפט מארח שהתחבר מוקדם רואה ערוצים שנרשמו לאחרונה מופיעים מבלי להפעיל מחדש.
לחיצת היד אורכת כמה הלוך-ושוב בהקמת החיבור ואז אינה חוזרת לעולם. תעבורת המצב-היציב היא רק מנות: בייטים ממוסגרים פנימה, בייטים ממוסגרים החוצה, מזהי הערוצים כבר ידועים בשני הצדדים.