تخطَّ إلى المحتوى
أسامة جنينة
كل الأعمال
البنية التحتية والتكاملاتأنظمة الويبقيد التطوير

صِلة

مراسلة بين الأجهزة بدون إنترنت ولا سيرفرات ولا شريحة

الدور
المهندس والمعماري الوحيد — البروتوكول وطبقة native والتطبيق والوثائق
الفترة
2025 — حتى الآن
التقنيات
Flutter · Dart · Bluetooth Low Energy · Pigeon platform channels · Kotlin · Swift · Mesh routing

أرقام أساسية

ملفات Dart
69
ملفات اختبار
15
وثائق معمارية
9
تشمل نموذج تهديد أمني ومواصفة BLE على مستوى native
سيرفرات مطلوبة
0
بالتصميم — لا يوجد باكإند يمكن إسقاطه

المشكلة

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

«صِلة» تبدأ من الافتراض المعاكس: لا إنترنت، ولا سيرفر، ولا شريحة. الموجود فعلاً هو كثافة عالية من الهواتف — وكل واحد منها يحمل راديو بلوتوث يعمل على مدى قريب بدون أي شبكة إطلاقاً.

السؤال المنتَجي كان: هل يمكن لهاتف عادي أن يصبح جزءاً من نسيج اتصالات بدلاً من أن يكون عميلاً له؟ والسؤال الهندسي كان: هل يمكن دفع Bluetooth Low Energy — المصمَّم لإقران سماعات — ليحمل شبكة رسائل متعددة القفزات على أجهزة استهلاكية؟

القيود الصارمة

  • لا سيرفرات من أي نوع. ليست «مستضافة ذاتياً» — بل معدومة. يجب ألا يوجد شيء يُصادَر أو يُحجَب أو يُطفأ.
  • لا حسابات ولا أرقام هواتف ولا بريد إلكتروني. يجب أن تعمل الهوية بدون سجل مركزي.
  • البطارية ميزانية صارمة. المُرحِّل الذي يستهلك بطارية الهاتف في ساعتين هو مُرحِّل لن يتركه أحد يعمل.
  • يعمل على الهواتف التي يملكها الناس أصلاً — بدون beacons ولا أجهزة إضافية ولا root، على أندرويد و iOS معاً.

المعمارية

كل جهاز يعمل في الوقت نفسه كـ BLE peripheral (يُعلن ويقبل الاتصالات) وكـ central (يمسح ويتصل بالخارج). هذا الدور المزدوج هو ما يجعل الطوبولوجيا شبكة mesh لا نجمة: لا توجد أجهزة بوابة ولا مُنسّق، فإزالة أي هاتف تُضعِف الشبكة بدل أن تقسمها.

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

Flutter يملك الواجهة والتخزين وسياسة التوجيه. أما عمل BLE فيجب أن يكون native — التنفيذ في الخلفية ودورات حياة الإعلان والاتصال تختلف كثيراً بين أندرويد و iOS بحيث لا يمكن تجريدها — فكُتبت الطبقة الأصلية لكل منصة وعُرِضت لـ Dart عبر قنوات مولّدة بـ Pigeon، ما يمنح واجهة واحدة مُتحقَّق من أنواعها بدل استدعاءات مكتوبة يدوياً بنصوص.

جهاز واحد من الأعلى للأسفل. Flutter يملك التوجيه والتخزين؛ وعمل راديو BLE أصلي لكل منصة خلف واجهة مولّدة واحدة. الرابط بين الأجهزة هو وسيلة النقل الوحيدة — ولا يوجد سيرفر في هذه الصورة إطلاقاً.قفزات متعددةFlutter / Dartواجهة · تخزين · توجيهPigeon channelsمولّدة وآمنة الأنواعKotlin · BLEGATT وإعلانSwift · BLECoreBluetoothPeer deviceيُرحّل للتالي
جهاز واحد من الأعلى للأسفل. Flutter يملك التوجيه والتخزين؛ وعمل راديو BLE أصلي لكل منصة خلف واجهة مولّدة واحدة. الرابط بين الأجهزة هو وسيلة النقل الوحيدة — ولا يوجد سيرفر في هذه الصورة إطلاقاً.
  • Flutter / Dartالواجهة والتخزين المحلي وسياسة التوجيه ودورة حياة الرسالة
  • Pigeon platform channelsحدّ مُولَّد وآمن الأنواع بين Dart والطبقة الأصلية
  • Kotlin (Android BLE)الإعلان والمسح وخادم وعميل GATT والتنفيذ في الخلفية
  • Swift (iOS BLE)أدوار peripheral و central في CoreBluetooth تحت قيود خلفية iOS
  • Mesh relay layerتمرير متعدد القفزات مع تخزين وإرسال للنظائر الغائبة

قرارات التصميم

Bluetooth Low Energy بدلاً من Wi-Fi Direct

اخترتBluetooth Low Energyبدلاً منWi-Fi Direct / Wi-Fi Aware

يوفّر Wi-Fi Direct نطاقاً أوسع بكثير، وهذا مغرٍ حتى تنظر إلى ما تحمله الشبكة فعلاً: رسائل نصية قصيرة. النطاق لم يكن يوماً عنق الزجاجة.

المهم كان استهلاك الطاقة والسلوك في الخلفية وعدد النظائر التي يستطيع الجهاز الاحتفاظ بها معاً. BLE يتقدّم في الثلاثة — والأهم أنه متاح ومسموح على المنصتين بدون نوافذ الإقران وخصوصيات المصنّعين التي تجعل Wi-Fi Direct غير قابل للاستخدام كبنية تحتية غير مرئية.

قنوات مولّدة بـ Pigeon بدلاً من method channels يدوية

اخترتPigeon code generationبدلاً منMethodChannel with manual serialisation

الحدّ بين Dart والطبقة الأصلية هنا ليس استدعاءً أو اثنين. إنه يحمل حالة الاتصال وأحداث اكتشاف النظائر ونتائج القراءة والكتابة في GATT وحالات الخطأ، في الاتجاهين، على منصتين.

الـ method channels اليدوية تحوّل كل واحد من هذه إلى عقد مكتوب بنصوص لا يُكتشف خطؤه إلا في وقت التشغيل، على جهاز، في الميدان. أما Pigeon فيحوّل العقد نفسه إلى كود مولّد على الجهتين، فيصبح تغيير التوقيع خطأ تصريف على الأسطح الثلاثة في اللحظة نفسها. في مشروع قيمته كلها هي الموثوقية عندما لا يعمل أي شيء آخر، كان نقل الأعطال من وقت التشغيل إلى وقت التصريف أعلى قرار مردوداً في المشروع.

نموذج تهديد مكتوب قبل أول ميزة

اخترتDocumented threat model driving the designبدلاً منShipping features and hardening later

شبكة تمرير مجهولة لها خصوم لا يواجههم تطبيق محادثة عادي: عقدة معادية تنضم للشبكة، ومراقب يهمه من كان قريباً من من لا ما قيل، وهاتف تم الاستيلاء عليه.

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

النتيجة

التطبيق هو ٦٩ ملف Dart مع ١٥ ملف اختبار، وتنفيذ BLE أصلي لكل منصة خلف واجهة مولّدة واحدة، ومجموعة معمارية من تسع وثائق تغطي الملخص التنفيذي والمعمارية ونموذج التهديد ومواصفة BLE الأصلية ونظام التصميم ومسارات الاستخدام وحالة التنفيذ وخريطة الطريق.

إنه المشروع الوحيد في هذا الموقع الذي لا يوجد فيه باكإند أُشير إليه — وهذا بالضبط هو الادعاء. كل ما يسكن عادةً في سيرفر يسكن هنا في البروتوكول بدلاً منه.

ما سآخذه معي

  • 01التنفيذ الخلفي للبلوتوث هو المكان الذي تموت فيه التجريدات العابرة للمنصات. قبول تنفيذين أصليين مبكراً كان أرخص من مصارعة تجريد واحد لأشهر.
  • 02كتابة الوثائق أولاً لم تكن استعراضاً إجرائياً. في مشكلة على شكل بروتوكول، الوثيقة هي التصميم — والكود يأتي تالياً لها.
دراسة الحالة التاليةمنصة تجارة تعمل داخل واتسابمتجر متعدد الفروع، واجهته بالكامل محادثة واتساب