Обзвон операторов в цикле.
Добавлено: 15 сен 2014, 15:24
Имеется список номеров операторов, и номер клиента. Нужно обзвонить поочередно операторов и того, кто ответит, соединить с клиентом. По сути самая тривиальная задача, но что-то застопорился. Всё работает отлично, и дозвон идёт до следующего оператора, если первый занят, и с клиентом соединяется. Но, если первый оператор просто не берёт трубку, за время указанное в dial(), DIALSTATUS становится равен CANCEL, идёт дозвон следующему оператору и тут же выскакивает ошибка. Выкладываю скрипт, который создаёт call-файл, а также диалплан, и вывод в консоль.
диалплан:
Лог:
Код: Выделить всё
#!/bin/sh
ELEMENTS=$#
args=("$@")
numbers=""
for ((i=1;i<$ELEMENTS;i++)); do
if (( "$i" == "$ELEMENTS-1" ))
then
numbers=${numbers}${args[$i]}
else
numbers=${numbers}${args[$i]}','
fi
done
spooldir=/var/spool/asterisk
echo "Channel:Local/111@grouptest
MaxRetries: 0
RetryTime: 5
WaitTime: 10
Context: grouptest-client
Extension: s
Priority: 1
Set: client=$1
Set: numbers=$numbers" > $spooldir/tmp/call
chmod 777 $spooldir/tmp/call
chown asterisk.asterisk $spooldir/tmp/call
mv $spooldir/tmp/call $spooldir/outgoing
echo "call $numbers"
exit 0
Код: Выделить всё
[grouptest];начальный контекст
exten => 111,1,Set(i=0)
exten => 111,n,Set(numbers=${numbers})
exten => 111,n,goto(s,1)
exten => s,1,NoOp("Номера операторов: ${numbers}")
exten => s,n(loop),Set(i=$[${i} + 1]) ; смотрим по номеру
exten => s,n,Set(call_now=${CUT(numbers,\,,${i})}) ; берем и-тый номер.
exten => s,n,GotoIF($[ "${call_now}" == "" ]?end); номера кончились
exten => s,n,NoOp("------${call_now}------")
exten => s,n,Dial(SIP/${call_now},10)
exten => s,n,Goto(${DIALSTATUS},1)
exten => h,1,NoOp("Статус звонка: ${DIALSTATUS} Статус HangUp: ${HANGUPCAUSE}")
exten => h,n,Goto(${DIALSTATUS},1)
exten => s,n(end),Hangup; больше нет номеров
exten => BUSY,1,Goto(s,loop)
exten => CANCEL,1,Goto(s,loop)
exten => CONGESTION,1,Goto(s,loop)
exten => FAIL,1,Goto(s,loop)
exten => NOANSWER,1,Goto(s,loop)
exten => CHANUNAVAIL,1,Goto(s,loop)
exten => ANSWER,1,Goto(grouptest-client,s,1)
exten => ANSWERED,1,Goto(grouptest-client,s,1)
[grouptest-client]
exten => s,1,Set(client=${client})
exten => s,n,NoOp("Звоним клиенту, номер: ${client}")
exten => s,n,Wait(2)
exten => s,n,Playback(hello)
exten => s,n,Dial(IAX2/TrunkToOutServer/${client},45)
exten => s,n,Hangup
Код: Выделить всё
-- Attempting call on Local/111@grouptest for s@grouptest-client:1 (Retry 1)
-- Executing [111@grouptest:1] Set("Local/111@grouptest-00000066;2", "i=0") in new stack
-- Executing [111@grouptest:2] Set("Local/111@grouptest-00000066;2", "numbers=8000,8001") in new stack
-- Executing [111@grouptest:3] Goto("Local/111@grouptest-00000066;2", "s,1") in new stack
-- Goto (grouptest,s,1)
-- Executing [s@grouptest:1] NoOp("Local/111@grouptest-00000066;2", ""Номера операторов: 8000,8001"") in new stack
-- Executing [s@grouptest:2] Set("Local/111@grouptest-00000066;2", "i=1") in new stack
-- Executing [s@grouptest:3] Set("Local/111@grouptest-00000066;2", "call_now=8000") in new stack
-- Executing [s@grouptest:4] GotoIf("Local/111@grouptest-00000066;2", "0?end") in new stack
-- Executing [s@grouptest:5] NoOp("Local/111@grouptest-00000066;2", ""------8000------"") in new stack
-- Executing [s@grouptest:6] Dial("Local/111@grouptest-00000066;2", "SIP/8000,10") in new stack
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called SIP/8000
-- SIP/8000-00000053 is ringing
== Spawn extension (grouptest, s, 6) exited non-zero on 'Local/111@grouptest-00000066;2'
-- Executing [h@grouptest:1] NoOp("Local/111@grouptest-00000066;2", ""Статус звонка: CANCEL Статус HangUp: 0"") in new stack
-- Executing [h@grouptest:2] Goto("Local/111@grouptest-00000066;2", "CANCEL,1") in new stack
-- Goto (grouptest,CANCEL,1)
-- Executing [CANCEL@grouptest:1] Goto("Local/111@grouptest-00000066;2", "s,loop") in new stack
-- Goto (grouptest,s,2)
-- Executing [s@grouptest:2] Set("Local/111@grouptest-00000066;2", "i=2") in new stack
-- Executing [s@grouptest:3] Set("Local/111@grouptest-00000066;2", "call_now=8001") in new stack
-- Executing [s@grouptest:4] GotoIf("Local/111@grouptest-00000066;2", "0?end") in new stack
-- Executing [s@grouptest:5] NoOp("Local/111@grouptest-00000066;2", ""------8001------"") in new stack
-- Executing [s@grouptest:6] Dial("Local/111@grouptest-00000066;2", "SIP/8001,10") in new stack
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called SIP/8001
== Spawn extension (grouptest, s, 6) exited non-zero on 'Local/111@grouptest-00000066;2'