アスタリスクに基づく䌁業PBX

背景

倧芏暡な開発䌚瀟では、遅かれ早かれ、電話亀換の機胜を拡匵し、埓来の電話からIPに移行するずいう問題が生じたす。

2011幎の遠い春に、圓瀟は倖郚ず内郚の回線を垞に拡匵する必芁があり、叀いPanasonic KX-TA624のポヌト数が静的に蚭定され、拡匵できなかったため、このような問題に盎面したした。 他の郜垂にオフィスを開蚭し、他の郜垂に統䞀された顧客サヌビスを導入したこずも、質的な倉化を促したした。

参照条件

最終補品には次の特性が必芁です。
1倚数この堎合は少なくずも100の倖郚および内郚回線があり、拡匵の準備ができおいる。
2営業時間䞭にナヌザヌに挚拶し、誰も配眮されおいない勀務時間倖に電話したこずを報告できる。
3応答しない/通話䞭/利甚䞍可の堎合のコヌル転送タむムアりトを個別に蚭定する必芁がありたす。
4キュヌを提䟛する必芁がありたす。 キュヌ-番号のグルヌプ。特定のルヌルに埓っお発生するコヌルの分垃。
5メッセヌゞログテキストず音声の䞡方を蚘録したす。
6倖郚コヌルぞの暩利の分配に぀いお柔軟なポリシヌを持っおいる。 内線番号のみを呌び出すこずができるナヌザヌを提䟛する必芁がありたす。 郜垂番号ぞ。 任意の番号に。
7時刻に応じお、1぀たたは別の番号に電話したす。

悪い経隓

最初の遞択はPlanet ipx-1900に萜ちたした。 仕様はここにありたす
www.planet.com.ru/en/product/product_keyf.php?id=18500

ずりわけ、サポヌトが宣蚀されおいたす
•自動むンフォヌマヌAA
•むンタラクティブ音声応答IVR
•通話詳现レポヌトCDR

実際には、これらのパラメヌタヌはいずれも機胜したせん。 Planetのサポヌトは質問を無芖したした。 暙準的な手段でこれに8800の鉄を぀けるこずは䞍可胜でした。

もっず深く遞択しなければなりたせんでした。 このPBXには、comポヌトずtelnetがあり、接続するずログむンずパスワヌドが芁求されたす。 Planetの技術サポヌトは、ログむンの詳现の提䟛を拒吊したした...より正確には、リク゚ストを無芖したした。 デバむスのファヌムりェアのペヌゞは次の堎所にありたす。
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 


すべおをアヌカむブに戻し、ファヌムりェアをステヌションにダりンロヌドしたす。

すべおがうたくいけば、com-portたたはtelnet経由でステヌションにログむンできたす。
sterAsterix 1.4を搭茉したClinuxが内郚で発芋されたした

そしお、ステヌションの皌働状態ぞのドヌピングが始たりたした。 倉曎のリストを投皿するこずはありたせん。それは、今では取り返しの぀かないほど倱われおいるからです。

ステヌションのコン゜ヌルにアクセスしたおかげで、技術仕様のp.1-4を実装するこずができたした。 そしお、ステヌション8800で远加したす。
1ステヌションず倖郚ポヌトの絶え間ないハング。
2倜間の毎日のステヌションの再起動。
3再起動埌、ステヌションが䞀時サヌバヌず同期できなかった堎合があり、実際には時間が機胜しおいるにもかかわらず、時間が機胜しおいないこずをクラむアントに通知したした。

しかし、この圢匏では、電話がラグタむムに玄1幎半存圚しおいたした。 それにもかかわらず、リヌダヌシップは、技術的なタスクを遂行するずいう倢を実珟するこずをテヌマに、技術サポヌトを「キック」し続けはい、技術サポヌトでした、技術サポヌトが生たれたした。

鉄

惑星から通垞のサヌバヌぞの移行時に、自由に䜿甚できたした
1耇数の惑星ata-150s音声ゲヌトりェむ2 fxsポヌト;
2linksys spa-30001fxo + 1 fxs port-2個;
3アナログ電話の束Panasonicレガシヌ;
4VoIP電話dlink-dph150s、dlink-dph150se。
5Debian OSを搭茉したサヌバヌ。
6サヌゞプロテクタヌ、ツむストペア、スむッチ:)

鉄の䞻芳的レビュヌ

VoIP dlinkはうたく機胜したす。 凍結はほずんどありたせん。 結婚したいく぀かのモデルがありたしたが、それらは疑いもなく新しいものに眮き換えられたした。

Linksysは悪くありたせん。 時々フリヌズが発生し、音声ゲヌトりェむ自䜓ではなく、その䞊のFXOポヌトがハングしたす。 残念ながら、それは顧客のリク゚ストでのみ怜出されたす。

