12.1. لماذا مكتبة بروتوكول

يكفي زوج من الكابلات ومعدل باود لنقل البايتات من الكاميرا إلى حاسوب مضيف. يوفر كل من USB-CDC وUART لبرنامج الكاميرا تدفقًا حيث يضع write البايتات في أحد الطرفين ويأخذها read من الطرف الآخر. فما الذي تضيفه إذن مكتبة البروتوكول فوق ذلك؟

ثلاثة أشياء كنت ستضطر إلى كتابتها بنفسك، في كل مرة، إذا حاولت بناء قناة جادة من الكاميرا إلى المضيف مباشرة فوق البايتات الخام:

التأطير (Framing). لا يمتلك تدفق البايتات أي بنية متأصلة. تكتب الكاميرا temp=42 ويقرأ المضيف temp= ثم تصل مقاطعة لاحقًا، ثم 42 مع بدء الرسالة التالية بـ humid=... وقد تداخلت معها بالفعل. ليس للبايتات حدود. وينتهي الأمر بكل رابط مضيف غير تافه إلى ابتكار علامة ما -- \n بين الرسائل، أو ترويسات بادئة الطول، أو تسلسلات الهروب للحمولات الثنائية -- كي يعرف المستقبِل أين تنتهي رسالة وأين تبدأ التالية. تمنحك مكتبة البروتوكول صيغة حزمة موحدة بكلمة مزامنة وحقل طول، فلا يضطر المستقبِل أبدًا إلى التخمين.

الموثوقية. لا يُسقط USB-CDC البايتات بصمت في التشغيل العادي، لكن UART يفعل ذلك (عندما يتوقف المضيف عن خدمة المنفذ بالسرعة الكافية)، وقد يؤدي فصل كابل تسلسلي وإعادة توصيله إلى ترك أحد الطرفين مع حزمة جزئية. والصواب هو اكتشاف التلف، وطلب إعادة الإرسال من الطرف الآخر، وعدم تسليم شيفرة التطبيق أبدًا سوى الرسائل التي وصلت سليمة. تفعل مكتبة البروتوكول ذلك لكل حزمة عبر CRC وإقرارات لكل حزمة -- مفعّلة افتراضيًا؛ ولا يرى التطبيق عمليات إعادة المحاولة.

المضاعفة (Multiplexing). يوجد منفذ USB-CDC واحد فقط بين الكاميرا والمضيف. إذا كانت الكاميرا تبث صورة وفي الوقت ذاته يرسل المضيف إليها إعدادات وفي الوقت ذاته يقرأ الـ IDE الـ stdout للحصول على مخرجات print، فإن المبادلات الثلاث جميعها يجب أن تتشارك في تدفق البايتات الواحد ذاك. تمنح مكتبة البروتوكول كل تدفق مستقل رقم قناة، وتتيح للكاميرا تسجيل صنف Python لكل منها، وتمنع قراءات المضيف على كل قناة من التداخل مع غيرها. ومن منظور شيفرة التطبيق، تبدو كل قناة وكأنها رابط خاص بها.

12.1.1. لماذا لا تكتب ذلك بنفسك

يمكنك ذلك. إنها بضعة أسابيع من العمل لجعل الثلاثة جميعها صحيحة على خط تسلسلي، وبضعة أسابيع أخرى لجعل التأطير يعالج استرداد التوصيل الساخن بنظافة، وجعل عمليات إعادة الإرسال تعمل دون إهدار الطاقة على الذهاب والإياب، وجعل المُضاعِف ينجو من القراءات الجزئية دون أن يفسد بايتات قناة في أخرى.

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

يعلّمك هذا الفصل البروتوكول من الأساس: صيغة الإرسال، وقواعد التأطير، وآلية الموثوقية، ونموذج القنوات، وأخيرًا أصناف Python على الطرفين. وبحلول النهاية يستطيع القارئ بناء واجهة مستخدم رسومية للمضيف تتحدث مع الكاميرا، وبرنامج نصي يبث بيانات المستشعر من الكاميرا إلى حاسوب محمول، ونوع أداة المعايرة التفاعلية المضمَّنة في openmv-projects/tools/.