Asterisk पर आधारित कॉर्पोरेट PBX

आवश्यक शर्तें

किसी भी बड़ी विकासशील कंपनी के जीवन में, जल्द या बाद में टेलीफोन एक्सचेंज की क्षमताओं का विस्तार करने और शास्त्रीय टेलीफोनी से आईपी तक संक्रमण का सवाल उठता है।

2011 के दूर के वसंत में, हमारी कंपनी को भी निम्नलिखित प्रश्न का सामना करना पड़ा, क्योंकि बाहरी और आंतरिक लाइनों को लगातार विस्तार की आवश्यकता होती है, और पुराने पैनासोनिक KX-TA624 पर बंदरगाहों की संख्या को सांख्यिकीय रूप से सेट किया गया था और इसका विस्तार नहीं किया जा सका। अन्य शहरों में कार्यालय खोलना और अन्य शहरों में एकीकृत ग्राहक सेवा की शुरूआत ने भी गुणात्मक परिवर्तनों के लिए धक्का दिया।

संदर्भ की शर्तें

अंतिम उत्पाद में निम्नलिखित विशेषताएं होनी चाहिए:
1) बाहरी और आंतरिक रेखाओं की एक बड़ी संख्या (हमारे मामले में, कम से कम 100) है और विस्तार के लिए तैयार है;
2) व्यावसायिक घंटों के दौरान उपयोगकर्ताओं को अभिवादन करने में सक्षम होना चाहिए और रिपोर्ट करना चाहिए कि उन्होंने गैर-कामकाजी घंटों के दौरान फोन किया था जब कोई भी जगह नहीं है;
3) कॉल फॉरवर्डिंग टाइमआउट जब जवाब / व्यस्त / अनुपलब्ध को व्यक्तिगत रूप से कॉन्फ़िगर नहीं किया जाना चाहिए;
4) कतारें प्रदान की जानी चाहिए। कतार - संख्याओं का एक समूह, जिसके भीतर कॉल का वितरण कुछ नियमों के अनुसार होता है;
5) संदेश लॉग रिकॉर्ड करें (पाठ और ऑडियो दोनों);
6) बाहरी कॉल के अधिकारों के वितरण के लिए एक लचीली नीति है। उपयोगकर्ताओं को प्रदान किया जाना चाहिए जो केवल एक्सटेंशन नंबर कॉल कर सकते हैं; शहर की संख्या के लिए; किसी भी संख्या में;
7) दिन के समय के आधार पर, एक या दूसरे नंबर पर कॉल करें।

बुरा अनुभव

प्रारंभिक पसंद प्लैनेट ipx-1900 पर गिरी। विनिर्देशों यहाँ पाया जा सकता है:
www.planet.com.ru/en/product/product_keyf.php?id=18500

अन्य बातों के अलावा, समर्थन घोषित है:
• ऑटोइन्फ़ॉर्मर (AA)
• इंटरएक्टिव वॉयस रिस्पांस (आईवीआर)
• कॉल डिटेल रिपोर्ट (सीडीआर)

व्यवहार में, इनमें से कोई भी पैरामीटर काम नहीं करता है। ग्रह के समर्थन ने सवालों की अनदेखी की। मानक साधनों से इस पर 8800 लोहा प्राप्त करना असंभव था।

मुझे और गहरा लेना था। इस पीबीएक्स पर एक कॉम-पोर्ट और टेलनेट होता है, जब कनेक्ट होता है, जिसमें लॉगिन और पासवर्ड का अनुरोध किया जाता है। ग्रह के तकनीकी समर्थन ने लॉगिन विवरण प्रदान करने से इनकार कर दिया ... और अधिक सटीक रूप से, अनुरोध को अनदेखा कर दिया। डिवाइस के लिए फर्मवेयर वाला पृष्ठ यहां पाया जा सकता है:
planet.com.ru/en/support/download2.php?id=18500&file_type=65&prod_model=IPX-1900

फर्मवेयर एक संग्रह से ज्यादा कुछ नहीं निकला:
$ mkdir untar && cd untar && tar xvf ../FW-IPX1900_1.16.8.dat rootfs.jffs2 vmImage start_install.sh aimage.tar.gz 


सबसे दिलचस्प था start_install.sh - यह स्क्रिप्ट डिवाइस को फर्मवेयर डाउनलोड करने के तुरंत बाद निष्पादित की जाती है। लाइन के तुरंत बाद:
 #!/bin/sh 

लाइन जोड़ें:
 useradd -groot -proot toor 


हम सब कुछ संग्रह में वापस पैक करते हैं और फर्मवेयर को स्टेशन पर डाउनलोड करते हैं।

यदि सबकुछ ठीक हो जाता है, तो कॉम-पोर्ट या टेलनेट के माध्यम से स्टेशन पर लॉग इन करना संभव होगा।
Ixक्लिनक्स को एस्टेरिक्स 1.4 के साथ अंदर खोजा गया था

और स्टेशन का डोपिंग काम करने लगा। हम परिवर्तनों की सूची पोस्ट नहीं करेंगे, क्योंकि यह अब तक, अनियमित रूप से खो गया है।

