VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Отбой после второго цикла по экстеншену.

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
ronaldo-nn
Сообщения: 3
Зарегистрирован: 24 мар 2015, 11:00

Отбой после второго цикла по экстеншену.

Сообщение ronaldo-nn »

Добрый день уважаемые форумчане!
Мне нужно настроить звонок на случайному номер из определенного списка. Причем звонок будет уходить через транк на стороннюю атс (фирмы 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})
Здесь rnd.php случайным образом выбирает номер из массива. В случае дозвона воспроизводим сообщение с помощью макроса “privet”. Если из транка вернулся статус занято, перегрузка и т.д. заново генерим номер и снова пытаемся дозвонится. По данному алгоритму заработало, за исключением небольшого бага. Идет звонок – агент не берет трубку, диаплан отрабатывает заново и идет звонок второму случайному агенту. Если и второй агент не берет трубку, тогда происходит отбой. А может быть это вовсе не баг, а защита от дурака такая. Вот что происходит в консоли в это время:

Код: Выделить всё

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, однако и сип ведет себя аналогично.
Можно конечно размножить кусок диаплана с рандомным звонком, но не хочется ставить костыль.
ronaldo-nn
Сообщения: 3
Зарегистрирован: 24 мар 2015, 11:00

Re: Отбой после второго цикла по экстеншену.

Сообщение ronaldo-nn »

Это называется "утро вечера мудренее" и дело было не в бабине. Все на самом деле работает. Просто к колл-файле стоял waittime, про который я совершенно забыл. Поэтому звонок и отбивался. Тему можно удалить/закрыть.
Glukinho
Сообщения: 661
Зарегистрирован: 07 янв 2011, 20:05

Re: Отбой после второго цикла по экстеншену.

Сообщение Glukinho »

По-моему, вместо аги лучше сделать очередь:
queues.conf

[alcatel]
strategy = random
announce = text-for-operator
...
member => H323/1234@alcatel
member => H323/5678@alcatel
...
Очередь вызывать через
exten => blabla,1,Queue(alcatel)
Ну, может еще Answer перед Queue вставить.
ronaldo-nn
Сообщения: 3
Зарегистрирован: 24 мар 2015, 11:00

Re: Отбой после второго цикла по экстеншену.

Сообщение ronaldo-nn »

Мне кажется для очереди нужно регистрироваться на астериске, чтобы обработать вызов. Не уверен, что это прокатит через алкатель.
ded
Сообщения: 15628
Зарегистрирован: 26 авг 2010, 19:00

Re: Отбой после второго цикла по экстеншену.

Сообщение ded »

Нет.
У очереди есть статические мемберы (как Вам посоветовал коллега Glukinho) и динамические. Вот последним надо регистрироваться (логиниться) чтобы обрабатывать очередь.
Glukinho
Сообщения: 661
Зарегистрирован: 07 янв 2011, 20:05

Re: Отбой после второго цикла по экстеншену.

Сообщение Glukinho »

По сути, вы в вашем диалплане написали сценарий для очереди со стратегией random. Лучше, конечно, воспользоваться уже встроенным функционалом приложением Queue().
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH