
إثبات المفهوم لشبكة متداخلة لإنترنت الأشياء/الراديو الهواة مع توجيه عالمي عبر الإنترنت

نظام توجيه شبكي يدعم استخدام وكيل OpenDHT كخلفية، بحيث يمكن للعقد التواصل مباشرة عبر الإنترنت. مرحلة مبكرة جداً قبل ألفا، إثبات مفهوم، قد لا يعمل فعلاً، إلخ.
هذا مخصص لحالات استخدام الهواة/راديو الهواة (HAM)، ولأعمال إنترنت الأشياء الاستهلاكية/التجارية النموذجية، لكنه لا يحاول تحديداً استبدال الإنترنت، أو تغطية مناطق كبيرة ذات حركة مرور عالية بهوائيات شاملة الاتجاهات.
لا يحتوي على توجيه القفزة التالية على غرار Meshtastic، ومن هنا جاء اسم LazyMesh. إذا كنت ترغب في استخدامه لتطبيقات خارج الشبكة في منطقة كثيفة، فستحتاج على الأرجح إلى هوائيات اتجاهية ومعرفات مسار منسقة يدوياً.
الآن هذا هو التطبيق الوحيد الفعلي. افتح رسم Arduino النموذجي، وعدّله باسم المستخدم الخاص بك، ومفتاح قناة سري يجب أن يكون كلمة مرور قوية.
اكتب رسالتك في جهاز المراقبة التسلسلي لـ Arduino، ويجب أن تكون قادراً على الدردشة مع جميع الأجهزة الأخرى.
يجب أن تمر الرسائل طالما كانت العقد إما على نفس الشبكة، أو كلاهما لديه اتصال بالإنترنت.
قم بزيارة عميل الويب للدردشة مع العقدة عبر MQTT من الإنترنت. فقط قم بتعيين اسم مستخدم، أضف قناة، وأدخل كلمة مرور القناة. يمكن أن يكون اسم القناة أي شيء ويؤثر فقط على التصنيف في واجهة المستخدم.
يمكنك أيضاً تجربة رسم مثال بيانات القراءة/الكتابة. هذا يعرض معرف البيانات 195 قابلاً للقراءة، ومعرف البيانات 196 قابلاً للقراءة والكتابة. اذهب إلى الموقع، أدخل تفاصيل القناتك، واستخدم مربع حوار طلب البيانات لطلب المعرف 196 من جميع الأجهزة.
ثم انقر على "set" واضبطه على شيء آخر، وحاول قراءته مرة أخرى.
عميل الويب مقيد حالياً لاستخدام test.mosquitto.org، وسيتغير هذا في المستقبل.
تحتاج العقد إلى وسيلة لمزامنة الوقت للتواصل. حالياً، إذا لم تستقبل أبداً وقتاً من مصدر موثوق، فإنها ستضبط وقتها من أي حزمة عشوائية تراها.
قد يشكل هذا خطراً أمنياً يسمح بهجمات إعادة التشغيل، لذا يجب أن يكون للأجهزة التي تحتاج إلى الأمان مصدر وقت موثوق.
بمجرد ضبط الوقت مبدئياً، سيقوم الكود بضبط وقت النظام بما يصل إلى ثانية واحدة في اليوم للبقاء متزامناً مع العقد الأخرى، لذا فإن الانجراف خارج المزامنة لا ينبغي أن يكون مشكلة كبيرة.
في Lazymesh، كل شيء هو قناة، لا توجد رسائل مباشرة. إذا كنت تريدها، فقط اصنع قناة خاصة مخصصة.
يتم تعريف القنوات بكلمة مرور، معرفة كلمة المرور تسمح بصلاحيات القراءة والكتابة.
هناك 256 رقم مسار. كل حزمة تحتوي على واحد، والمكررات تكرر فقط إذا قامت بتمكين رقم مسار مطابق. بشكل افتراضي، يتم إرسال كل شيء برقم المسار 0، وهو ممكّن افتراضياً.
هذا يؤثر فقط على المكررات، العقد ستستمع إلى أي رقم مسار شبكي إذا كان موجهاً إليها مباشرة.
حمولات الحزمة هي مصفوفات MessagePack. تتناوب بين معرفات البيانات الصحيحة وبنود البيانات. 192-256 محجوزة للرسائل الخاصة بالتطبيق.
المعرف 32 للرسائل النصية، والتي يمكن أن تسبق باسم مستخدم ونقطتين.
المعرف 2 يُستخدم للمعرف الفريد، والذي يجب أن يكون عدداً صحيحاً. العديد من التطبيقات قد لا تحتاج هذا على الإطلاق.
أضف بايت طول البيانات الوصفية و N بايت من البيانات الوصفية.
لإنشاء IV، خذ 12 بايت عشوائياً لـ IV. ثم قم بتشفير الكل. أسبق الـ IV وألحق 4 بايت من علامة التوثيق.
ثم خذ أول 8 بايت من تجزئة معرف التوجيه وحوّلها إلى سداسي عشري.
سيكون موضوع MQTT هو lazymesh_route_HEX
لاحظ أننا نستخدم موضوعاً من المستوى الأعلى. هذا حتى لا تتمكن من استخدام أحرف البدل للاشتراك في جميع قنوات lazymesh مرة واحدة على الوسطاء العموميين، مما سيسمح لك بعمل هجوم حجب الخدمة (DoS) على الجميع بسهولة نسبية.
فقط الحزم الخام المرسلة على 224.0.0.251:2221
لا شيء من هذا نهائي!!!
جميع الأرقام هي little-endian.
1 بايت رأس:
2 بت نوع الحزمة (إما 1 أو 2، حسب ما إذا كنا نريد ACK)
3 بت TTL عدد القفزات المتبقية
1 بت السماح بالنقل البطيء (LoRa إلخ)
1 بت السماح بالتوجيه العالمي
1 بت تم توجيهها عالمياً بالفعل
1 بايت رأس 2:
1 بت محاولة الإرسال الأولى:
عندما ننشئ حزمة أو نستقبلها، نضبط هذه البتة. بعد محاولة إرسالها،
نقوم بمسحها. بهذه الطريقة، طالما نفترض أن فقدان الحزمة منخفض نسبياً، يمكننا حساب المكررات في المنطقة
دون نفقات إضافية.
1 بت بتة المكرر:
تشير إلى أن هذه الحزمة يجب تضمينها عند عد المكررات.
اضبطها إذا كنت ستعيد إرسال الحزمة أو مثلها، حتى لو كنت أنت من أنشأها.
1 بت بتة الاهتمام:
إذا تم ضبطها، فإن العقدة التي أرسلتها مهتمة بشكل مباشر بالقناة،
وليست مجرد مكرر. إذا تم ضبط أول إرسال أيضاً، فسيتم التعامل معها كـ
ACK ضمني
1 بت تمكين الموقع
إذا تم ضبط هذه البتة، يجوز للمكررات إضافة بيانات وصفية للموقع إلى الحزم المرسلة إلى الإنترنت. يجب تشفير هذه البيانات الوصفية باستخدام معرف التوجيه كمفتاح،
مما يعني أن الأشخاص القريبين يمكنهم تتبعك لمدة ساعة واحدة بعد خروجك من النطاق.
غير مطبق في أي مكان في الوقت الحالي.
5 بتات محجوزة 0
1 بايت رقم مسار الشبكة
1 بايت فقدان المسار المتراكم:
5 بتات إجمالاً
3 بتات آخر قفزة
كل قفزة هي نقطة فقدان مسار،
بالإضافة إلى أي تكلفة إضافية إرشادية يطبقها وسيط النقل.
نقطة واحدة إضافية من الخسارة يجب أن تكون تقريباً بنفس "السوء" مثل
خسارة 10 ديسيبل مللي إضافية على الواي فاي.
16 بايت معرف التوجيه:
يتغير كل ساعة، مشتق من مفتاح القناة قبل المشاركة (PSK) عن طريق تجزئة.
PSK هو مجرد 16 بايت SHA256 لكلمة المرور.
معرف التوجيه يتغير كل ساعة، وهو SHA256 لـ:
الحرف 'cr'
عدد الساعات منذ 1970 كعدد صحيح غير موقع 32 بت
PSK
8 بايت عشوائية:
تستخدم كجزء من IV للتشفير
4 بايت طابع زمني:
أيضاً جزء من IV، يمنع هجمات إعادة التشغيل
N بايت نص مشفر:
مشفر بـ AES-GCM.
مفتاح التشفير يتغير كل ساعة، وهو SHA256 لـ:
الحرف 'c'
عدد الساعات منذ 1970 كعدد صحيح غير موقع 32 بت
PSK
6 بايت علامة توثيق:
آخر 6 بايت هي علامة GCM
قد تختار بعض التطبيقات تجاهل هذا تماماً.
ACKs هي بحتة لكل قفزة ما لم ترغب طبقة بروتوكول أعلى في عمل ACKs من النهاية إلى النهاية.
حزم ACK لا يتم إعادة إرسالها أو توجيهها أو أي شيء، ولا يتم توثيقها. كل خطوة من إعادة الإرسال الشبكي لها إقرارها الخاص، من منظور المرسل الأصلي، إنها إرسال ونسيان.
مثل Meshtastic ومعظم الآخرين، البروتوكول هو "شبه موثوق"، هناك، مثل جميع الشبكات، حالات حافة تسبب الفشل.
الموثوقية الحقيقية يجب أن تتم على مستوى أعلى.
لكل حزمة، كل مستمع مهتم بتلك القناة المحددة يرسل إقرار قناة مرة واحدة بالضبط، ما لم يكتشف أنه تم إرسال أكثر من 8 ACKs بواسطة عقد أخرى بالفعل.
يجب إرسال هذه الحزمة على جميع وسائل النقل، ليس فقط الوسيلة التي جاءت منها الحزمة، وإلا قد تحصل العقد الأخرى على فكرة خاطئة عن عدد المستمعين.
عندما تحتوي حزمة على كل من بت محاولة الإرسال الأولى وعلامة الاهتمام، فهي مثل ACK ضمني. إذا كنا نرسل نسخة من الحزمة، لا نحتاج إلى إرسال ACK أيضاً لإضافتنا إلى عدد الاهتمام.
المكررات تقر بالإقرار فقط بإرسال نسخة من الحزمة، عندما يتم وضع علامة عليها مع علامة النسخة الأولى، نقوم بعدها. لهذا السبب، يجب على وسائل النقل مثل الواي فاي إعادة الإرسال حتى لو لم يكن ذلك منطقياً.
هذا لا ينطبق على وسائل النقل التوجيه العالمي، التوجيه العالمي يتم التعامل معه بشكل منفصل ولا يخضع لأي نوع من ACKs أو إعادة الإرسال أو أي شيء، نفترض أن خادم MQTT يتعامل مع كل شيء.
يجوز للعقد إعادة إرسال الرسالة عدة مرات إذا تلقت ردوداً أقل من المتوقع.
يجب ألا تتوقع العقد أبداً أكثر من 6 مكررات و 6 مستمعين قناة، حتى لو تلقت ردوداً أكثر، لأن مخطط ACK البسيط يصبح غير دقيق بعد ذلك إذا كان فقدان الحزمة معتدلاً.
1 بايت رأس:
دائماً 0، نوع الحزمة هو تحكم، وهذه غير قابلة للتوجيه أو إعادة الإرسال
1 بايت رأس 2:
نفس الشيء كما في حزم البيانات. غير مستخدم فعلياً في الوقت الحالي
1 بايت نوع فرعي:
CONTROL_TYPE_CHANNEL_ACKNOWLEDGE
يمكنك الإقرار كمستمع قناة
حتى يعرف المرسل عددهم.
4 بايت معرف الرسالة:
فقط أول 4 بايت من IV العشوائي من الحزمة التي نقر بها
كل ساعة، قبل بضع دقائق من الساعة، يجب على العقد إرسال إعلان عن القنوات التي تهتم بها.
يجب إرسال هذا مع الرموز المتحركة للساعة التالي بدلاً من الساعة الحالية، حتى يمكن إعداد الاتصالات مسبقاً ويعمل كل شيء حتى عندما تكون الأوقات غير متزامنة.
العقد تتواصل عبر البلوتوث باستخدام حزمة إعلان موسعة مع UUID الخدمة d1a77e11-420f-9f11-1a00-10a6beef0001، والحمولة هي مجرد تنسيق الحزمة أعلاه.
يجب ألا تحتوي حزم BLE أبداً على علامة "النسخة الأولى"، ولا نقوم بعد المكررات عبر BLE. فقدان الحزمة مرتفع جداً لأي مخطط بسيط وقابل للتطوير يمكنني التفكير فيه.
لذلك، نتعامل معها على أنها قناة خسارة بطبيعتها، نخففها إلى حد ما عن طريق إعادة إرسال الحزم حتى 4 مرات، أو حتى نحتاج إلى التوقف عن ذلك حتى نتمكن من إرسال حزمة أخرى.
طالما أن العقدة لا تحاول إرسال أكثر من حزمة أو اثنتين في الثانية، فإن مخطط الإعادة البحت سيوفر بعض الموثوقية، وإذا تجاوزنا ذلك، فسوف تتراجع لعدم ازدحام كل شيء.
نتوقف أيضاً عن الإرسال إذا رأينا عدداً كبيراً جداً من العقد الأخرى في نفس المنطقة ترسل نسخاً كثيرة جداً من الحزمة.