у меня не назначается переменная ${HANGUPCAUSE}, присваеваю ей "19" а когда вывожу то она "0"
romariosar (Feb 12 '14)editЭто происхходит потому, что аддпак отдает
Got SIP response 480 "Temporarily Unavailable" back from XXX.XXX.XXX.XXX
"Dial failed for some reason with DIALSTATUS = CONGESTION and HANGUPCAUSE = 19"
а должен
Got SIP response 486 "Busy Here" back from XXX.XXX.XXX.XXX
Второй случай с точностью до наоборот:
Вы решили сделать несколько транков на аддпак и осуществляете перебор транков на астериске... В этом случае, если порт аддпака, с которого начинается перебор, занят(например порт 0/0), то перебор на следующий транк не переходит... Перебор заканчивается и слышно короткие гудки, потому что астериск получает ответ от аддпака:
Got SIP response 486 "Busy Here" back from XXX.XXX.XXX.XXX
А должно приходить - транк недоступен, а не BUSY :
Got SIP response 480 "Temporarily Unavailable" back from XXX.XXX.XXX.XXX
На аддпаке эта проблема не решается никак... во всяком, случаае, в документации я не нашел... Но можно решить ее на астериске. Используйте ремап DIALSTATUS и HANGUPCAUSE
Здесь есть хороший пример Example 3: Macro for handling hangupcause
Для случая с эластиксом, сделайте так:
В extensions_custom.conf опишите контекст [macro-dial-result]. Вместо НОМЕР_ТРАНКА_НА_АДДПАК подставьте свой номер
[macro-dial-result]
; Handles Disconnect Cause Codes
; @param ${ARG1} - cause code (optional - will try to use DIALSTATUS or HANGUPCAUSE if not set)
; @usage exten => s,1,Macro(dial-result,${HANGUPCAUSE})
exten => s,1,NoOp(Macro-dial-result)
exten => s,n,GotoIf($[${DIAL_TRUNK} != НОМЕР_ТРАНКА_НА_АДДПАК]?noremap)
;если транков несколько:
;exten => s,n,GotoIf($[$[${DIAL_TRUNK} != НОМЕР_1_ТРАНКА_НА_АДДПАК] & $[${DIAL_TRUNK} != НОМЕР_2_ТРАНКА_НА_АДДПАК]]?noremap)
exten => s,n,NoOp(DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
exten => s,n,GotoIf($[${ARG1}=17]?rc-${ARG1},1)
exten => s,n,GotoIf($[${ARG1}=19]?rc-${ARG1},1)
exten => s,n(noremap),NoOp(Not changed DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
; remapping USER BUSY to CONGESTION
exten => rc-17,1,Set(HANGUPCAUSE=19)
exten => rc-17,n,Set(DIALSTATUS=CONGESTION)
; remapping CONGESTION to USER BUSY
exten => rc-19,1,Set(HANGUPCAUSE=17)
exten => rc-19,n,Set(DIALSTATUS=BUSY)
Перепишите контекст [macro-dialout-trunk] из extensions_additional.conf в extensions_override_freepbx.conf и добавьте строку:
exten => s,n,Macro(dial-result,${HANGUPCAUSE})
перед строкой (она там в двух местах, надо перед обеими)
exten => s,n,Goto(s-${DIALSTATUS},1)
у меня не назначается переменная ${HANGUPCAUSE}, присваеваю ей "19" а когда вывожу то она "0"
romariosar (Feb 12 '14)editу меня не стаивться переменная Hangupcause диалплан:
[incoming]
exten => 104,1,Noop(incomint start)
exten => 104,n,Set(GROUP()=test)
exten => 104,n,GotoIf($[${GROUP_COUNT(test)} > 1]?busy,s,1)
exten => 104,n,NoOp(GROUP_COUNT(test) = ${GROUP_COUNT(test)})
exten => 104,n,Answer
exten => 104,n,BackGround(hello-world)
exten => 104,n,WaitExten(5)
exten => 1,1,Dial(SIP/200)
exten => 2,1,Dial(SIP/201)
exten => h,1,HangUp
;end of incoming
[busy]
exten => s,1,Set(DIALSTATUS=CONGESTION)
exten => s,n,Set(HANGUPCAUSE=19)
exten => s,n,NoOp(DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
; end of busy
вот лог звонка когда звонит 2 абонент:
-- Executing [104@incoming:1] NoOp("SIP/trunk-00000016", "incomint start") in new stack
-- Executing [104@incoming:2] Set("SIP/trunk-00000016", "GROUP()=test") in new stack
-- Executing [104@incoming:3] GotoIf("SIP/trunk-00000016", "1?busy,s,1") in new stack
-- Goto (busy,s,1)
-- Executing [s@busy:1] Set("SIP/trunk-00000016", "DIALSTATUS=CONGESTION") in new stack
-- Executing [s@busy:2] Set("SIP/trunk-00000016", "HANGUPCAUSE=19") in new stack
-- Executing [s@busy:3] NoOp("SIP/trunk-00000016", "DIALSTATUS = CONGESTION and HANGUPCAUSE = 0") in new stack
-- Auto fallthrough, channel 'SIP/trunk-00000016' status is 'CONGESTION'
почему hangupcause = 0? я же вроде поставил что она 19...
[СЧИТАЙ РЕШЕНО]
назначаю значение hangupcause вот так:
exten => s,n,Hangup(19)
все выводится правильно теперь, но мне бы хотелось эту переменную задавать с помощью SET. а то у меня не задается.
теперь у меня такой диалплан
[incoming]
exten => 104,1,Noop(incomint start)
exten => 104,n,Set(GROUP()=test)
exten => 104,n,GotoIf($[${GROUP_COUNT(test)} > 1]?busy,s,1)
exten => 104,n,NoOp(GROUP_COUNT(test) = ${GROUP_COUNT(test)})
exten => 104,n,Answer
exten => 104,n,BackGround(hello-world)
exten => 104,n,WaitExten(5)
exten => 1,1,Dial(SIP/200)
exten => 2,1,Dial(SIP/201)
exten => t,1,Goto(104,2)
exten => i,1,Goto(104,2)
exten => h,1,HangUp
;end of incoming
[busy]
exten => s,1,Set(DIALSTATUS=CONGESTION)
exten => s,n,Hangup(19)
exten => h,1,NoOp(dialstatus = ${DIALSTATUS} and hangupcause = ${HANGUPCAUSE})
; end of busy
http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial
Note that causecode 0 is effectively a notice that the causecode has not been set.
Если не было вызова приложения Dial и, соответственно, не было кода причины завершения звонка, то невозможно изменить HANGUPCAUSE с помощью Set...
Если же был вызов Dial, то он помещает hangup result code в переменную канала HANGUPCAUSE, и после этого можно менять его с помощью Set...
То ли это баг, то ли фича астериска...
Какая версия астера у Вас? Проверил на 1.6, такой же результат...
Olpag (Feb 14 '14)edit11.5 походу это фича:) хотя очень жаль. Буду теперь через SET устанавливать только после DIAL.
romariosar (Feb 14 '14)editЗадан: Nov 29 '12
Просмотрен: 4,514 раз
Обновлен: Feb 12 '14
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.