ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Spawn extension

Проблемы и их решения Asterisk как такового

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

Spawn extension

Сообщение wolverin » 10 янв 2023, 07:35

Приветствую.

Помогите, пожалуйста, разобраться с планом набора (чужой) - суть проблемы: при повторном звонке в течении 2х минут телефония сбрасывает с сообщением
Spawn extension (int, 200, 100) exited non-zero on 'Local/200@int-000000e6;2'

потом звонки снова проходят

сам план из extensions.conf
Код: выделить все
[int]
exten => 200,1,GotoIf($["${num1}" = ""]?110)
exten => 200,n,Set(GLOBAL(DOM)=${num1})
exten => 200,n,Set(GLOBAL(DOMdtime)=${STRFTIME(${EPOCH},,%s)})
exten => 200,n,Set(GLOBAL(${num1})=${CHANNEL})
exten => 200,n,Set(GLOBAL(DOMchan)=${CHANNEL})
exten => 200,n,GotoIf($["${num1:1}" >= "9999999900"]?100)
exten => 200,n,Dial(IAX2/блабла/${num1},120,gS(240))
exten => 200,n,Goto(d-${DIALSTATUS},1)
exten => 200,100,Dial(SIP/${num1},120,gS(240))
exten => 200,n,Goto(d-${DIALSTATUS},1)
exten => 200,110,Hangup
exten => 210,1,GotoIf($["${num2}" = ""]:110)
exten => 210,n,Set(GLOBAL(USR1)=${num2})
exten => 210,n,Set(GLOBAL(USR2)=${num3})
exten => 210,n,Set(GLOBAL(USR3)=${num4})
exten => 210,n,Set(GLOBAL(USR1dtime)=${STRFTIME(${EPOCH},,%s)})
exten => 210,n,Set(GLOBAL(USR2dtime)=${STRFTIME(${EPOCH},,%s)})
exten => 210,n,Set(GLOBAL(USR3dtime)=${STRFTIME(${EPOCH},,%s)})
exten => 210,n,GotoIf($["${num2:1}" >= "9999999900"]?100)
exten => 210,n,Dial(IAX2/блабла/${num2}&IAX2/блабла/${num3}&IAX2/блабла/${num4},120,gS(120))
exten => 210,n,Goto(s-${DIALSTATUS},1)
exten => 210,100,Dial(SIP/${num2},120,gS(240))
exten => 210,n,Goto(s-${DIALSTATUS},1)
exten => 210,110,Hangup
exten => hangc,1,System(/usr/sbin/asterisk -rx "channel request hangup ${CHANNEL}"); ${GLOBAL(DOMchan)}")
exten => hanga,1,System(/usr/sbin/asterisk -rx "channel request hangup all")
exten => d-ANSWER,1,NoOp(Duration of call is ${ANSWEREDTIME})
exten => d-ANSWER,n,Goto(hanga,1)
exten => d-NOANSWER,1,Goto(hanga,1)
exten => d-CONGESTION,1,Goto(hanga,1)
exten => d-CANCEL,1,Goto(hanga,1)
exten => d-BUSY,1,Goto(hanga,1)
exten => s-ANSWER,1,Goto(hanga,1)
exten => s-BUSY,1,Goto(hanga,1)
exten => s-CONGESTION,1,Goto(hanga,1)
exten => 300,1,Answer()
exten => 300,2,NoOp(${MATH(${STRFTIME(${EPOCH},,%s)}-${GLOBAL(USR1dtime)})})
exten => 300,3,NoOp(${CHANNEL:6:3})
exten => 300,4,Set(__CONFNO=${num1})
exten => 300,5,NoOp(${CONFBRIDGE_INFO(parties,${CONFNO})})
exten => 300,6,GotoIf($["${CHANNEL:6:3}" = "200"]?7:9)
exten => 300,7,Set(GLOBAL(DTMFSIG-${num1})=${CHANNEL})
exten => 300,8,GotoIf($["${CONFBRIDGE_INFO(parties,${CONFNO})}" >= "1"]?101:120)
exten => 300,9,GotoIf($["${CHANNEL:6:3}" = "210"]?10:120)
exten => 300,10,GotoIf($["${MATH(${STRFTIME(${EPOCH},,%s)}-${GLOBAL(USR1dtime)})}" > "3"]?11:101)
exten => 300,11,GotoIf($["${CONFBRIDGE_INFO(parties,${CONFNO})}" >= "1"]?101:120)
exten => 300,12,GotoIf($["${CHANNEL:6:3}" = "202"]?13:120)
exten => 300,13,GotoIf($["${MATH(${STRFTIME(${EPOCH},,%s)}-${GLOBAL(USR2dtime)})}" > "3"]?14:101)
exten => 300,14,GotoIf($["${CONFBRIDGE_INFO(parties,${CONFNO})}" >= "1"]?101:120)
exten => 300,15,GotoIf($["${CHANNEL:6:3}" = "202"]?16:120)
exten => 300,16,GotoIf($["${MATH(${STRFTIME(${EPOCH},,%s)}-${GLOBAL(USR3dtime)})}" > "3"]?17:101)
exten => 300,17,GotoIf($["${CONFBRIDGE_INFO(parties,${CONFNO})}" >= "1"]?101:120)
exten => 300,101,SendDTMF(w9,,700,${GLOBAL(DTMFSIG-${num1})})
;exten => 300,101,SendDTMF(w9,,700,)
exten => 300,n,Goto(120)
exten => 300,120,GotoIf($["${GLOBAL(USR1)}" != ""]?130:300)
exten => 300,130,ConfBridge(${CONFNO})
exten => 300,n,Goto(300)
exten => 300,300,System(/usr/sbin/asterisk -rx "channel request hangup ${CHANNEL}")