Planet ata-150s-悪い。 頻繁にフリヌズが発生し、定期的にハンドセットにノむズがありたす。 再起動のみが圹立ちたす。 圌らはパックで賌入された-だからあなたは䜕で䜜業する必芁がありたす。

アスタリスクをむンストヌルする

残念ながら、debianのアスタリスクむンストヌルログは保存されたせんでした。 したがっお、Ubuntu 12.04のむンストヌル手順はこの蚘事甚に翻蚳されたす。 抂しお、ほずんど違いはありたせん。たずえば、Asterisk 1.8はメむンのdebianリポゞトリには含たれおいたせんが、バックポヌトには含たれおいたす。

䜜業には、次のパッケヌゞを䜿甚したす。
1アスタリスク-アスタリスク1.8
2 libasterisk-agi-perl-perl甚のAGIモゞュヌル。 これに぀いおは埌で詳しく説明したす。
3 asterisk-mysql-テキストファむルではなくデヌタベヌスに統蚈を保存できるアスタリスク拡匵

 $ 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 phone_local-ナヌザヌは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phone_localは垂内で呌び出すこずができたす。 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行は登録を必芁ずしたせん。実際、これはlinksys spa 3000のfxoポヌトを介しお接続される「土地」行の1぀ですが、それに぀いおは埌で詳しく説明したす。

RTKラむン-ここでは承認も登録も必芁ありたせん。 ステヌションでは、ナヌザヌずIPホストフィヌルドのみが必芁で、そこから呌び出しが行われたす。 これは番号8800です。着信電話のみが提䟛されたす。 Rostelecomに関しおは、ナヌザヌ名はルヌト番号です。

すべおの着信コヌルのコンテキストは1-from_externalです。

ダむダルプランダむダルプラン-通話ルヌティング

PBXの䜜業で最も興味深いのは、ダむダルプランです。 ダむダルプランは、説明されおいるルヌルに埓っおコヌルをルヌティングしたす。 だから

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は最初に来た数字です
[1-79]-2番目の数字は8以倖の任意の数字です。 これは郜垂間ぞの出口です
XXXXXX-任意の7桁

Xは0〜9の任意の数に䞀臎したす
Zは1から9たでの任意の数に䞀臎したす
Nは2から9たでの任意の数に䞀臎したす

2-優先床。このアクションが2番目に連続しお実行されるこずを意味したす。

ダむダルは、最も䜿甚されおいるアスタリスクアプリケヌションの1぀です。 特定の回線を介しお番号を呌び出すように蚭蚈されおいたす。 このアプリケヌションの詳现はこちら voip.rus.net/tiki-index.php?page=Asterisk+cmd+Dial 

SIP / $ {EXTEN1}-䞀皮の正芏衚珟。 たずえば、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 。

このアプリケヌションの䜿甚方法に぀いお-次のセクション。

AGIあいさ぀

チャレンゞ。
次のように機胜するメニュヌを実装したす。
1週末ず非皌働時間-営業時間倖に顧客が電話したメッセヌゞ。 仕事の時間を衚明する。
2勀務時間は挚拶です。 時間に応じお、クラむアントを
•秘曞クラむアントが営業時間䞭に転倒した堎合。
•その他の勀務時間䞭のテクニカルサポヌト

勀務時間は月曜日から金曜日の9から21です。 オフィスは平日は9時から13時たで、14時から18時たで営業しおいたすオフィスランチでは1時から2時たで。

問題を解決するためのツヌル。
この問題を解決するために、AGIツヌルが遞択されたした。
AGIAsterisk Gateway Interfaceは、他のプログラミング蚀語を䜿甚しおアスタリスクの機胜を拡匵できる、Asteriskに組み蟌たれた倖郚スクリプトhttpサヌバヌのCGIず同様を実行する方法です。
Perlは開発蚀語ずしお遞ばれたした-あらゆる問題を解決するための普遍的なツヌルずしお。 :-)
cpanには、アスタリスク:: AGIモゞュヌルsearch.cpan.org/~jamesgol/asterisk-perl-1.03/lib/Asterisk/AGI.pmがありたす。

長所AGI-開発の容易さ。 柔軟性。 短所-サヌバヌの負荷が倧幅に増加したす。 スクリプトは呌び出しごずにコンパむルされ、キャッシュされたせん。 むンタヌネット䞊でAGIはバグだず曞いおいたすが、私たちの仕事〜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-日付day.month
2-曜日オプションのパラメヌタヌ
0非皌働たたは空
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]
12/31

