Erlang 21 - 4. Internal form and its encodings

4 आंतरिक रूप और इसके एनकोडिंग




erlang

4 आंतरिक रूप और इसके एनकोडिंग

स्टैक के इस संस्करण का अनुपालन होता है:

  • Megaco / H.248 संस्करण 1 (RFC3525) कार्यान्वयन गाइड संस्करण 10-13 के अनुसार अद्यतन किया गया।

  • मेगाको / एच .248 संस्करण 2 जैसा कि ड्राफ्ट-आईटेफ-मेगको-एच 248 वी 2-04 द्वारा परिभाषित किया गया है, कार्यान्वयन गाइड 10-13 संस्करण के अनुसार अद्यतन किया गया है।

  • ITU H.248.1 (09/2005) द्वारा परिभाषित मेगाको / एच .248 संस्करण 3।

4.1 संदेशों का आंतरिक रूप

हम बाइनरी और टेक्स्ट एन्कोडिंग दोनों के लिए एक ही आंतरिक रूप का उपयोग करते हैं। मेगाको / H.248 संदेशों का हमारा आंतरिक रूप ASN.1 एन्कोडर्स / डिकोडर्स द्वारा उपयोग किए जाने वाले आंतरिक प्रारूप से काफी प्रभावित है:

  • "SEQUENCE OF" को एक सूची के रूप में दर्शाया गया है।

  • "CHOICE" को आकार 2 के साथ टैग किए गए टपल के रूप में दर्शाया गया है।

  • "SEQUENCE" को एक रिकॉर्ड के रूप में दर्शाया गया है, जिसे "मेगाको / में शामिल / मेगाको_मेसेज_v1.hr" में परिभाषित किया गया है।

  • "OPTIONAL" को एक रिकॉर्ड में एक साधारण फ़ील्ड के रूप में दर्शाया गया है, जो 'asn1_NOVALUE' को परिभाषित करता है, जिसका अर्थ है कि फ़ील्ड का कोई मूल्य नहीं है।

  • "OCTET STRING" को अहस्ताक्षरित पूर्णांकों की सूची के रूप में दर्शाया गया है।

  • "संवर्धित" को एक एकल परमाणु के रूप में दर्शाया गया है।

  • "BIT STRING" को परमाणुओं की सूची के रूप में दर्शाया गया है।

  • "BOOLEAN" को परमाणु 'सत्य' या 'असत्य' के रूप में दर्शाया गया है।

  • "INTEGER" को पूर्णांक के रूप में दर्शाया गया है।

  • "IA5String" पूर्णांक की एक सूची के रूप में दर्शाया गया है, जहां प्रत्येक पूर्णांक संगत वर्ण का ASCII मान है।

  • "NULL" को परमाणु 'NULL' के रूप में दर्शाया गया है।

आंतरिक रूप को पूरी तरह से समझने के लिए आपको मेगाको / एच .248 प्रोटोकॉल के लिए ASN.1 विनिर्देश पर पकड़ प्राप्त करनी चाहिए, और ऊपर दिए गए नियमों को लागू करना चाहिए। कृपया, ASN.1 और इसी आंतरिक रूप के बीच मैपिंग में शब्दार्थ के अधिक विवरण के लिए ASN.1 संकलक के दस्तावेज को Erlang / OTP में देखें।

निरीक्षण करें कि 'टर्मिनेशन आईडी' रिकॉर्ड का आंतरिक रूप में उपयोग नहीं किया गया है। इसे एक मेगाको_टरम_ड रिकॉर्ड ("मेगाको / शामिल / मेगाकोहल" में परिभाषित किया गया है) से बदल दिया गया है।

4.2 विभिन्न एनकोडिंग

मेगाको / H.248 मानक एक सादा पाठ एन्कोडिंग और एक बाइनरी एन्कोडिंग (ASN.1 BER) दोनों को परिभाषित करता है और हमने दोनों के लिए एनकोडर और डिकोडर लागू किए हैं। हम वास्तव में पांच अलग एन्कोडिंग / डिकोडिंग मॉड्यूल की आपूर्ति करते हैं।

पाठ एन्कोडिंग में, कार्यान्वयनकर्ताओं के पास छोटे और लंबे खोजशब्दों के मिश्रण का उपयोग करने का विकल्प होता है। पठनीयता में सुधार के लिए सफेद रिक्त स्थान को जोड़ना भी संभव है। हम कम से कम संभव कीवर्ड और कोई वैकल्पिक सफेद रिक्त स्थान के साथ पाठ संदेशों के लिए कॉम्पैक्ट शब्द का उपयोग करते हैं, और लंबे कीवर्ड का उपयोग करते हुए अच्छी तरह से इंडेंट किए गए टेक्स्ट प्रारूप के लिए सुंदर शब्द और मेगैको / एच .248 विनिर्देश में पाठ उदाहरणों की तरह एक इंडेंटेशन शैली)।