स्टेशन के कंसोल तक पहुंचने के लिए धन्यवाद, तकनीकी विशिष्टताओं के p.1-4 को लागू करना संभव था। और स्टेशन पर जोड़ें 8800, जो भी बुरा नहीं है, यदि नहीं:
1) स्टेशन और बाहरी बंदरगाहों की लगातार लटकी हुई;
2) रात में दैनिक स्टेशन रिबूट;
3) कई बार, रिबूट के बाद, स्टेशन अस्थायी सर्वर के साथ सिंक्रनाइज़ नहीं हो सकता है, और इसने ग्राहकों को सूचित किया कि समय काम नहीं कर रहा था, हालांकि वास्तव में समय काम कर रहा था।

हालाँकि, इस रूप में, टेलिफोनी लगभग डेढ़ साल तक रैगटाइम में मौजूद रही। फिर भी, तकनीकी कार्य को पूरा करने के सपने को पूरा करने के विषय पर नेतृत्व ने तकनीकी सहायता (हां, यह तकनीकी सहायता थी) को जारी रखा और तकनीकी सहायता का जन्म हुआ।

लोहा

ग्रह से एक नियमित सर्वर में संक्रमण के समय, निपटान में था:
1) कई ग्रह ata-150s वॉयस गेटवे (2 fxs पोर्ट);
2) लिंक स्पा -३००० (१ एफएक्सओ + १ एफएक्स पोर्ट) - २ टुकड़े;
3) एनालॉग फोन (पैनासोनिक विरासत) का एक गुच्छा;
4) वीओआईपी फोन dlink-dph150s, dlink-dph150se;
5) डेबियन ओएस के साथ सर्वर;
6) वृद्धि रक्षक, मुड़ जोड़ी, स्विच :)

लोहे की विषयवार समीक्षा

वीओआईपी dlink अच्छी तरह से काम करते हैं। व्यावहारिक रूप से कोई जमाव नहीं है। एक शादी के साथ कई मॉडल थे, लेकिन उन्हें नए लोगों के साथ सवाल के बिना बदल दिया गया था।

लिंक्स खराब नहीं है। कभी-कभी फ्रीज़ होता है, और न ही आवाज गेटवे खुद लटकाता है, लेकिन उस पर एफएक्सओ पोर्ट। दुर्भाग्य से, यह केवल ग्राहकों के अनुरोध पर पाया जाता है।

ग्रह अता-150 s - बुरा। बहुत बार फ्रीज होते हैं, समय-समय पर हैंडसेट में शोर होते हैं। केवल रिबूट मदद करता है। उन्हें एक पैक में खरीदा गया था - इसलिए आपको जो काम करना है, वह करना होगा।

तारांकन चिह्न स्थापित करें

दुर्भाग्य से, डेबियन पर तारांकन स्थापना लॉग सहेजा नहीं गया था। इसलिए, Ubuntu 12.04 के लिए स्थापना निर्देश लेख के लिए अनुवादित किया जाएगा। द्वारा और बड़े पैमाने पर, बहुत कम अंतर होना चाहिए, उदाहरण के लिए, एस्टरिस्क 1.8 मुख्य डेबियन रिपॉजिटरी में शामिल नहीं है, लेकिन यह बैकपोर्ट में है।

काम के लिए, हम निम्नलिखित पैकेजों का उपयोग करते हैं:
1 तारांकन - तारांकन चिह्न 1.8
2 लिबास्टरिस्क-एगी-पर्ल - एजीआई मॉड्यूल पर्ल के लिए। इसके बारे में बाद में।
3 तारांकन चिह्न- Asterisk एक्सटेंशन जो आपको पाठ फ़ाइल में नहीं, बल्कि डेटाबेस में आँकड़े संग्रहीत करने की अनुमति देता है

 $ sudo aptitude install asterisk libasterisk-agi-perl asterisk-mysql mysql-server 


लॉग सेटिंग्स को कॉल करें

1) डेटाबेस की जड़ से, एक नया डेटाबेस और उपयोगकर्ता बनाएँ:
 CREATE DATABASE astr; GRANT ALL PRIVILEGES ON astr.* TO 'asterisk'@'localhost' IDENTIFIED BY 'super-pass' WITH GRANT OPTION; EXIT; 


2) हम सिर्फ बनाए गए उपयोगकर्ता के तहत जाते हैं:
 $ mysql -uasterisk -psuper-pass astr 