лог частично "целиком"
Код: выделить все
  == Manager 'call' logged off from 127.0.0.1
    -- Executing [210@int:1] GotoIf("Local/210@int-000000e7;2", "0:110") in new stack
    -- Executing [210@int:2] Set("Local/210@int-000000e7;2", "GLOBAL(USR1)=телефон") in new stack
  == Setting global variable 'USR1' to 'телефон'
    -- Executing [210@int:3] Set("Local/210@int-000000e7;2", "GLOBAL(USR2)=") in new stack
  == Setting global variable 'USR2' to ''
    -- Executing [210@int:4] Set("Local/210@int-000000e7;2", "GLOBAL(USR3)=") in new stack
  == Setting global variable 'USR3' to ''
    -- Executing [210@int:5] Set("Local/210@int-000000e7;2", "GLOBAL(USR1dtime)=1673259523") in new stack
  == Setting global variable 'USR1dtime' to '1673259523'
    -- Executing [210@int:6] Set("Local/210@int-000000e7;2", "GLOBAL(USR2dtime)=1673259523") in new stack
  == Setting global variable 'USR2dtime' to '1673259523'
    -- Executing [210@int:7] Set("Local/210@int-000000e7;2", "GLOBAL(USR3dtime)=1673259523") in new stack
  == Setting global variable 'USR3dtime' to '1673259523'
    -- Executing [210@int:8] GotoIf("Local/210@int-000000e7;2", "0?100") in new stack
    -- Executing [210@int:9] Dial("Local/210@int-000000e7;2", "IAX2/блабла/телефон&IAX2/блабла/&IAX2/блабла
    -- Setting call duration limit to 120.000 seconds.
[Jan  9 15:18:43] WARNING[19683][C-000001c2]: app_dial.c:2406 dial_exec_full: Skipping dialing interface 'IAX2/блабла
    -- Called IAX2/блабла/телефон
    -- Called IAX2/блабла/
[Jan  9 15:18:43] WARNING[22843][C-000001c1]: chan_sip.c:10110 process_sdp: Ignoring video stream offer because po
       > 0x7f6cd4067900 -- Strict RTP learning after remote address set to: 192.168.88.44:7078
    -- SIP/ic02c00081a52426ba-00000041 answered Local/200@int-000000e6;2
       > Channel Local/200@int-000000e6;1 was answered
    -- Executing [300@int:1] Answer("Local/200@int-000000e6;1", "") in new stack
    -- Executing [300@int:2] NoOp("Local/200@int-000000e6;1", "0.000000") in new stack
    -- Executing [300@int:3] NoOp("Local/200@int-000000e6;1", "200") in new stack
    -- Executing [300@int:4] Set("Local/200@int-000000e6;1", "__CONFNO=ic02c00081a52426ba") in new stack
    -- Executing [300@int:5] NoOp("Local/200@int-000000e6;1", "0") in new stack
    -- Executing [300@int:6] GotoIf("Local/200@int-000000e6;1", "1?7:9") in new stack
    -- Goto (int,300,7)
    -- Executing [300@int:7] Set("Local/200@int-000000e6;1", "GLOBAL(DTMFSIG-ic02c00081a52426ba)=Local/200@int-000
  == Setting global variable 'DTMFSIG-ic02c00081a52426ba' to 'Local/200@int-000000e6;1'
    -- Executing [300@int:8] GotoIf("Local/200@int-000000e6;1", "0?101:120") in new stack
    -- Goto (int,300,120)
    -- Executing [300@int:120] GotoIf("Local/200@int-000000e6;1", "1?130:300") in new stack
    -- Goto (int,300,130)
    -- Executing [300@int:130] ConfBridge("Local/200@int-000000e6;1", "ic02c00081a52426ba") in new stack
    -- Call accepted by ip (format ulaw)
    -- Format for call is (ulaw)
    -- Hungup 'IAX2/блабла-3294'
       > 0x7f6cd4067900 -- Strict RTP switching source address to ip:7078

.........................................

    -- IAX2/блабла-2782 is making progress passing it to Local/210@int-000000e7;2
    -- IAX2/блабла-2782 answered Local/210@int-000000e7;2
       > Channel Local/210@int-000000e7;1 was answered
    -- Executing [300@int:1] Answer("Local/210@int-000000e7;1", "") in new stack
    -- Executing [300@int:2] NoOp("Local/210@int-000000e7;1", "7.000000") in new stack
    -- Executing [300@int:3] NoOp("Local/210@int-000000e7;1", "210") in new stack
    -- Executing [300@int:4] Set("Local/210@int-000000e7;1", "__CONFNO=ic02c00081a52426ba") in new stack
    -- Executing [300@int:5] NoOp("Local/210@int-000000e7;1", "1") in new stack
    -- Executing [300@int:6] GotoIf("Local/210@int-000000e7;1", "0?7:9") in new stack
    -- Goto (int,300,9)
    -- Executing [300@int:9] GotoIf("Local/210@int-000000e7;1", "1?10:120") in new stack
    -- Goto (int,300,10)
    -- Executing [300@int:10] GotoIf("Local/210@int-000000e7;1", "1?11:101") in new stack
    -- Goto (int,300,11)
    -- Executing [300@int:11] GotoIf("Local/210@int-000000e7;1", "1?101:120") in new stack
    -- Goto (int,300,101)
    -- Executing [300@int:101] SendDTMF("Local/210@int-000000e7;1", "w9,,700,Local/200@int-000000e6;1") in new sta
    -- Executing [300@int:102] Goto("Local/210@int-000000e7;1", "120") in new stack
    -- Goto (int,300,120)
    -- Executing [300@int:120] GotoIf("Local/210@int-000000e7;1", "1?130:300") in new stack
    -- Goto (int,300,130)
    -- Executing [300@int:130] ConfBridge("Local/210@int-000000e7;1", "ic02c00081a52426ba") in new stack
[Jan  9 15:18:52] NOTICE[22843]: chan_sip.c:28092 handle_request_register: Registration from '888 <sip:888@ip
    -- Hungup 'IAX2/блабла-2782'
    -- Executing [210@int:10] Goto("Local/210@int-000000e7;2", "s-ANSWER,1") in new stack
    -- Goto (int,s-ANSWER,1)
    -- Executing [s-ANSWER@int:1] Goto("Local/210@int-000000e7;2", "hanga,1") in new stack
    -- Goto (int,hanga,1)
    -- Executing [hanga@int:1] System("Local/210@int-000000e7;2", "/usr/sbin/asterisk -rx "channel request hangup
    -- Remote UNIX connection
    -- Remote UNIX connection disconnected
  == Spawn extension (int, 200, 100) exited non-zero on 'Local/200@int-000000e6;2'
wolverin
 
Сообщений: 94
Зарегистрирован: 30 ноя 2011, 11:35

Re: Spawn extension

Сообщение ded » 10 янв 2023, 13:12

1) Обращаться вам лучше к чужому (Alien), который написал этот код. Или - раздел Бизнес, платный суппорт.

2) Общие рекомендации: код мутный, содержит много нелепостей и нехороших переходов типа
300,n,Goto(300)
Представить, что программный код такого рода написан на С и потом скомпиллирован в бинарник, который себя ведёт вот так непредсказуемо - страшно подумать!

3) Вместо переходов GotoIf.... 100)
лучше бы использовать ExecIf чтобы минимизировать возможные петли (бесконечные циклы).