पाठ संदेशों के सुंदर और कॉम्पैक्ट संस्करणों के बीच अंतर की भावना देने के लिए एक पाठ संदेश का एक उदाहरण इस प्रकार है। लंबे कीवर्ड के साथ पहले सुंदर, अच्छी तरह से इंडेंटेड संस्करण:

MEGACO/1 [124.124.124.222]
Transaction = 9998 {
        Context = - {
                ServiceChange = ROOT {
                        Services {
                                Method = Restart,
                                ServiceChangeAddress = 55555,
                                Profile = ResGW/1,
                                Reason = "901 Cold Boot"
                        }
                }
        }
}    

फिर इंडेंटेशन के बिना और छोटे कीवर्ड के साथ कॉम्पैक्ट संस्करण:

 
!/1 [124.124.124.222]
T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 Cold Boot"}}}}    

और प्रोग्रामर एक ही संदेश को देखते हैं। पहले ActionRequest रिकॉर्ड की एक सूची बनाई जाती है और फिर इसे एपीआई में भेजे गए कार्यों में से एक के साथ भेजा जाता है:

Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
                            serviceChangeAddress = {portNumber, 55555},
                            serviceChangeReason  = "901 Cold Boot",
                            serviceChangeProfile = Prof},
Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
                              serviceChangeParms = Parm},
Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
                            commandRequests = {serviceChangeReq, Req}}],
megaco:call(ConnHandle, Actions, Config).    

और अंत में पूरे आंतरिक रूप का प्रिंट-आउट:

