लेख मुफ्त PBX 
Askozia संस्करण 6 के बारे में बात करेगा। टेलीफोन एक्सचेंज विकसित करते समय, पहले कार्यों में से एक आउटगोइंग कॉल का संगठन था।
कैसा था
अस्कोजिया के पुराने संस्करण में, मानक "डायलप्लान" 
टेम्पलेट्स का उपयोग किया 
गया था।
- एक्स! - सभी फोन नंबर
- XXX - तीन अंकों की संख्या
- ।! - बिल्कुल सभी फोन नंबर
एक संदर्भ का एक उदाहरण योजनाबद्ध रूप से वर्णित किया जा सकता है:
[outgoing] exten => _XXXXXX!,1,NoOp(Start outgoing calling...) same => n,Dial… 
यह हमें लग रहा था कि यह दृष्टिकोण पर्याप्त लचीला नहीं है। निम्नलिखित नियम का वर्णन करने का कोई तरीका नहीं है:
- संख्या 79 से शुरू होती है
- यह 35 या 26 का अनुसरण करता है
- बाकी संख्या 7 अंकों की है
कटौती के तहत, हमारे दृष्टिकोण और विकास के परिणाम का वर्णन किया गया है। 
वर्तमान कार्यान्वयन
हमने 
REGEX का उपयोग करके इस कार्यक्षमता को अलग तरीके से लागू करने का निर्णय लिया।
खाका उदाहरण:
 79(25|26)[1-9]{7} 
- (२५ | २६) २५ या २६ है
- [०- ९] - ० से ९ तक का अंक, पहली या अधिक समय से घटना
- {7} - पिछले चरित्र की घटनाओं की संख्या
REGEX फ़ंक्शन का सिंटैक्स है:
 REGEX("regular expression" string) Return '1' on regular expression match or '0' otherwise 
एस्कोज़िया 6 में उपयोग का एक उदाहरण:
 [outgoing] exten => _X!,1,NoOp(Start outgoing calling...) same => n,Ringing() same => n,ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-1-out,${EXTEN},1)) same => n,ExecIf($["${REGEX("^(7|8)[0-9]{10}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-2-out,${EXTEN},1)) same => n,Hangup() 
आउटगोइंग कॉल के लिए, एक प्रविष्टि बिंदु का आयोजन किया जाता है - " 
आउटगोइंग " संदर्भ, " 
एक्ससीआईएफ " फ़ंक्शन को इसमें कहा जाता है:
 ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"] 
यदि चर " 
$ {EXTEN} " में निर्दिष्ट फोन नंबर पैटर्न से मेल खाता है, तो " 
गोसुब " फ़ंक्शन का उपयोग करके कॉल को 
उप-संदर्भ में रूट किया जाता है।
यदि कॉल को 
उप-संदर्भ में बाधित नहीं किया गया था, तो सेट निम्नलिखित उपयुक्त नियम के अनुसार जाएगा।
इस तरह, हमने एकल-चैनल लाइनों के साथ समस्या को हल किया। यदि रेखा व्यस्त है, तो कॉल अगले उत्तर तक जाती है जब तक कि इसका उत्तर नहीं दिया जाता है।
संदर्भ उदाहरण:
 [SIP-PR-1] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-1/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return [SIP-PR-2] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-2/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return 
अनिवार्य " 
उप " में - संदर्भ " 
डायलस्टस " की जाँच करता है। यदि कॉल का उत्तर दिया जाता है, तो बातचीत के बाद चैनल " 
हैंगअप () " फ़ंक्शन का उपयोग करके समाप्त कर दिया जाएगा। यदि ऐसा नहीं किया जाता है, तो क्लाइंट द्वारा कॉल के अंत में, क्लाइंट नंबर की फिर से डायलिंग हो सकती है।
एक महत्वपूर्ण सूक्ष्मता, " 
गोसुब " या " 
गोटो " का उपयोग करते समय, हम जानबूझकर 
$ {EXTEN} नहीं बदलते हैं। यहां तक कि अगर आपको फोन नंबर (उपसर्ग जोड़ने / हटाने) को संशोधित करने की आवश्यकता है।
तथ्य यह है कि जब 
EXTEN को संशोधित किया जाता है, तो Asterisk 
CDR वैरिएबल 
(dst) के मान को संशोधित करेगा, जिससे CDR कॉल इतिहास तालिका में खराब अनुमानित परिणाम होगा। मुझे लगता है कि किसी कर्मचारी द्वारा डायल किए गए नंबर को रखना इतिहास में महत्वपूर्ण है।
नियमित अभिव्यक्ति का वर्णन करते समय सावधान रहें। वर्ण " 
^ " का उपयोग करें, पंक्ति की शुरुआत और " 
$ " - पंक्ति का अंत, अन्यथा आपको अप्रत्याशित परिणाम मिल सकते हैं।
उदाहरण के लिए, पैटर्न " 
[0-9] {6} " उन सभी नंबरों के अनुरूप होगा जहां 6 या अधिक अंक हैं। पैटर्न " 
^ [0-9] {6} $ " केवल 6-अंकीय संख्याओं से मेल खाता है।
परिणाम
हमें PBX के लिए आउटबाउंड रूटिंग का वर्णन करने के लिए एक लचीला सबसिस्टम मिला।
नियमों की सूची निम्नानुसार प्रदर्शित की गई है:

एक विशिष्ट "नियम" कार्ड का एक उदाहरण:
