12.4. المصافحة والتفاوض على القدرات

تصل كل من الكاميرا والمضيف إلى النقل ولكل منهما تصوراته الخاصة عن كيفية تشغيل البروتوكول: أي أوضاع CRC، وهل الإقرارات (ACKs) مطلوبة، وما أكبر حمولة يمكنه تخزينها مؤقتًا. وقبل أن تبدأ حركة المرور الفعلية يتبادلان مصافحة تثبّت تلك المعلمات لبقية الجلسة.

12.4.1. المضيف يفتح الاتصال

يبدأ جانب الكاميرا حزمة البروتوكول عند الإقلاع (أو يعيد التطبيق تشغيلها عبر protocol.init() لتغيير المعلمات)، ثم يجلس بهدوء منتظرًا مضيفًا. ومن منظور الكاميرا لا شيء يستدعي العمل حتى تصل حزمة.

يفتح جانب المضيف النقل -- منفذ USB أو UART -- ويرسل فورًا حزمة PROTO_SYNC (رمز التشغيل 0x00). تحمل هذه الحزمة حمولة سحرية تتيح للكاميرا التعرف عليها حتى لو خرج الطرفان عن المزامنة، وهي الحزمة الوحيدة التي تستجيب لها الكاميرا قبل التفاوض على القدرات.

إذا لم ترد الكاميرا خلال مهلة إعادة الإرسال، يرسل المضيف PROTO_SYNC مرة أخرى، حتى rtx_retries مرة. وبعد ذلك يستسلم ويبلّغ عن فشل الاتصال. إعادة المحاولة هذه هي ما يجعل "الفصل وإعادة التوصيل وإعادة تشغيل البرنامج النصي للمضيف" يعمل دون حاجة الكاميرا إلى معرفة أن المضيف قد غاب.

12.4.2. تبادل القدرات

بمجرد أن تُقرّ الكاميرا بالمزامنة، يرسل المضيف PROTO_GET_CAPS (رمز التشغيل 0x01) ليسأل عما تدعمه الكاميرا. تُبلّغ حمولة الرد عن:

  • تمكين أو تعطيل التحقق من CRC

  • تمكين أو تعطيل تتبع أرقام التسلسل

  • تمكين أو تعطيل الإقرارات (ACKs)

  • تمكين أو تعطيل إشعارات الأحداث

  • أقصى حجم حمولة للكاميرا بالبايتات

  • عدد محاولات إعادة الإرسال الحالي والمهلة ومعلمات الاستقصاء

يقارن المضيف تلك بإعداداته الخاصة. وإذا احتاج المضيف إلى تغيير أي منها -- مثلًا، للتفاوض على حد أقصى أصغر للحمولة لأن مخزن الاستقبال لديه أصغر من مخزن الكاميرا -- فإنه يرسل PROTO_SET_CAPS (رمز التشغيل 0x02) بالقيم الجديدة. تعيد الكاميرا تهيئة حزمتها وتُقر. ومن هنا فصاعدًا، تتبع كل حزمة تعبر الإرسال ذلك العقد المشترك.

إذا لم يتجاوز المضيف أي شيء، تكون الإعدادات الافتراضية كلها مفعّلة: التحقق من CRC، وتتبع أرقام التسلسل، والإقرارات (ACKs)، وإشعارات الأحداث. والحد الأقصى الافتراضي للحمولة هو المخزن المؤقت الخاص بكل لوحة في الكاميرا مطروحًا منه 14 بايت من حمل التأطير (الترويسة ذات الـ 10 بايتات زائد الـ 4 بايتات الخاصة بـ CRC الحمولة في الذيل). وبالنسبة لمعظم أعمال الكاميرا إلى الحاسوب المحمول تكون الإعدادات الافتراضية نقطة البداية الصحيحة؛ وتغطي صفحة الموثوقية متى ولماذا يعطّل التطبيق أجزاءً منها.

12.4.3. اكتشاف القنوات

بعد القدرات، يرسل المضيف CHANNEL_LIST (رمز التشغيل 0x20). ترد الكاميرا بقائمة من القنوات المسجلة -- القنوات الأربع المدمجة (stdin وstdout وstream وprofile) إضافة إلى أي قناة سجّلها التطبيق عبر protocol.register(). يحمل كل إدخال معرّف القناة واسمها وأعلام قدراتها (للقراءة فقط، للكتابة فقط، قابلة للقفل).

يحفظ المضيف القائمة ويستخدمها لاحقًا عندما تطلب شيفرة التطبيق channel_read("frame") أو channel_write("config", ...) -- يُبحث عن الاسم للحصول على معرّف قناة مرة واحدة، ثم تستخدم كل حزمة لاحقة على تلك القناة المعرّف مباشرة.

إذا سجّلت الكاميرا قناة جديدة بعد القائمة الأولية -- وهو أمر شائع عندما يبدأ تطبيق بالعمل بعد المصافحة -- فإن الكاميرا تُصدر حزمة حدث CHANNEL_REGISTERED. يستمع المضيف لتلك ويحدّث قائمة قنواته الداخلية، فيرى برنامج نصي للمضيف اتّصل مبكرًا ظهور القنوات المسجَّلة حديثًا دون إعادة تشغيل.

تستغرق المصافحة بضع رحلات ذهاب وإياب عند إعداد الاتصال ثم لا تتكرر أبدًا. حركة المرور في الحالة المستقرة هي مجرد حزم: بايتات مؤطّرة داخلة، وبايتات مؤطّرة خارجة، ومعرّفات القنوات معروفة بالفعل على الطرفين.