{'MegacoMessage',
 asn1_NOVALUE,
 {'Message',
  1,
  {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
  {transactions,
   [
    {transactionRequest,
     {'TransactionRequest',
       9998,
       [{'ActionRequest',
         0,
         asn1_NOVALUE,
         asn1_NOVALUE,
         [
          {'CommandRequest',
           {serviceChangeReq,
            {'ServiceChangeRequest',
             [
              {megaco_term_id, false, ["root"]}],
              {'ServiceChangeParm',
               restart,
               {portNumber, 55555},
               asn1_NOVALUE,
               {'ServiceChangeProfile', "resgw", version = 1},
               "901 MG Cold Boot",
               asn1_NOVALUE,
               asn1_NOVALUE,
               asn1_NOVALUE
              }
            }
           },
           asn1_NOVALUE,
           asn1_NOVALUE
          }
         ]
        }
       ]
     }
    }
   ]
  }
 }
}     

निम्नलिखित एन्कोडिंग मॉड्यूल प्रदान किए जाते हैं:

  • megaco_pretty_text_encoder - सुंदर पाठ प्रारूप में संदेश सांकेतिक शब्दों में बदलना, दोनों सुंदर और साथ ही कॉम्पैक्ट पाठ।

  • megaco_compact_text_encoder - कॉम्पैक्ट पाठ प्रारूप में संदेशों को एन्कोड करता है, दोनों सुंदर और साथ ही कॉम्पैक्ट पाठ को डिकोड करता है।

  • megaco_binary_encoder - एन्कोड / डीकोड ASN.1 BER संदेश। यह एनकोडर बीईआर एनकोडर / डिकोडर्स के सबसे तेज को लागू करता है। अनुशंसित बाइनरी कोडेक।

  • megaco_ber_encoder - एन्कोड / डीकोड ASN.1 BER संदेश।

  • megaco_per_encoder - एन्कोड / डीकोड ASN.1 प्रति संदेश। एनबी कि यह प्रारूप मेगाको मानक में शामिल नहीं है।

  • megaco_erl_dist_encoder - Erlangs वितरण प्रारूप में संदेशों को एन्कोड करता है। यह बल्कि क्रिया है लेकिन एन्कोडिंग और डिकोडिंग तेजी से अंधा कर रही है। एनबी कि यह प्रारूप मेगाको मानक में शामिल नहीं है।

4.3 Erlang वितरण एन्कोडिंग मॉड्यूल का कॉन्फ़िगरेशन

Megaco_erl_dist_encoder मॉड्यूल की एन्कोडिंग_कॉन्फ़िग इनमें से एक हो सकती है:

  • [] - मानक वितरण प्रारूप के लिए संदेश एन्क्रिप्ट करता है। यह बल्कि क्रिया है लेकिन एन्कोडिंग और डिकोडिंग तेजी से अंधा कर रही है।

  • [megaco_compressed] - आंतरिक परिवर्तन के बाद मानक वितरण प्रारूप में संदेशों को [megaco_compressed] । यह कम क्रिया है, लेकिन दूसरी ओर एन्कोडिंग और डिकोडिंग का कुल समय कुछ धीमा होगा (अधिक जानकारी के लिए performance अध्याय देखें)।

  • [{megaco_compressed, Module}] - मेगाकॉम्प्रेसड कॉन्फिगर पैरामीटर की तरह ही काम करता है, केवल यहाँ उपयोगकर्ता अपना कंप्रेस मॉड्यूल प्रदान करता है। इस मॉड्यूल को megaco_edist_compress व्यवहार को लागू करना चाहिए।

  • [compressed] - संदेश को मानक वितरण प्रारूप के संकुचित रूप में एन्क्रिप्ट करता है। यह कम क्रिया है, लेकिन दूसरी ओर एन्कोडिंग और डिकोडिंग धीमी होगी।

4.4 पाठ एन्कोडिंग मॉड्यूल का विन्यास

टेक्स्ट एन्कोडिंग (एस) का उपयोग करते समय, वास्तव में दो अलग-अलग कॉन्फ़िगरेशन हैं जो नियंत्रित करते हैं कि किस सॉफ्टवेयर का उपयोग किया जाए:

  • [] - एक खाली सूची इंगित करती है कि एर्लैंग स्कैनर का उपयोग किया जाना चाहिए।

  • [{flex, port()}] - डिकोडिंग (एसएमपी के लिए अनुकूलित नहीं) करते समय फ्लेक्स स्कैनर का उपयोग करें। अधिक जानकारी के लिए initial configuration देखें।

  • [{flex, ports()}] - डिकोडिंग (एसएमपी के लिए अनुकूलित) करते समय फ्लेक्स स्कैनर का उपयोग करें। अधिक जानकारी के लिए initial configuration देखें।

फ्लेक्स स्कैनर एक मेगाको स्कैनर है जिसे ड्राइवर (सी) में लिंक के रूप में लिखा जाता है। इस काम को करने के दो तरीके हैं:

  • मेगाको स्टैक को फ्लेक्स स्कैनर (ड्राइवर लोड करें) शुरू करें।

    ऐसा करने के लिए मेगाको स्टैक को कॉन्फ़िगर करना होगा:

    • मेगाको ऐप के लिए एर्लांग सिस्टम कॉन्फिगर फ़ाइल के लिए {scanner, flex} (या समान) निर्देश जोड़ें (विवरण के लिए initial configuration अध्याय देखें)।

    • Item = text_config फ़ंक्शन ( Item = text_config ) का उपयोग करके एन्कोडिंग-कॉन्फ़िगरेशन को पुनः प्राप्त करें।

    • एन्कोडिंग-कॉन्फ़िगरेशन ( encoding_config फ़ील्ड) के साथ प्राप्त हैंडल को अपडेट करें।

    इसका लाभ यह है कि मेगाको ड्राइवर और पोर्ट की शुरुआत, होल्डिंग और पर्यवेक्षण का प्रबंधन करता है।

  • मेगाको क्लाइंट (उपयोगकर्ता) फ्लेक्स स्कैनर (ड्राइवर लोड करें) शुरू करता है।

    फ्लेक्स स्कैनर शुरू करते समय ड्राइवर में लिंक किए गए पोर्ट को बनाया जाता है। इस पोर्ट पर एक प्रक्रिया का स्वामित्व होना चाहिए। इस प्रक्रिया को मरना नहीं चाहिए। यदि यह करता है तो बंदरगाह भी समाप्त हो जाएगा। वजह:

    • एक स्थायी प्रक्रिया बनाएँ। सुनिश्चित करें कि इस प्रक्रिया की निगरानी की जाती है (ताकि यदि यह मर जाए, तो इस पर ध्यान दिया जाएगा)।

    • इस प्रक्रिया को megaco_flex_scanner:start/0,1 फ़ंक्शन को कॉल करके फ्लेक्स स्कैनर megaco_flex_scanner:start/0,1

    • एन्कोडिंग-कॉन्फ़िगरेशन को पुनः प्राप्त करें और जब megaco_receive_handle शुरुआत करें, तो फ़ील्ड encoding_config तदनुसार सेट करें।

    • परिवहन मॉड्यूल के लिए megaco_receive_handle पास करें।

4.5 द्विआधारी एन्कोडिंग मॉड्यूल का विन्यास

बाइनरी एन्कोडिंग का उपयोग करते समय, समाप्ति आईडी की संरचना को निर्दिष्ट करने की आवश्यकता है।

  • [native] - परिवर्तन के चरण को रोक देता है, अर्थात डिकोड किया हुआ संदेश हमारे आंतरिक रूप में परिवर्तित नहीं होगा।

  • [integer()] - प्रत्येक स्तर के आकार (बिट्स की संख्या) वाली एक सूची। उदाहरण: [3,8,5,8]

  • integer() - एक बाइट (8 बिट) के स्तर की संख्या। NB यह वर्तमान में पिछले कॉन्फ़िगरेशन में परिवर्तित हो गया है। उदाहरण: 3 ( [8,8,8] )।

4.6 हैंडलिंग मेगा संस्करण

चूंकि संस्करण 3 कार्यान्वित किया गया है, मेगाको एप्लीकेशन के इस संस्करण में, प्रारंभिक है, इसलिए विभिन्न संस्करण 3 कार्यान्वयन को संभालने का एक तरीका होना आवश्यक है। इस कारण एन्कोडिंग कॉन्फ़िगरेशन विकल्प {version3, version3()} पेश किया गया है। यह विकल्प, यदि मौजूद है, तो एन्कोडिंग कॉन्फ़िगरेशन सूची में पहले स्थान पर होना चाहिए। संस्करण 1 और 2 कोडेक इस विकल्प को अनदेखा करते हैं, यदि मिला।

version3() -> prev3a | prev3b | prev3c | v3    
  • prev3a

    टीडी -33 पर आधारित प्रारंभिक संस्करण 3

  • prev3b

    प्रारंभिक संस्करण 3, टीडी -33 पर आधारित है, लेकिन contextProperty में प्राथमिकता के लिए अंतिम समाधान के साथ अद्यतन किया गया पाठ एन्कोडिंग (जो कि v2 के साथ पीछे संगत है)।

  • prev3c

    प्रारंभिक संस्करण 3, v3- मानक के अंतिम संस्करण पर आधारित है, लेकिन खंडों को छोड़कर !

  • v3

    पूर्ण संस्करण 3. विभाजन सहित। यह डिफ़ॉल्ट संस्करण 3 संस्करण है (अर्थात यदि संस्करण 3 संदेशों को एन्कोडेड / डिकोड किया जाना है और कोई संस्करण 3 एन्कोडिंग कॉन्फ़िगरेशन नहीं मिला है, तो v3 मान लिया गया है)।

विभिन्न मेगाको एन्कोडिंग संस्करणों को संभालने के दो तरीके हैं। या तो डायनामिक वर्जन डिटेक्शन (केवल इनकमिंग मैसेज के लिए मान्य) या कनेक्शन जानकारी में स्पष्ट वर्जन सेटिंग का उपयोग करके।

आने वाले संदेशों के लिए:

  • गतिशील संस्करण का पता लगाने

    मेगाकोरेसिव_हैंडल में dynamic (यह डिफ़ॉल्ट है) में प्रोटोकॉल संस्करण सेट करें।
    यह उन कोडेक्स के लिए काम करता है जो संस्करण के आंशिक डिकोड का समर्थन करते हैं, वर्तमान में टेक्स्ट और बेर_बिन ( megaco_binary_encoder और megaco_ber_bin_encoder )।
    इस तरह से डिकोडर यह पता लगा लेगा कि कौन सा संस्करण प्रयोग किया गया है और फिर उचित डिकोडर का उपयोग करें।

  • स्पष्ट संस्करण

    स्पष्ट रूप से वास्तविक प्रोटोकॉल संस्करण को megaco_receive_handle में सेट करें।
    संस्करण 1 से शुरू करें। जब प्रारंभिक सेवा परिवर्तन किया गया है और संस्करण 2 पर बातचीत की गई है, तो परिवहन की megaco_receive_handle (control_pid) संस्करण 2 में megaco_udp megaco_udp megaco_tcp और megaco_udp देखें।
    ध्यान दें कि यदि udp का उपयोग किया जाता है, तो एक ही परिवहन प्रक्रिया का उपयोग कई कनेक्शनों के लिए किया जा सकता है। इससे उन्नयन असंभव हो सकता है।
    कोडेक्स के लिए जो संस्करण के आंशिक डिकोड का समर्थन नहीं करता है, वर्तमान में megaco_ber_encoder , megaco_per_encoder और megaco_per_bin_encoder , dynamic संस्करण 1 पर वापस आ जाएगा।

आउटगोइंग संदेशों के लिए:

  • कनेक्शन जानकारी प्रोटोकॉल_version को अपडेट करें।

  • विकल्प में आइटम {protocol_version, integer()} प्रोटोकॉल_version {protocol_version, integer()} जोड़कर एक संदेश भेजते समय प्रोटोकॉल संस्करण को ओवरराइड करें। call या cast देखें।
    ध्यान दें कि यह उन संदेशों को प्रभावित नहीं करता है जो स्टैक द्वारा स्वायत्त रूप से भेजे जाते हैं। वे कनेक्शन जानकारी के प्रोटोकॉल_version का उपयोग करते हैं।

4.7 एनकोडर कॉलबैक फ़ंक्शन

एन्कोडर कॉलबैक इंटरफ़ेस megaco_encoder व्यवहार द्वारा परिभाषित किया गया है, megaco_encoder देखें।