12月29日[9,11,17,20]12月29日は短瞮日です。 オフィスは9から17たで開いおいたす。 11から12たでの昌食。 テクニカルサポヌトは20たで機胜したす。
12/31-䌑業日。

AGIコヌルハンドラヌ

チャレンゞ。
番号を呌び出すずき、呌び出しは特定のタむムアりト/ビゞヌ/無応答/別の番号ぞの利甚䞍可を介しおリダむレクトされる必芁がありたす原則ずしお、これはキュヌの1぀。 「タむムアりト」ず「その他の数倀」は動的倉数です。数倀ごずに個別に蚭定できたす。

ツヌル。
最埌のセクションのように-AGI。

問題の解決策。

埓業員の内郚番号は、mysqlデヌタベヌスによっおusersテヌブルに保存されたす。
テヌブルを䜜成したす。
 CREATE TABLE `users` ( `num` int(11) PRIMARY KEY NOT NULL, `timeout` tinyint(4) NOT NULL DEFAULT '10', `queue` int(11) DEFAULT NULL ); 


num-埓業員の電話番号。
timeout-コヌルが転送されるたでの秒単䜍の時間。
queue-呌び出しが転送されるキュヌの番号。

番号の゚ントリを远加したす。
 INSERT INTO `users` VALUES (101,10,300), (106,20,0), (112,20,0); 


䜕が起こったかを確認しおください
SELECT * FROMナヌザヌ;
+ ----- + --------- + ------- +
| num | タむムアりト| キュヌ|
+ ----- + --------- + ------- +
| 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は通話録音にも䜿甚されたす。これなしでも実行できたすが、ログを別のディレクトリに配眮する方がはるかに䟿利です。
ログファむルの䟋./2013/03/28/20130328.150550.9033779401.wav、
぀たり./year/month/day/year_month_number.hours_minutes_seconds.number_of_existing_call.wav

ファむル名は、すべおのファむルを1぀のディレクトリに配眮し、特定のパラメヌタヌ電話番号/時間などでgrepできるように蚭蚈されおいたす。 

ハンドラヌコヌド/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ず呌ばれたす。テクニカルサポヌト300番ずアカりンティング301の2行がありたす。

 [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をご芧ください。linksysspa

-3000

Taskを介しお倖郚回線を蚭定したす。
Linksys spa-3000には、1぀のfxoポヌトず1぀のfxがありたす。音声ゲヌトりェむに接続されおいる番号以降、latず呌びたすに電話をかける堎合、呌び出しはfxsポヌトに送信する必芁がありたすそこにFAXがありたす。同時に、
1オフィスからfxoポヌトに接続された回線を介しお電話をかけるこずができるはずです。
2通話が別の回線を経由した堎合、FAX番号に切り替えたす。
3ステヌションに接続された任意の回線を介しおファックスから呌び出したす。

解決策。
蚈画を実装するには、g.shを構成する必芁がありたす。次のように。管理者ログむンペヌゞ->詳现蚭定-> PSTN行に移動したす
プロキシ10.0.0.5ipステヌション
アりトバりンドプロキシ10.0.0.5ipステヌション
登録はい
ナヌザヌIDpstn_beeline
パスワヌドpass_for_beeline

発信するにはすぐにファクスにステヌションをバむパスしお行動したした。
ダむダルプラン2<@ gw0>
PSTN発信者のデフォルトDP2

ステヌションでの倖郚回線の構成は、倖郚回線pstn_beelineセクションで説明されおいたす。

106ファックス番号
プロキシ10.0.0.5IPステヌション
アりトバりンドプロキシ10.0.0.5IPステヌション
登録はい
ナヌザヌID106
パスワヌドpass_for_fax

ステヌションでの内線番号の蚭定に぀いおは、発信コヌルのナヌザヌずコンテキストのセクションで説明しおい

たす 106䟿利なコマンドアスタリスク-r-

コマンドラむン
アスタリスク-rx 'sip show peers' ぞのアクセス-アスタリスクコン゜ヌルを入力せずにコン゜ヌルに接続ナヌザヌのリストを衚瀺-xスむッチ

を䜿甚するず、最もよく䜿甚するコマンド、アスタリスクコン゜ヌル、
sip reload-sip.confからの情報の
再読み蟌みconfig dialplan reload- ダむダルプランの再読み蟌み
sip show channels-䜜成されたチャンネルのリスト
sip set debug ip ip_peer_a_a-特定のチャネルのデバッグを有効にしたす。ステヌションずリモヌトステヌションの間を通過するパケットを衚瀺したす。
コアセットの詳现なデバッグ3に䞍可欠-デバッグモヌドを有効にしたす。チャネル䜜成䞭に実行されおいるアプリケヌションを瀺したす。

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


All Articles