
प्रूफ ऑफ कॉन्सेप्ट IoT/हैम रेडियो मेश नेटवर्क, जो इंटरनेट पर वैश्विक रूटिंग के साथ है।

मेश रूटिंग सिस्टम जो बैकएंड के रूप में OpenDHT प्रॉक्सी का उपयोग करने का समर्थन करता है, ताकि नोड इंटरनेट के माध्यम से सीधे संवाद कर सकें। बहुत प्रारंभिक प्री-अल्फा, अवधारणा का प्रमाण, शायद वास्तव में काम न करे, आदि।
यह शौक/HAM उपयोग के मामलों और अधिक सामान्य उपभोक्ता/वाणिज्यिक IoT कार्यों दोनों के लिए है, लेकिन विशेष रूप से इंटरनेट को बदलने या सर्वदिशात्मक एंटेना के साथ बड़े उच्च-यातायात क्षेत्रों को कवर करने का प्रयास नहीं करता है।
इसमें Meshtastic-शैली का अगला-हॉप रूटिंग नहीं है, इसलिए इसका नाम LazyMesh है। यदि आप इसे घने क्षेत्र में ऑफग्रिड प्रकार के अनुप्रयोगों के लिए उपयोग करना चाहते हैं, तो आपको संभवतः दिशात्मक एंटेना और मैन्युअल रूप से समन्वित रूट आईडी की आवश्यकता होगी।
अभी यह एकमात्र वास्तविक एप्लिकेशन है। उदाहरण Arduino स्केच खोलें, इसे अपने उपयोगकर्ता नाम और एक गुप्त चैनल कुंजी के साथ संशोधित करें जो एक मजबूत पासवर्ड होना चाहिए।
Arduino सीरियल मॉनिटर में अपना संदेश टाइप करें, और आपको अन्य सभी उपकरणों के साथ चैट करने में सक्षम होना चाहिए।
संदेश तब तक पहुंचने चाहिए जब तक नोड या तो एक ही नेटवर्क पर हैं, या दोनों के पास इंटरनेट एक्सेस है।
वेब क्लाइंट पर जाएं इंटरनेट से MQTT के माध्यम से नोड के साथ चैट करने के लिए। बस एक उपयोगकर्ता नाम सेट करें, एक चैनल जोड़ें, और चैनल पासवर्ड दर्ज करें। चैनल का नाम कुछ भी हो सकता है और केवल UI में लेबलिंग को प्रभावित करता है।
आप रीड/राइट डेटा उदाहरण स्केच भी आज़मा सकते हैं। यह डेटा आईडी 195 को पठनीय और डेटा आईडी 196 को पठनीय और लिखने योग्य के रूप में उजागर करता है। साइट पर जाएं, अपने चैनल का विवरण दर्ज करें, और सभी उपकरणों से आईडी 196 का अनुरोध करने के लिए डेटा अनुरोध संवाद का उपयोग करें।
फिर "set" पर क्लिक करें और इसे कुछ और सेट करें, और इसे फिर से पढ़ने का प्रयास करें।
वेब क्लाइंट वर्तमान में test.mosquitto.org का उपयोग करने के लिए हार्डकोडेड है, यह भविष्य में बदल जाएगा।
नोड्स को संवाद करने के लिए समय को सिंक करने का कोई तरीका चाहिए। वर्तमान में, यदि उन्होंने कभी किसी विश्वसनीय स्रोत से समय प्राप्त नहीं किया है, तो वे किसी भी यादृच्छिक पैकेट से अपना समय सेट करेंगे जो वे देखते हैं।
यह रीप्ले हमलों की अनुमति देने वाला एक सुरक्षा जोखिम हो सकता है, इसलिए जिन उपकरणों को सुरक्षा की आवश्यकता है, उनके पास एक विश्वसनीय समय स्रोत होना चाहिए।
एक बार समय प्रारंभिक रूप से सेट हो जाने के बाद, कोड अन्य नोड्स के साथ सिंक में रहने के लिए अपने सिस्टम समय को प्रति दिन 1 सेकंड तक समायोजित करेगा, इसलिए सिंक से बाहर बहाव एक बड़ी समस्या नहीं होनी चाहिए।
Lazymesh में, सब कुछ एक चैनल है, कोई सीधे संदेश नहीं हैं। यदि आप उन्हें चाहते हैं, तो बस एक समर्पित निजी चैनल बनाएं।
चैनल एक पासवर्ड द्वारा परिभाषित होते हैं, पासवर्ड जानने से पढ़ने और लिखने की पहुंच मिलती है।
256 रूट नंबर हैं। प्रत्येक पैकेट में एक होता है, और रिपीटर केवल तभी दोहराते हैं जब उन्होंने मिलान रूट नंबर सक्षम किया हो। डिफ़ॉल्ट रूप से, सब कुछ रूट नंबर 0 के साथ भेजा जाता है, जो डिफ़ॉल्ट रूप से सक्षम है।
यह केवल रिपीटर्स को प्रभावित करता है, नोड किसी भी मेश रूट नंबर को सुनेंगे यदि वह सीधे उनके लिए है।
पैकेट पेलोड MessagePack एरे हैं। वे बारी-बारी से पूर्णांक डेटा आईडी और डेटा आइटम रखते हैं। 192-256 एप्लिकेशन-विशिष्ट संदेशों के लिए आरक्षित हैं।
आईडी 32 टेक्स्ट संदेशों के लिए है, जिसे उपयोगकर्ता नाम और कोलन के साथ उपसर्ग किया जा सकता है।
आईडी 2 का उपयोग एक अद्वितीय आईडी के लिए किया जाता है, जो एक पूर्णांक होना चाहिए। कई एप्लिकेशनों को इसकी बिल्कुल आवश्यकता नहीं हो सकती है।
एक मेटाडेटा लंबाई बाइट और N बाइट मेटाडेटा जोड़ें।
IV बनाने के लिए, IV के लिए 12 यादृच्छिक बाइट लें। फिर पूरी चीज़ को एन्क्रिप्ट करें। IV को आगे जोड़ें और 4 ऑथ टैग बाइट जोड़ें।
फिर रूटिंग आईडी हैश के पहले 8 बाइट लें और हेक्स में बदलें।
MQTT टॉपिक lazymesh_route_HEX होगा
ध्यान दें कि हम एक शीर्ष-स्तरीय टॉपिक का उपयोग करते हैं। ऐसा इसलिए है ताकि आप सार्वजनिक ब्रोकरों पर एक साथ सभी lazymesh चैनलों की सदस्यता लेने के लिए वाइल्डकार्ड का उपयोग नहीं कर सकते, जो आपको सभी को आसानी से DoS करने की अनुमति देगा।
224.0.0.251:2221 पर प्रसारित केवल कच्चे पैकेट
इसके बारे में कुछ भी अंतिम नहीं है!!!
सभी संख्याएं लिटिल-एंडियन हैं।
1 बाइट हेडर:
2 बिट पैकेट प्रकार (या तो 1 या 2, इस पर निर्भर करता है कि हम ACK चाहते हैं या नहीं)
3 बिट TTL हॉप शेष
1 बिट धीमी ट्रांसपोर्ट की अनुमति (LoRa आदि)
1 बिट वैश्विक रूटिंग की अनुमति
1 बिट पहले से वैश्विक रूट किया गया
1 बाइट हेडर 2:
1 बिट पहला भेजने का प्रयास:
जब भी हम कोई पैकेट बनाते या प्राप्त करते हैं, तो यह बिट सेट करें। इसे भेजने का प्रयास करने के बाद, साफ़ करें। इस तरह, जब तक हम मानते हैं कि पैकेट हानि कम है, हम अतिरिक्त ओवरहेड के बिना क्षेत्र में रिपीटर्स की गणना कर सकते हैं।
1 बिट रिपीटर बिट:
चिह्नित करता है कि इस पैकेट को रिपीटर्स की गणना करते समय शामिल किया जाना चाहिए।
यदि आप पैकेट या उसके जैसे किसी को दोहराएंगे, भले ही आपने इसे उत्पन्न किया हो, तो इसे सेट करें।
1 बिट रुचि बिट:
यदि यह सेट है, तो भेजने वाला नोड सीधे चैनल में रुचि रखता है, न कि केवल एक रिपीटर। यदि पहला भेजना भी सेट है, तो इसे एक अंतर्निहित ACK के रूप में माना जाता है
1 बिट स्थान सक्षम
यदि यह बिट सेट है, तो रिपीटर इंटरनेट पर अग्रेषित पैकेट में स्थान मेटाडेटा जोड़ सकते हैं। इस मेटाडेटा को रूटिंग आईडी को कुंजी के रूप में उपयोग करके एन्क्रिप्ट किया जाना चाहिए, जिसका अर्थ है कि आस-पास के लोग आपको सीमा से बाहर जाने के 1 घंटे बाद तक ट्रैक कर सकते हैं।
अभी कहीं भी लागू नहीं किया गया है।
5 आरक्षित 0 बिट
1 बाइट मेश रूट नंबर
1 बाइट संचित पथ हानि:
5 बिट कुल
3 बिट अंतिम हॉप
प्रत्येक हॉप पथ हानि का एक बिंदु है,
साथ ही ट्रांसपोर्ट द्वारा लागू कोई अतिरिक्त लागत अनुमान।
1 अतिरिक्त हानि बिंदु मोटे तौर पर वाईफाई पर 10dbm अतिरिक्त हानि के समान "बुराई" होना चाहिए।
16 बाइट रूटिंग आईडी:
हर घंटे बदलता है, हैश द्वारा चैनल PSK से प्राप्त होता है।
PSK पासवर्ड का केवल 16 बाइट SHA256 है।
रूटिंग आईडी प्रति घंटे बदलती है, और इसका SHA256 है:
अक्षर 'cr'
1970 से घंटों की संख्या एक 32 बिट अहस्ताक्षरित int के रूप में
PSK
8 बाइट यादृच्छिक एन्ट्रॉपी:
सिफर के लिए IV के भाग के रूप में उपयोग किया जाता है
4 बाइट टाइमस्टैम्प:
IV का भी भाग, रीप्ले हमलों को भी रोकता है
N बाइट सिफरटेक्स्ट:
AES-GCM एन्क्रिप्टेड।
एन्क्रिप्शन कुंजी प्रति घंटे बदलती है, और इसका SHA256 है:
अक्षर 'c'
1970 से घंटों की संख्या एक 32 बिट अहस्ताक्षरित int के रूप में
PSK
6 बाइट ऑथ टैग:
अंतिम 6 बाइट GCM टैग हैं
कुछ कार्यान्वयन इसे पूरी तरह से अनदेखा करना चुन सकते हैं।
ACKs पूरी तरह से प्रति हॉप हैं जब तक कि कोई उच्च प्रोटोकॉल परत एंड-टू-एंड ACKs नहीं चाहती।
ACK पैकेट दोहराए या रूट नहीं किए जाते, न ही वे प्रमाणित होते हैं। मेश दोहराने के प्रत्येक चरण का अपना स्वीकार होता है, मूल प्रेषक के दृष्टिकोण से, यह फायर एंड फॉरगेट है।
Meshtastic और अधिकांश अन्य की तरह, प्रोटोकॉल "अर्ध-विश्वसनीय" है, सभी नेटवर्कों की तरह, एज केस हैं जो विफलता का कारण बनते हैं।
वास्तविक विश्वसनीयता उच्च स्तर पर की जानी चाहिए।
प्रत्येक पैकेट के लिए, उस विशिष्ट चैनल का प्रत्येक इच्छुक श्रोता ठीक एक बार चैनल स्वीकार भेजता है, जब तक कि वह यह पता नहीं लगाता कि अन्य नोड्स द्वारा पहले ही 8 से अधिक ACK भेजे जा चुके हैं।
यह पैकेट सभी ट्रांसपोर्ट पर भेजा जाना चाहिए, न कि केवल वह जहां से पैकेट आया है, अन्यथा अन्य नोड्स को श्रोताओं की संख्या के बारे में गलत जानकारी मिल सकती है।
जब किसी पैकेट में पहला भेजने का प्रयास बिट और रुचि ध्वज दोनों होते हैं, तो यह एक अंतर्निहित ACK की तरह है। यदि हम पैकेट की एक प्रति भेज रहे हैं, तो हमें खुद को रुचि गणना में जोड़ने के लिए ACK भेजने की आवश्यकता नहीं है।
रिपीटर केवल पैकेट की एक प्रति भेजकर स्वीकार करते हैं, जब इसे पहली प्रति ध्वज के साथ चिह्नित किया जाता है, तो हम इसे गिनते हैं। इस कारण से, वाईफाई जैसे ट्रांसपोर्ट को दोहराना चाहिए भले ही इसका कोई मतलब न हो।
यह वैश्विक रूटिंग ट्रांसपोर्ट पर लागू नहीं होता है, वैश्विक रूटिंग अलग से संभाली जाती है और किसी भी प्रकार के ACK या दोहराव या किसी भी चीज़ के अधीन नहीं है, हम मानते हैं कि MQTT सर्वर सब कुछ संभालता है।
नोड एक संदेश को कुछ बार पुनर्भेज सकते हैं यदि उन्हें अपेक्षित उत्तरों से कम मिलते हैं।
नोड्स को कभी भी 6 से अधिक रिपीटर्स और 6 चैनल श्रोताओं की अपेक्षा नहीं करनी चाहिए, भले ही उन्हें अधिक उत्तर मिलें, क्योंकि सरल ACK योजना मध्यम पैकेट हानि होने पर उससे आगे गलत हो जाती है।
1 बाइट हेडर:
हमेशा 0, पैकेट प्रकार नियंत्रण है, और ये रूट करने योग्य या दोहराने योग्य नहीं हैं
1 बाइट हेडर 2:
डेटा पैकेट के समान। वर्तमान में वास्तव में उपयोग नहीं किया गया है
1 बाइट उपप्रकार:
CONTROL_TYPE_CHANNEL_ACKNOWLEDGE
आप चैनल श्रोता के रूप में स्वीकार कर सकते हैं
ताकि प्रेषक को पता चले कि कितने हैं।
4 बाइट संदेश आईडी:
जिस पैकेट का हम ACK कर रहे हैं, उसके यादृच्छिक IV के पहले 4 बाइट
हर घंटे, घंटे से कुछ मिनट पहले, नोड्स को उन चैनलों की घोषणा भेजनी चाहिए जिनमें वे रुचि रखते हैं।
इसे वर्तमान घंटे के बजाय अगले घंटे के रोलिंग कोड के साथ भेजा जाना चाहिए, ताकि कनेक्शन पहले से स्थापित किए जा सकें और समय सिंक से बाहर होने पर भी सब कुछ काम करे।
नोड ब्लूटूथ के माध्यम से मेश करते हैं, सेवा UUID d1a77e11-420f-9f11-1a00-10a6beef0001 के साथ एक विस्तारित विज्ञापन पैकेट का उपयोग करते हैं, और पेलोड केवल ऊपर दिया गया पैकेट प्रारूप है।
BLE पैकेट में कभी भी "पहली प्रति" ध्वज सेट नहीं होना चाहिए, और हम BLE पर रिपीटर्स की गणना नहीं करते हैं। पैकेट हानि किसी भी सरल और स्केलेबल योजना के लिए बहुत अधिक है जो मैं सोच सकता हूं।
इसलिए, हम इसे स्वाभाविक रूप से हानिकारक चैनल के रूप में मानते हैं, जिसे हम पैकेट को 4 बार तक दोहराकर कुछ हद तक कम करते हैं, या जब तक हमें कुछ अन्य पैकेट भेजने के लिए ऐसा करना बंद करने की आवश्यकता नहीं होती है।
जब तक नोड प्रति सेकंड एक या दो पैकेट से अधिक भेजने का प्रयास नहीं करता, तब तक शुद्ध दोहराव योजना कुछ विश्वसनीयता प्रदान करेगी, और यदि हम उससे आगे जाते हैं, तो यह सब कुछ जाम न करने के लिए पीछे हट जाएगी।
यदि हम उसी क्षेत्र में बहुत सारे अन्य नोड्स देखते हैं जो पैकेट की बहुत सारी प्रतियां भेज रहे हैं, तो हम भेजना भी बंद कर देते हैं।