4) Вместо
System(/usr/sbin/asterisk -rx "channel request hangup ${CHANNEL}")
используйте SoftHangup (core show application SoftHangup)

5) Выпадает в
== Spawn extension (int, 200, 100) exited non-zero on 'Local/200@int-000000e6;2'
скорее всего потому, что на стороне SIP/${num1} уже происходит Cancel или Hangup, тогда на следующий 101-й шаг
Goto(d-${DIALSTATUS},1) уже нет перехода - Spawn, вывалились из диал-плана.

[int]
exten => 200,1,GotoIf($["${num1}" = ""]?110)
exten => 200,n,Set(GLOBAL(DOM)=${num1})
exten => 200,n,Set(GLOBAL(DOMdtime)=${STRFTIME(${EPOCH},,%s)})
exten => 200,n,Set(GLOBAL(${num1})=${CHANNEL})
exten => 200,n,Set(GLOBAL(DOMchan)=${CHANNEL})
exten => 200,n,GotoIf($["${num1:1}" >= "9999999900"]?100)
exten => 200,n,Dial(IAX2/блабла/${num1},120,gS(240))
exten => 200,n,Goto(d-${DIALSTATUS},1)
exten => 200,100,Dial(SIP/${num1},120,gS(240))
exten => 200,n,Goto(d-${DIALSTATUS},1)
exten => 200,110,Hangup
ded
 
