हालांकि यह कहना उचित है कि XML वर्बोज़ है, जिसे इस जागरूकता के साथ सम्मिलित होना चाहिए कि यह क्रियाशीलता सामग्री के संबंध में "ओवरहेड" नहीं है क्योंकि यह शब्दार्थ को सम्मिलित करता है; यह ओवरहेड है जो किसी भी प्रोटोकॉल का रोगसूचक है जो स्थिर संरचना के विपरीत एक गतिशील पर जोर देता है। उदाहरण के लिए, HTML वास्तव में XML का एक सुकून भरा रूप है जो एक गतिशील संरचना, संरचना के साथ सामग्री को व्यक्त करता है जिसे सामग्री का एक पहलू माना जा सकता है। आप तालिका से एक तालिका की सामग्री को अलग कर सकते हैं, लेकिन यह तथ्य कि सामग्री विशिष्ट संबंधों के साथ सारणीबद्ध डेटा है, सामग्री का अभिन्न अंग है; अगर मैंने प्रत्येक सेल लिया और यह सब एक लंबी स्ट्रिंग के रूप में प्रसारित किया, तो वह संरचना और वे संबंध समाप्त हो गए हैं, और इसलिए मैंने जानकारी खो दी है और क्या यह सामग्री नहीं है?
आइए एक 8 बाइट संदेश पर विचार करें जो कुछ टैबलर डेटा का गठन कर सकता है। यदि मैं एक बहुत ही स्थिर प्रोटोकॉल का उपयोग करता हूं, तो मैं न्यूनतम रूप से इस तरह के प्रोटोकॉल को परिभाषित करके कोई अतिरिक्त ओवरहेड के साथ संचारित कर सकता हूं:
- प्रत्येक संदेश ठीक 8 बाइट्स है, इसलिए हमें लंबाई को इंगित करने या किसी भी समाप्ति अनुक्रम को शामिल करने की आवश्यकता नहीं है।
- आठ बाइट्स हमेशा एक 2 x 2 ग्रिड को संदर्भित करने के लिए लिए जाते हैं जहां प्रत्येक सेल में 16-बिट मान होता है।
यदि मेरे सभी संदेश बिल्कुल उसी तरह हैं, तो XML, HTML या XMPP का उपयोग करना मूर्खतापूर्ण माना जा सकता है - मैं संरचनात्मक घटकों पर बैंडविड्थ को बर्बाद कर रहा हूं जो हमेशा समान और पूर्वनिर्धारित होते हैं, और इसे बनाने और पार्स करने वाले दोनों सिरों पर संगत गणना समय बर्बाद कर रहे हैं। एक न्यूनतम, उचित HTML पृष्ठ जिसमें प्रत्येक कक्ष में कुछ वर्णों के साथ सिर्फ एक 2 x 2 तालिका है, शायद स्वरूपण और प्रोटोकॉल ओवरहेड को समायोजित करने के लिए कम से कम 100 बाइट्स होने जा रहा है।
हालांकि, यदि मेरे सभी संदेश ठीक नहीं हैं, तो यह निर्दिष्ट करना कि यह किस प्रकार का संदेश है, "पेलोड" का शाब्दिक हिस्सा नहीं हो सकता है, लेकिन यह एक आवश्यक घटक है, सामग्री-वार। मैं बस एक अतिरिक्त दो बाइट्स के साथ ऐसा कर सकता हूं और बहुत अधिक गतिशीलता ला सकता हूं:
- संदेश अब चर लंबाई, 0-255 बाइट्स हैं, और पहली बाइट लंबाई इंगित करता है।
- विभिन्न पूर्वनिर्धारित संदेश प्रकारों के लिए (ऊपर) 256 कोड हैं, जिनमें से एक "2 x 2 तालिका" है, जो दूसरा बाइट है।
अब टेबल सामग्री के मेरे 8 बाइट्स को ओवरहेड के 2 बाइट्स की आवश्यकता होती है, लेकिन इस कस्टम प्रोटोकॉल के साथ किस प्रकार के संदेश भेजे जा सकते हैं, इसके संदर्भ में संभावनाओं की एक व्यापक रेंज है।
यह अभी भी एक HTML पृष्ठ या XML नाम स्थान विनिर्देश की संभावनाओं के करीब है (या इसके सेट, जो कि XMPP अनिवार्य रूप से है )।
तो, उसके आधार पर, यदि आप जो भी कर रहे हैं, वह सरल 8 बाइट संदेश भेज रहा है, तो XMPP शायद ओवरकिल है। हालांकि, जरूरी नहीं कि इतना ही। दावा है कि "एक एकल अनुरोध / प्रतिक्रिया एक्सचेंज एक आईओटी कनेक्टेड डिवाइस से डेटा को एक बाइट भेजने के लिए 0.5 kB से अधिक है" मुझे लगता है, प्रासंगिक RFC पर नज़र रखना , एक संभावित अतिशयोक्ति (लेकिन नायब, सभी) मैंने किया था कि मैं इसे देख रहा हूं, मैंने कभी भी एक्सएमपीपी को लागू नहीं किया है या उपयोग नहीं किया है)। मुझे संदेह नहीं है कि आप इस तरह के एक उदाहरण का निर्माण कर सकते हैं, लेकिन यह शायद एक न्यूनतम उदाहरण नहीं है ।
चूंकि प्रोटोकॉल टीसीपी ओरिएंटेड है, इसलिए "जैबर: क्लाइंट 'नेमस्पेस द्वारा योग्य एक्सएमएल स्ट्रीम स्थापित करना" केवल संदेश का हिस्सा माना जाना चाहिए, अगर हम एक बंद चीजें कर रहे हैं - डिवाइस एक सर्वर से 8 बाइट भेजने के लिए संपर्क करता है, भेजता है " डेटा, डिस्कनेक्ट करता है। यदि संबंध अधिक स्थायी है, जो अक्सर एक IoT संदर्भ में होता है, तो हम यह मान सकते हैं कि डिवाइस पहले से ही गंतव्य के लिए एक स्थापित कनेक्शन है। इस स्थिति में, यदि संदेश का अंतिम गंतव्य सर्वर है (किसी अन्य क्लाइंट के विपरीत सर्वर संदेश को पास करने जा रहा है), तो प्रोटोकॉल ओवरहेड संभवतः न्यूनतम है।
<message><body>8 bytes.</body></message>
"ओवरहेड" का एक औसत रूप से 33 बाइट्स। यहां यह इंगित करने योग्य है कि XML पाठ है, और इसलिए यदि आपके संदेश अक्सर द्विआधारी होते हैं, तो यह बहुत कम उपयुक्त होने जा रहा है, क्योंकि उस डेटा को इनकोड किया जाना चाहिए (जैसे, बेस 64 ), जो आगे उपरि और कम्प्यूटेशनल जोड़ता है आवश्यकताओं।
तो, अंततः:
क्या XMPP में IoT उपकरणों के लिए एक बड़ा ओवरहेड है, जो छोटे, लगातार संदेश भेज रहा है?
यदि कोई लगातार कनेक्शन है और संदेश काफी हद तक असंरचित हैं, तो मुझे नहीं लगता। हालांकि, अगर आपको इसकी आवश्यकता नहीं है कि यह क्या है (संरचना के संबंध में गतिशीलता), तो संभवतः अधिक उपयुक्त तरीके हैं।
इसके कारण, यदि हमारे पास एक संदर्भ है जहां एक एकल केंद्रीय सर्वर विभिन्न उपकरणों के बीच संदेशों को संसाधित और / या भरोसा कर रहा है, भले ही उन उपकरणों में से कोई एक जो हमेशा कर रहा है वह सरल और सीधा हो सकता है, एक प्रोटोकॉल जो एक एनकैप्सलेट कर सकता है संदेशों की विविधता अभी भी उपयोगी होगी। यदि किसी क्लाइंट डिवाइस में सीमित संसाधन हैं, तो हम बहुत सारे प्रोटोकॉल को हार्डकोड कर सकते हैं, और उस छोर से प्रत्येक संदेश को लपेटना एक बहुत ही सरल कार्य बन जाता है; मेरा मानना है कि कई HTTP उपकरण जो HTTP सर्वर को तैनात करते हैं, वे करते हैं (जो "सरल क्लाइंट, जटिल सर्वर" का उलटा है)। वे सर्वर किसी भी प्रकार के HTTP रिक्वेस्ट को नहीं संभाल सकते हैं (पूर्वनिर्मित अस्वीकृति को छोड़कर) और उनके पास बहुत अच्छी तरह से परिभाषित, केंद्रित चीजें हैं जो वे करेंगे और प्रतिक्रियाएं जो वे भेजेंगे, लेकिन चूंकि वे HTTP सर्वर के रूप में सही ढंग से कार्य नहीं करते हैं,