Мне нужно настроить звонок на случайному номер из определенного списка. Причем звонок будет уходить через транк на стороннюю атс (фирмы alcatel). Все эти номера уже работают как агенты алкателевского колл-центра. Звонки с астериска имеют особенность – агент должен услышать сообщение информирующее его о том, что звонок необычный. На алкателе невозможно воспроизвести сообщение агенту, поэтому пришлось выкручиваться с помощью астериска. Написал следующий диалплан:
Код: Выделить всё
[callback]
exten => 1,1, GoSub(SUB_CALLBACK,start,1)
same => n, GotoIf($[$["${DIALSTATUS}" = "BUSY"] | $["${DIALSTATUS}" = "CONGESTION"] | $["${DIALSTATUS}" = "CHANUNAVAIL"] | $["${DIALSTATUS}" = "NOANSWER"] | $["${DIALSTATUS}" = "FAILED"]]?agian)
same => n(agian),GoSub(SUB_CALLBACK,start,1)
same => n, Hangup()
[SUB_CALLBACK]
exten => start,1, AGI(/scripts/rnd.php)
same => n, Set(nmbr=${rnd_num})
same => n, Dial(H323/${nmbr}@alcatel,90,t|5|M(privet))
same => n, GotoIf($[$["${DIALSTATUS}" = "BUSY"] | $["${DIALSTATUS}" = "CONGESTION"] | $["${DIALSTATUS}" = "CHANUNAVAIL"] | $["${DIALSTATUS}" = "NOANSWER"] | $["${DIALSTATUS}" = "FAILED"]]?agian)
same => n(agian), Goto(start,1)
same => n, Hangup()
[macro-privet]
exten => s,1, AGI(google_voice.php,"Тескт сообщения для оператора")
same => n, Playback(${GVOICE})
Код: Выделить всё
asterisk*CLI> //////ПЕРВЫЙ ЗВОНОК
-- Attempting call on Local/1@callback for 89105554433@contex-for-tests:1 (Retry 1)
-- Executing [1@callback:1] Gosub("Local/1@callback-0000000f;2", "SUB_CALLBACK,start,1") in new stack
-- Executing [start@SUB_CALLBACK:1] AGI("Local/1@callback-0000000f;2", "/scripts/rnd.php") in new stack
-- Launched AGI Script /scripts/rnd.php
-- <Local/1@callback-0000000f;2>AGI Script /scripts/rnd.php completed, returning 0
-- Executing [start@SUB_CALLBACK:2] Set("Local/1@callback-0000000f;2", "nmbr=5715") in new stack
-- Executing [start@SUB_CALLBACK:3] Dial("Local/1@callback-0000000f;2", "H323/5715@alcatel,90,t|10|M(privet)") in new stack
== Using H323 RTP TOS bits 184
== Using H323 RTP CoS mark 6
== Using UDPTL TOS bits 184
== Using UDPTL CoS mark 6
-- Requested transfer capability: 0x00 - SPEECH
-- Called H323/5715@alcatel
-- H323/alcatel-73 is ringing
-- H323/alcatel-73 is ringing
-- H323/alcatel-73 is making progress passing it to Local/1@callback-0000000f;2
asterisk*CLI>
asterisk*CLI> //////ВТОРОЙ ЗВОНОК
== Everyone is busy/congested at this time (1:1/0/0)
-- Executing [start@SUB_CALLBACK:4] GotoIf("Local/1@callback-0000000f;2", "1?again") in new stack
-- Goto (SUB_CALLBACK,start,5)
-- Executing [start@SUB_CALLBACK:5] Goto("Local/1@callback-0000000f;2", "start,1") in new stack
-- Goto (SUB_CALLBACK,start,1)
-- Executing [start@SUB_CALLBACK:1] AGI("Local/1@callback-0000000f;2", "/scripts/rnd.php") in new stack
-- Launched AGI Script /scripts/rnd.php
-- <Local/1@callback-0000000f;2>AGI Script /scripts/rnd.php completed, returning 0
-- Executing [start@SUB_CALLBACK:2] Set("Local/1@callback-0000000f;2", "nmbr=5160") in new stack
-- Executing [start@SUB_CALLBACK:3] Dial("Local/1@callback-0000000f;2", "H323/5160@alcatel,90,t|10|M(privet)") in new stack
== Using H323 RTP TOS bits 184
== Using H323 RTP CoS mark 6
== Using UDPTL TOS bits 184
== Using UDPTL CoS mark 6
-- Requested transfer capability: 0x00 - SPEECH
-- Called H323/5160@alcatel
-- H323/alcatel-74 is ringing
-- H323/alcatel-74 is ringing
-- H323/alcatel-74 is making progress passing it to Local/1@callback-0000000f;2
asterisk*CLI>
asterisk*CLI> //////Гудбай
== Spawn extension (SUB_CALLBACK, start, 3) exited non-zero on 'Local/1@callback-0000000f;2'
> [INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid) VALUES ({ ts '2015-04-21 09:17:51' },'89105554433','89105554433','89105554433','contex-for-tests','Local/1@callback-0000000f;1','Dial','Local/1@callback',0,0,'FAILED',3,'1429597041.112')]
[Apr 21 09:17:51] WARNING[4221][C-0000000f]: pbx.c:6643 __ast_pbx_run: Channel 'OutgoingSpoolFailed' sent to invalid extension but no invalid handler: context,exten,priority=contex-for-tests-recorded,failed,1
> [INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid) VALUES ({ ts '2015-04-21 09:17:21' },'89105554433','89105554433','start','SUB_CALLBACK','Local/1@callback-0000000f;2','H323/alcatel-74','Dial','H323/5160@alcatel,90,t|5|M(privet)',30,0,'NO ANSWER',3,'1429597041.113')]
== Begin MixMonitor Recording OutgoingSpoolFailed
> [INSERT INTO cdr (calldate,dst,dcontext,channel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid,filename,realdst) VALUES ({ ts '2015-04-21 09:17:51' },'failed','contex-for-tests','OutgoingSpoolFailed','Goto','contex-for-tests-recorded,failed,1',0,0,'NO ANSWER',3,'1429597071.116','1429597071.116-2015-04-21-09_17--failed.mp3','failed')]
[Apr 21 09:17:51] NOTICE[4221]: pbx_spool.c:389 attempt_thread: Call failed to go through, reason (3) Remote end Ringing
[Apr 21 09:17:51] NOTICE[4221]: pbx_spool.c:392 attempt_thread: Queued call to Local/1@callback expired without completion after 0 attempts
ЗЫ
Звонок создается колл-файлом, поэтому он инициарован через Local-channel
Связь с алкатель через chan_h323, однако и сип ведет себя аналогично.
Можно конечно размножить кусок диаплана с рандомным звонком, но не хочется ставить костыль.