Страница 1 из 1

Обзвон операторов в цикле.

Добавлено: 15 сен 2014, 15:24
Zaak
Имеется список номеров операторов, и номер клиента. Нужно обзвонить поочередно операторов и того, кто ответит, соединить с клиентом. По сути самая тривиальная задача, но что-то застопорился. Всё работает отлично, и дозвон идёт до следующего оператора, если первый занят, и с клиентом соединяется. Но, если первый оператор просто не берёт трубку, за время указанное в 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'

Re: Обзвон операторов в цикле.

Добавлено: 15 сен 2014, 17:07
Zaak
Дурак я, вечная проблема моя...

При создании call-файла в WaitTime для канала указал 10 секунд, и вызов оператора жду 10 секунд, вот поэтому канал завершает свою работу и вызов отменяется.

Ладно сам с собой поговорил. Бывает... =(