3) एक तालिका बनाएँ:
 CREATE TABLE `cdr` ( `calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `clid` varchar(80) NOT NULL DEFAULT '', `src` varchar(80) NOT NULL DEFAULT '', `dst` varchar(80) NOT NULL DEFAULT '', `dcontext` varchar(80) NOT NULL DEFAULT '', `channel` varchar(80) NOT NULL DEFAULT '', `dstchannel` varchar(80) NOT NULL DEFAULT '', `lastapp` varchar(80) NOT NULL DEFAULT '', `lastdata` varchar(80) NOT NULL DEFAULT '', `duration` int(11) NOT NULL DEFAULT '0', `billsec` int(11) NOT NULL DEFAULT '0', `disposition` varchar(45) NOT NULL DEFAULT '', `amaflags` int(11) NOT NULL DEFAULT '0', `accountcode` varchar(20) NOT NULL DEFAULT '', `userfield` varchar(255) NOT NULL DEFAULT '', KEY `calldate` (`calldate`), KEY `dst` (`dst`), KEY `accountcode` (`accountcode`) ); EXIT; 


4) तारांकित विन्यास की सूची पर जाएं (सभी अतिरिक्त कार्यों को सुपर-उपयोगकर्ता की ओर से निष्पादित किया जाना चाहिए) और सभी मामलों की एक प्रति बनाएं:
 # cp -r ../asterisk/ ~/asterisk_config # echo '' > cdr_mysql.conf && mcedit cdr_mysql.conf 

हमारे साथ इसका रूप है:
 [global] hostname=localhost dbname=astr table=cdr password=super-pass user=asterisk [columns] alias start => calldate 


Cdr.conf कॉन्फ़िगरेशन अपरिवर्तित रहा है।

आउटगोइंग कॉल उपयोगकर्ता और संदर्भ

उपयोगकर्ताओं के आउटगोइंग कॉल के लिए, हमारे पास 4 संदर्भ हैं:
1 phone_int - डिफ़ॉल्ट मान। जिन उपयोगकर्ताओं को केवल आंतरिक 3-अंकीय संख्याओं को कॉल करने की अनुमति है।
2 फोन_लोक - उपयोगकर्ता 7-अंकीय इंट्रा-सिटी नंबर पर कॉल कर सकते हैं;
3 phone_long_d - इन उपयोगकर्ताओं को देश के भीतर कॉल की अनुमति है;
4 phone_too_long_d - अंतर्राष्ट्रीय कॉल।

संदर्भ एक दूसरे में शामिल हैं, अर्थात phone_too_long_d उपयोगकर्ताओं को कर्मचारियों की आंतरिक संख्या और शहर के भीतर दोनों को कॉल करने की अनुमति है।

आइए शुरू:

1) चलो sip.conf को कई में तोड़ते हैं:
 # mcedit sip.conf #include sip_general.conf #include sip_trunk.conf #include sip_internal.conf 


sip_general.conf - तारांकन के लिए मुख्य सेटिंग्स।
sip_internal.conf - उपयोगकर्ताओं की आंतरिक संख्या;
sip_trunk.conf - बाहरी लाइनें;

2) sip_internal.conf में 3 नंबर सेट करने का उदाहरण:

 [defaults](!) type = friend qualify = yes ;    ; ,     context = phone_int canreinvite = no host = dynamic callgroup = 1 pickupgroup = 1 [101](defaults) secret = pass_for_reception callerid = "Sveta"<101> context = phone_long_d [112](defaults) secret = pass_for_artur callerid = “Artur"<112> context = phone_local [106](defaults) secret = pass_for_fax callerid = "Fax"<106> context = phone_too_long_d [495](defaults) secret = pass_msk callerid = "MSK"<495> 


उपयोगकर्ता 101 को रूस के भीतर कॉल की अनुमति है (संदर्भ = phone_long_d); उपयोगकर्ता 112 (फोन_लोक) को शहर के भीतर बुलाया जा सकता है; 106 को कहीं भी कॉल करने की अनुमति; उपयोगकर्ता 495 को केवल आंतरिक नंबरों पर कॉल की अनुमति है (यदि संदर्भ निर्दिष्ट नहीं किया गया है, तो phone_int संदर्भ का उपयोग किया जाता है)। गुप्त फ़ील्ड वह पासवर्ड है जिसका उपयोग प्राधिकरण के लिए किया जाएगा।

आने वाली लाइनें

मुख्य विन्यास का एक उदाहरण:

 # mcedit sip_general.conf [general] bindport = 5060 bindaddr=0.0.0.0 allowguest = no allowtransfer = yes allowoverlap = no tos_sip = cs3 tos_audio = ef tos_video = af41 srvlookup = no minexpiry = 900 maxexpiry = 3600 defaultexpiry = 360 checkmwi = 10 language = en relaxdtmf = no rtptimeout = 550 rtpholdtimeout = 600 progressinband = never useragent = PBX dtmfmode = rfc2833 disallow = all domain = pbx.webnames.ru ;    allow = ulaw,alaw,gsm,ilbc,g726,g729,g723 ;   registertimeout = 60 registerattempts = 65535 externip = 8.8.8.8 ; ip  externrefresh = 10 nat = yes canreinvite = nonat insecure = invite register = example_num:pass_for_example_num:example_num@proxyreg_time/example_num 


ट्रंक सेटअप:

 # mcedit sip_trunk.conf [trunk](!) type = friend call-limit=1 canreinvite=no qualify=yes context= from_external disallow=all ; need to disallow=all before we can use allow= allow=ulaw ; Note: In user sections the order of codecs allow=alaw allow=g723.1 ; Asterisk only supports g723.1 pass-thru! allow=g729 ; Pass-thru only unless g729 license obtained allow=gsm ;; example_num [example_num] type = peer username = example_num fromuser = example_num secret = pass_for_example_num fromdomain = 1.1.1.1 ; external pbx ip host = 1.1.1.1 ; external pbx ip port = 5060 outboundproxy = 1.1.1.1 ; external pbx ip outboundproxyport = 5060 context = from_external ;    [pstn_beeline](trunk) username = pstn_beeline fromuser = pstn_beeline host = dynamic secret = pass_for_beeline ;; 88001004022 (RosTelecom) [RTK] username = trace_num type = peer host = 2.2.2.2 ; external pbx ip insecure=port,invite context= from_external 


Example_num लाइन को पूरा करने के लिए एक दूरस्थ स्टेशन पर प्राधिकरण और पंजीकरण का उपयोग करता है। कृपया ध्यान दें कि इस पंक्ति के लिए यह लिखा है:
 register = example_num:pass_for_example_num:example_num@proxyreg_time/example_num 


sip_general.conf में।

Pstn_beeline लाइन को पंजीकरण की आवश्यकता नहीं है - वास्तव में, यह लिंकसीज़ स्पा 3000 के fxo पोर्ट के माध्यम से जुड़ी "भूमि" लाइनों में से एक है, लेकिन बाद में इस पर और अधिक।

आरटीके लाइन - यहां न तो प्राधिकरण और न ही पंजीकरण की आवश्यकता है। स्टेशन पर, केवल उपयोगकर्ता और आईपी (होस्ट फ़ील्ड) की आवश्यकता होती है, जिसमें से कॉल आएंगे। यह संख्या 8800 है - इसके लिए केवल आने वाली टेलीफोनी प्रदान की जाती है। रोस्टेलकॉम के संदर्भ में, उपयोगकर्ता नाम मार्ग संख्या है।

सभी आने वाली कॉलों के लिए, संदर्भ एक है - from_external।

डायलप्लान (डायल योजना) - कॉल रूटिंग

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

1) आउटगोइंग कॉल।

 # mcedit extensions.conf [globals] [general] autofallthrough=yes ;      ;      ; dial_internal.pl -     [out_int] ;       exten => *, 1, NoOp() exten => _[1-9]XX, 1, Macro(monitor) exten => _[1-9]XX, n, Macro(int-dial,${EXTEN}) exten => _[1-9]XX, n, Hangup() ;   -  [out_local] ;   exten => _X., 1, Macro(monitor) exten => _[1-79]XXXXXX, 2, Dial(SIP/${EXTEN}@pstn_beeline&SIP/${EXTEN}@example_num) exten => _0[1-79]XXXXXX, 2, Dial(SIP/${EXTEN:1}@pstn_beeline&SIP/${EXTEN:1}@example_num) exten => _83[1-79]XXXXXX, 2, Dial(SIP/${EXTEN:2}@pstn_beeline) exten => _85[1-79]XXXXXX, 2, Dial(SIP/${EXTEN:2}@example_num) ;  -          ; .      exten => _094959874596, 2, Dial(SIP/${EXTEN:1}@pstn_beeline) ; msk line ;  [out_long_d] ;   exten => _X., 1, Macro(monitor) ;     ; 1) -  ; 2) -   exten => _08X., 2, Dial(SIP/${EXTEN:1}@pstn_beeline&SIP/${EXTEN:1}@example_num) ;         exten => _838X., 2, Dial(SIP/${EXTEN:2}@pstn_beeline) exten => _858X., 2, Dial(SIP/${EXTEN:2}@example_num) ;   [out_too_long_d] exten => _X., 1, Macro(monitor) exten => _0X., 2, Dial(SIP/${EXTEN:1}@pstn_beeline&SIP/${EXTEN:1}@example_num) ;      exten => _83X., 2, Dial(SIP/${EXTEN:2}@pstn_beeline) exten => _85X., 2, Dial(SIP/${EXTEN:2}@example_num) ;    [phone_int] include => out_int ;   [phone_local] include => phone_int include => out_local ;  [phone_long_d] include => phone_local include => out_long_d ;   [phone_too_long_d] include => phone_long_d include => out_too_long_d ; ======== ============== 


एक स्ट्रिंग पार्स करना:
 exten => _0[1-79]XXXXXX, 2, Dial(SIP/${EXTEN:1}@pstn_beeline&SIP/${EXTEN:1}@example_num) 


_0 [1-79] XXXXXX - डायल किए गए नंबर का मुखौटा। यहां पढ़ें ( voip.rus.net/tiki-index.php?page=Asterisk+Dialplan+Patterns )

0 पहला अंक है जो आया था
[१- [९] - दूसरा अंक 79 को छोड़कर कोई भी संख्या हो सकती है, क्योंकि यह इंटरसिटी से बाहर निकलने के लिए है
XXXXXX - कोई 7 अंक

X 0 से 9 तक किसी भी संख्या से मेल खाता है
Z 1 से 9 तक किसी भी संख्या से मेल खाता है
N, 2 से 9 तक किसी भी संख्या से मेल खाता है

2 - प्राथमिकता, इसका मतलब है कि यह क्रिया लगातार दूसरी बार की जाएगी।

डायल सबसे अधिक उपयोग किए जाने वाले तारांकन अनुप्रयोगों में से एक है। यह एक विशिष्ट लाइन के माध्यम से एक नंबर पर कॉल करने के लिए डिज़ाइन किया गया है। इस आवेदन के बारे में और अधिक पढ़ें ( voip.rus.net/tiki-index.php?page=Asterisk+cmd+sial )

SIP / $ {EXTEN: 1} - एक प्रकार का regexp। उदाहरण के लिए, 03799039 डायल करते समय, नंबर 3799039 चैनल पर भेजा जाएगा।

@pstn_beeline - वह चैनल जिसके माध्यम से कॉल किया जाएगा।

& SIP / $ {EXTEN: 1} @example_num - एक अन्य चैनल जिसके माध्यम से कॉल किया जाएगा यदि बीलाइन व्यस्त या अनुपलब्ध है।

 ;   [phone_local] include => phone_int include => out_local 


phone_local संदर्भ प्राप्त करने के लिए, आपको इसमें 2 संदर्भ सम्मिलित करने की आवश्यकता है - phone_int और out_local; एक उपयोगकर्ता जो इस तरह के संदर्भ से जुड़ा हुआ है (उपरोक्त उदाहरण में, यह उपयोगकर्ता 112 है), लैंडलाइन नंबर पर कॉल की अनुमति है।

2) आने वाली कॉल इस प्रकार संसाधित की जाती हैं:

 ; ========= ============== [from_external] exten => _X., 1, Macro(dial) exten => s, 1, Macro(dial) ; ========= ============== 


3) मैक्रों

मैक्रों अनिवार्य रूप से कार्य हैं। आप मैक्रो को पैरामीटर पास कर सकते हैं जो संदर्भ के आधार पर उपयोग करेगा। आप मैक्रो को निम्नानुसार एक्सेस कर सकते हैं:
 exten => _[1-79]XX, n, Macro(int-dial,${EXTEN}) 


_ [1-9] XX - वह संख्या जिसके द्वारा डायलिंग होती है।
n प्राथमिकता है;
मैक्रो मैक्रो एप्लिकेशन ही है।
int-dial मैक्रो का नाम है।
$ {EXTEN} - वह पैरामीटर जो मैक्रो को पास किया जाएगा (इस मामले में, फ़ोन नंबर)

मैक्रोज़ के बारे में और अधिक पढ़ें ( voip.rus.net/tiki-index.php?page=Asterisk+cmd+Macro&highlight=Macro ())।

डायलिंग के लिए हमारे द्वारा उपयोग किए जाने वाले मैक्रोज़ हैं:

 ; =============================== ;       ;   /var/lib/asterisk/agi/dial_internal.pl ;      (  ) ;     ;     users .. asterisk [macro-int-dial] exten => s, 1, NoOp() exten => s, 2, AGI(/var/lib/asterisk/agi/dial_internal.pl, ${ARG1}) exten => s, n, Hangup() ;    ( ) ;         ;     [phone_int] ;     /var/lib/asterisk/agi/ivr.pl [macro-monitor] exten => s, 1, AGI(/var/lib/asterisk/agi/monitor.pl) ;     [macro-groupe-dial] exten => s, 1, Queue(${ARG1}, rtT,,,100) ;     ;   -  (     ) ;   ( <->. ), ;   - “  ,    " [macro-dial] exten => s, 1, AGI(/var/lib/asterisk/agi/ivr.pl) exten => s, n, Hangup() ; =============================== 


लगभग सभी संदर्भों में, AGI एप्लिकेशन का उपयोग किया जाता है। आवेदन के बारे में यहाँ और अधिक पढ़ें ( voip.rus.net/tiki-index.php?page=Asterisk+cmd+AGI&highlight=AGI ())।

इस एप्लिकेशन का उपयोग हम कैसे करें - इसके बारे में अगले भाग में।

एजीआई अभिवादन

टास्क।
एक मेनू लागू करें जो निम्नानुसार काम करता है:
1) सप्ताहांत और गैर-काम के घंटे - एक संदेश जिसे ग्राहक गैर-काम के घंटों के दौरान कॉल करता है; काम के समय को आवाज दें।
2) काम करने का समय एक ग्रीटिंग है; समय के आधार पर, ग्राहक को स्विच करें
• सचिव (यदि ग्राहक कार्यालय समय के दौरान गिर गया);
• अन्य काम के घंटों के दौरान तकनीकी सहायता

काम करने का समय सोमवार-शुक्रवार 9 से 21 तक है; कार्यालय 9 से 13 और सप्ताह के दिनों में 14 से 18 तक (कार्यालय में दोपहर के भोजन के एक से दो तक) खुला है।

समस्या को हल करने का उपकरण।
समस्या को हल करने के लिए, एजीआई उपकरण का चयन किया गया था।
AGI (Asterisk Gateway Interface) Asterisk (http सर्वर के लिए CGI के समान) में निर्मित बाहरी स्क्रिप्ट को निष्पादित करने का एक तरीका है जो अन्य प्रोग्रामिंग भाषाओं का उपयोग करके तारांकन की कार्यक्षमता का विस्तार कर सकता है।
पर्ल को विकास की भाषा के रूप में चुना गया था - किसी भी समस्या को हल करने के लिए एक सार्वभौमिक उपकरण के रूप में। :-)
Cpan पर Asterisk :: AGI मॉड्यूल search.cpan.org/~jamesgol/asterisk-perl-1.03/lib/Asterisk/AGI.pm है

पेशेवरों एजीआई - विकास में आसानी; लचीलापन। विपक्ष - सर्वर पर लोड को काफी बढ़ाता है। स्क्रिप्ट हर कॉल के साथ संकलित है, और कैश नहीं है; इंटरनेट पर वे लिखते हैं कि एजीआई छोटी गाड़ी है, लेकिन हमारे काम के दौरान (~ 0.5 वर्ष) इसके साथ कोई समस्या नहीं थी। हमें कंप्यूटिंग शक्ति से भी कोई समस्या नहीं है।

समस्या का समाधान।
हम यहां आने वाली सभी कॉलों को निर्देशित करते हैं (पिछले अनुभाग को देखें):
 exten => s, 1, AGI(/var/lib/asterisk/agi/ivr.pl) 


आने वाले कॉल हैंडलर (/var/lib/asterisk/agi/ivr.pl) इस तरह दिखेगा:
 use Data::Dumper; use warnings; use strict; use Asterisk::AGI; use Time::localtime; my $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); #   ""  # ,    #  check_ivr my $schedule_time = '/var/lib/asterisk/agi/schedule.conf'; #    my $support = '300'; #   my $recep = '101'; # non_working -   # working -    (   9-13;14-18 ) # work_supp -      (default 13-14; 18-21) my @ivr = (\&non_working, \&working, \&work_supp); #START $AGI->answer(); #          my $mode = &check_ivr(); # $AGI->verbose( "Mode => $mode", 0); &{$ivr[$mode]}; #   $AGI->hangup(); exit(); sub non_working{ #       $AGI->exec('Playback', 'offduty'); } sub working{ #  $AGI->exec('Playback', 'welcome'); #       $AGI->exec('Macro', "monitor"); #   $AGI->exec('Macro', "int-dial,$recep"); } sub work_supp{ $AGI->exec('Playback', 'welcome'); $AGI->exec('Macro', "monitor"); #     $AGI->exec('Macro', "groupe-dial,$support"); } ################# check_ivr ##################################### #  ( .      ):# # $wday -    (   - 0..6 )############### # $hour -  (   - 0..23 )########################### # $date -  (   - . )################### #   ( 0..2 ):####################################### # 0 -  ;########################################### # 1 -  ;############################################## # 2 -  ..###################################### sub check_ivr { my ( $wday, $hour, $date ) = @_; #         -   ($wday, $hour, $date ) = &_date_now_ if !$date||!$hour||!$date; my ( %check, $check); # -        my %sch_dates; open ( SCH, $schedule_time ); while ( <SCH> ) { if ( $_ =~ /^(\d{1,2}\.\d{1,2})\s*(.*)[\r\n]*$/) { my ( $sch_date, $sch ) = ($1, $2); $date =~ s/^0(\d)/$1\./; $date =~ s/0(\d)$/$1/; $sch ||= '0'; $sch_dates{$sch_date} = $sch; } } close(SCH); foreach my $schedule_d (keys %sch_dates){ if ( $date eq $schedule_d ) { if ( $sch_dates{$date} ) { return &_check_time_( $hour, $sch_dates{$date} ); } else { return $sch_dates{$date} } } } #   ?   1(  )  0 (  ) $check{wday} = $wday>0&&$wday<6 ? '1':'0'; #   0, 1, 2 -  _check_time_ $check{hour} = &_check_time_( $hour ); $check = 1; foreach ( values %check ) { $check *= $_; } return $check; sub _check_time_ { # $hour_tm -   # $wr_time - work time (    )   [9,13,18,21] my ( $hour_tm, $wr_time) = @_; # $wr_time - work time (    ) #   () my %wr_time = &_parse_work_time_( $wr_time ); # 0 -    # 1 -    ( 9-13; 14-18 ) # 2 - c 13  14;  18  21 my $check_tm = 0; if( $hour_tm>$wr_time{st_office}&&$hour_tm<$wr_time{end_support} ) { if ( $hour_tm==$wr_time{lunch}||$hour_tm>$wr_time{end_office} ) { $check_tm = 2; } else { $check_tm = 1 } } return $check_tm; } #     [9,13,18,21] #    # %work_time = ( st_office => 8, # lunch => 13, # end_office => 17, # end_support => 21); sub _parse_work_time_ { my ( $work_time ) = @_; #      1 #   . $work_time = "[9,13,18,21]" if (!$work_time||$work_time eq 1 ); $work_time =~ s/^\[(.+)\][\r\n]*$/$1/; my %work_time; ( $work_time{st_office}, $work_time{lunch}, $work_time{end_office}, $work_time{end_support}, $work_time{lunch_support} ) = split /\s*,\s*/, $work_time; $work_time{st_office} -= 1; $work_time{end_office} -= 1; return %work_time; } sub _date_now_ { return ( localtime->wday, localtime->hour, localtime->mday.'.'.(localtime->mon+1) ); } } __END__ 


फ़ाइल /var/lib/asterisk/agi/schedule.conf "असाधारण" समय संग्रहीत करता है, अर्थात समय जब कार्यालय हमेशा की तरह काम नहीं कर रहा है, उदाहरण के लिए, एक छुट्टी या छोटा दिन। एक उदाहरण:

# 1 - तारीख (दिन का महीना)
# 2 - किस दिन (वैकल्पिक पैरामीटर)
# 1 गैर-काम या खाली
1- 1- सामान्य कार्य ([9,13,18,21]) या एक सरणी
# 2.1 - कार्यालय प्रारंभ समय (9)
# 2.2 - दोपहर का भोजन (13, यानी 13 से 14 तक)
# 2.3 - कार्यालय बंद का समय (18)
# 2.4 - तकनीकी सहायता पूरा होने का समय
# तारीख शून्य के बिना दर्ज की जाती है। 06.11 - काम नहीं करता है; 6.11 - काम करता है
29.12 [9,11,17,20]
31.12

29 दिसंबर [9,11,17,20] (29 दिसंबर) एक छोटा दिन है। कार्यालय 9 से 17 तक खुला है; दोपहर का भोजन 11 से 12 तक; तकनीकी सहायता 20 तक काम करती है।
12/31 - गैर-कार्य दिवस।

AGI कॉल हैंडलर

टास्क।
किसी नंबर पर कॉल करते समय, कॉल को एक निश्चित समय-सीमा / व्यस्त / किसी अन्य नंबर पर अनुपलब्ध / अनुपलब्ध के माध्यम से पुनर्निर्देशित किया जाना चाहिए (एक नियम के रूप में, यह कतारों में से एक है)। "टाइमआउट" और "अन्य संख्या" गतिशील चर हैं - प्रत्येक संख्या के लिए उन्हें व्यक्तिगत रूप से सेट किया जा सकता है।

उपकरण।
जैसा कि पिछले भाग में - ए.जी.आई.

समस्या का समाधान।

कर्मचारी आंतरिक संख्या mysql डेटाबेस द्वारा उपयोगकर्ता तालिका में संग्रहीत की जाती हैं।
एक तालिका बनाएं:
 CREATE TABLE `users` ( `num` int(11) PRIMARY KEY NOT NULL, `timeout` tinyint(4) NOT NULL DEFAULT '10', `queue` int(11) DEFAULT NULL ); 


num - कर्मचारी फ़ोन नंबर;
टाइमआउट - सेकंड में समय जिसके बाद कॉल अग्रेषित किया जाएगा;
कतार - कतार की संख्या जहां कॉल अग्रेषित की जाएगी।

संख्याओं के लिए प्रविष्टियाँ जोड़ें:
 INSERT INTO `users` VALUES (101,10,300), (106,20,0), (112,20,0); 


जाँच करें कि क्या हुआ:
उपयोगकर्ताओं से चयन करें *;
+ ----- + --------- + ------- +
| संख्या | समय समाप्त | कतार |
+ ----- + --------- + ------- +
| 101 | 10 | 300 |
| 106 | 20 | 0 |
| 112 | 20 | 0 |
+ ----- + --------- + ------- +

यदि आप 101 पर कॉल करते हैं, तो 10 सेकंड के बाद कॉल 300 नंबर पर जाएगी (हमारे पास यह तकनीकी सहायता संख्या है); जब आप 112 या 106 पर कॉल करते हैं, तो कॉल कहीं भी नहीं जाएगी, लेकिन बस 20 सेकंड में समाप्त हो जाएगी।

हैंडलर को इस प्रकार एक्सेस किया जा सकता है (AGI (/var/lib/asterisk/agi/dial_internal.pl, $ {ARG1})):

डायलप्लान में यह है:
 exten => _[1-9]XX, n, Macro(int-dial,${EXTEN}) [macro-int-dial] exten => s, 1, NoOp() exten => s, 2, AGI(/var/lib/asterisk/agi/dial_internal.pl, ${ARG1}) exten => s, n, Hangup() 


फ़ोन नंबर मैक्रो चर $ {EXTEN} में आता है, और फिर $ {ARG1} का उपयोग करके हैंडलर /var/lib/asterisk/agi/dial_internal.pl को पारित कर दिया जाता है।

हैंडलर कोड:

 #!/usr/bin/perl use Data::Dumper; use warnings; use strict; use Asterisk::AGI; use DBI; my $user = 'asterisk'; my $pass = 'super-pass'; my $db = 'astr'; my $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); $AGI->answer(); #     my $exten = $input{arg_1}; #    ,       my ($timeout, $queue) = &get_timeout($exten); #     #  ,    . $timeout ||= '10'; #$AGI->verbose("$timeout $queue", 0); $AGI->exec('Dial', "SIP/$exten, $timeout, Tt"); #           if ( $queue ) { # $AGI->verbose('$queue', 0); $AGI->exec('Macro', "groupe-dial,$queue") if ( $AGI->get_variable('DIALSTATUS') ne 'ANSWER'); } $AGI->hangup(); exit(); sub get_timeout { my ($num) = @_; my $dbh = DBI->connect("DBI:mysql:database=$db;host=localhost", $user, $pass, {'RaiseError' => 1}); my $sth = $dbh->prepare("SELECT * FROM users WHERE num like $num"); $sth->execute(); my $ref = $sth->fetchrow_hashref(); ( $timeout, $queue ) = ( ${$ref}{timeout}, ${$ref}{queue}); $sth->finish (); $dbh->disconnect(); return ($timeout, $queue); } __END__ 


कॉल ऑडियोलॉजिस्ट

सभी कॉल विशेष रूप से व्यावसायिक घंटों के दौरान रिकॉर्ड किए जाते हैं। AGI का उपयोग कॉल रिकॉर्डिंग में भी किया जाता है। एक इसके बिना कर सकता था, लेकिन यह बहुत सुविधाजनक है जब लॉग अलग निर्देशिकाओं में रखे जाते हैं।
उदाहरण लॉग फ़ाइल:।
यानी./year/month/day/year_month_number.hours_minutes_seconds.number_of_existing_call.wav

फ़ाइल नाम इस तरह से डिज़ाइन किया गया है कि सभी फ़ाइलों को एक निर्देशिका में रखना और एक विशिष्ट पैरामीटर (फ़ोन नंबर / समय, आदि) से इसे तैयार करना संभव होगा। )

हैंडलर कोड /var/lib/asterisk/agi/monitor.pl:
 #!/usr/bin/perl use Data::Dumper; use warnings; use strict; use Asterisk::AGI; use File::Path qw(make_path); #    my $dir = '/mnt/pbx/'; my $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); #  -  ,    #   my $prop = $input{arg_1}; $AGI->answer(); my ($date, $time) = split / /, $AGI->get_variable('CDR(start)'); $time =~ s/://g; $date =~ s/-/\//g; $date .= '/'; my $dir = $dir.$date; #        $date =~ s/\///g; #        #        - 'ivr' $prop ||= $AGI->get_variable('CDR(src)'); #    $prop =~ s/[\+\.\'\"\:\(\)\[\]\&\^\$\#\@\!\%\*\s]//g; my $file = $prop ? $dir.$date.".$time.$prop" : $dir.$date.".$time.anon"; #   $file .= '.wav'; $AGI->exec('MixMonitor', "$file, a"); exit(); __END__ 

MixMonitor आवेदन यहां पाया जा सकता अधिक के बारे में ( www.voip-info.org/wiki/view/MixMonitor )

कतार

कतार सब कुछ रिश्तेदार सरल है। कॉन्फ़िगरेशन को queues.conf कहा जाता है। हमारे पास 2 लाइनें हैं - तकनीकी सहायता (संख्या 300) और लेखा (301):

 [general] persistentmembers=yes autofill=yes autopause=no monitor-type=MixMonitor strategy=ringall ;  . ringinuse=no timeout=100 retry=2 wrapuptime=0 maxlen=0 defaultrule = plus10 [301] member => SIP/105,1 member => SIP/109,1 [300] member => SIP/102,1 member => SIP/108,1 

आप यहां कतारों की संभावनाओं के बारे में अधिक पढ़ सकते हैं:
www.voip-info.org/wiki/view/Asterisk+config+queues.conf लिंकेज

स्पा-3000 के माध्यम से बाहरी लाइनों को कॉन्फ़िगर करना

टास्क।
Linksys Spa-3000 में एक fxo पोर्ट और एक fxs है। वॉयस गेटवे से जुड़े नंबर को कॉल करते समय (बाद में इसे लेट के रूप में संदर्भित किया जाता है।), कॉल को एफएक्स पोर्ट पर भेजा जाना चाहिए (हमारे पास वहां फैक्स है)। उसी समय, हमें
कार्यालय से fxo पोर्ट से जुड़ी लाइन के माध्यम से 1) कॉल करने में सक्षम होना चाहिए ;
2) एक फैक्स नंबर पर स्विच करें यदि कॉल दूसरी लाइन के माध्यम से आया था;
3) स्टेशन से जुड़ी किसी भी लाइन के माध्यम से फैक्स से कॉल करें।

निर्णय।
योजना को लागू करने के लिए, आपको g.sh को कॉन्फ़िगर करना होगा। इस प्रकार है। व्यवस्थापन लॉगिन पृष्ठ पर जाएँ-> उन्नत-> PSTN लाइन:
प्रॉक्सी: 10.0.0.5 # (आईपी स्टेशन)
आउटबाउंड प्रॉक्सी: 10.0.0.5 # (आईपी स्टेशन)
रजिस्टर: हाँ
उपयोगकर्ता आईडी: pstn_beeline
पासवर्ड: pass_for_beeline

# कॉल करने के लिए फैक्स करने के लिए तुरंत स्टेशन को दरकिनार कर कार्रवाई की।
डायल प्लान 2: (<: @ gw0>)
पीएसटीएन कॉलर डिफ़ॉल्ट डीपी: 2

स्टेशन पर बाहरी लाइन का कॉन्फ़िगरेशन बाहरी लाइनों अनुभाग (pstn_beeline) में वर्णित है।

106 फैक्स नंबर:
प्रॉक्सी: 10.0.0.5 # (आईपी स्टेशन)
आउटबाउंड प्रॉक्सी: 10.0.0.5 # (आईपी स्टेशन)
रजिस्टर: हाँ
उपयोगकर्ता आईडी: 106
पासवर्ड: pass_for_fax

स्टेशन पर एक्सटेंशन नंबर सेट करना आउटगोइंग कॉल उपयोगकर्ताओं और संदर्भ अनुभागों में वर्णित है (106)

उपयोगी कमांड

तारांकन चिह्न -r - कमांड लाइन तक पहुंच तारांकन
चिह्न -आरएक्स 'सिप शो पियर्स' - तारांकन कंसोल में प्रवेश किए बिना कंसोल में जुड़े उपयोगकर्ताओं की सूची प्रदर्शित करें। -X स्विच के साथ, आप तारांकन कंसोल पर जाए बिना किसी भी कमांड को निष्पादित कर सकते हैं।

कमांड, तारांकन कंसोल, जो हम सबसे अधिक बार उपयोग करते हैं:
sip reload - sip.conf
config डायलप्लान reload से जानकारी पुनः लोड करें - डायल प्लान
sip show चैनल को फिर से लोड करें - निर्मित चैनलों की सूची।
sip सेट डीबग ip ip_peer_a_a - किसी विशिष्ट चैनल का डीबग सक्षम करें। पैकेट दिखाता है जो हमारे स्टेशन और एक दूरस्थ स्टेशन के बीच जाता है। डिबगिंग
कोर सेट क्रिया 3 के लिए अपरिहार्य - डिबगिंग मोड सक्षम करें। दिखाता है कि चैनल निर्माण के दौरान कौन से एप्लिकेशन चल रहे हैं।

Source: https://habr.com/ru/post/In180265/


All Articles