Сообщений: 15803
Зарегистрирован: 26 авг 2010, 19:00

Re: Spawn extension

Сообщение wolverin » 10 янв 2023, 13:23

спасибо за помощь! разбираюсь в вашем сообщении...
переписывать это конечно не нужно, просто найти почему пауза (в течении 1.5-2 минуты не соединяет абонентов) и убрать ее.

пысы. "чужого победил хыщник" - точнее свалил писатель сего кода в неизвестном направлении.
wolverin
 
Сообщений: 94
Зарегистрирован: 30 ноя 2011, 11:35

Re: Spawn extension

Сообщение Zavr2008 » 10 янв 2023, 14:47

exten => 200,n,Set(GLOBAL(${num1})=${CHANNEL})


Вот из-за подобного у Вас лажа.
У Вас в самом начале глобальная переменная постоянно юзается на запись.
Представьте себе что 2 звонка приходит и не понятно кто там чего наустанавливает. И естественно при втором звонке эта несчастная num1 уже коробится в первом..

Переделывать нужно на использование скрипта внешнего со своей БД (хоть mysql, хоть redis) чтобы была потоконезависимость и возможность приема параллельно 2х звонков.
Понятно почему проблема при повторном звонке...

Чем быстрее этот г. код вынесете в мусорку, тем будет меньше проблем.
Российские шлюзы E1 Alvis-GW. Модернизация УПАТС с E1, Установка FreePBX, Системы антифрод "в разрыв" потоков E1 PRI / SS#7 ISUP.
Аватар пользователя
Zavr2008
 
Сообщений: 2161
Зарегистрирован: 27 янв 2011, 01:35

Re: Spawn extension

Сообщение ded » 10 янв 2023, 14:54

Вот ваша пауза -
exten => 200,n,Dial(IAX2/блабла/${num1},120,gS(240))

и чтобы понять, почему не соединяет - включайте дебаг вашего транка IAX2/блабла и смотрите что оттуда прилетает.
Zavr2008, надо же, углядел глобальную переменную! А я не увидел.

Полезно посмотреть содержимое перед вызововм
exten => 200,n,NoOp(Numer is ${num1})
exten => 200,n,Dial(IAX2/блабла/${num1},120,gS(240))
ded
 
Сообщений: 15803
Зарегистрирован: 26 авг 2010, 19:00

Re: Spawn extension

Сообщение wolverin » 11 янв 2023, 09:05

Большое спасибо, ded и Zavr2008

exten => 200,n,Dial(IAX2/блабла/${num1},120,gS(240))
На это я тоже смотрел с самого начала, но не понял что проблема в переменной при 2х звонках.
wolverin
 
Сообщений: 94
Зарегистрирован: 30 ноя 2011, 11:35


Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH