我在/etc/星号/extensions_custom.conf文件中有一个扩展名:
exten => _XXXX,1,NoOp("-- from internal custom --")
exten => _XXXX,n,Set(CURL_RESULT=${CURL(https://your.domain.com/sip_webhook?callid=${EXTEN}&sourceid=${CALLERID(num)})})
exten => _XXXX,n,Wait(3)
exten => _XXXX,n,Dial(PJSIP/${EXTEN},60)
exten => _XXXX,n,Hangup()
第二行将请求发送到服务器中的webhook,并将响应存储在CURL_RESULT 中
我只想在CURL_RESULT成功的情况下执行拨号是否有任何方法可以实现扩展的条件执行?类似于:
if(CURL_RESULT=="OK")
exten => _XXXX,n,Dial(PJSIP/${EXTEN},60)
else
exten => _XXXX,n,Hangup()
是的,正如arheops所指出的,这实际上是dialplan中一个常见的内置概念:条件执行和条件分支。
有很多方法可以做到这一点-给你一些想法:
#1:如果为真,则有条件执行
exten => _XXXX,1,ExecIf($["${CURL_RESULT}" = "OK" ]?Dial(PJSIP/${EXTEN},60))
same => n,Hangup()
#2:条件分支如果错误
exten => _XXXX,1,GotoIf($["${CURL_RESULT}" != "OK" ]?exit)
same => n,Dial(PJSIP/${EXTEN},60)
same => n(exit),Hangup()
#3:条件分支(如果为真/假):
exten => _XXXX,1,GotoIf($["${CURL_RESULT}" = "OK" ]?dial:exit)
same => n(dial),Dial(PJSIP/${EXTEN},60)
same => n(exit),Hangup()
最后一个例子在这种情况下没有添加任何内容,但提供一个正确和错误的标签通常是有用的。
如果您希望Asterisk中的trueIf/Else应用程序与传统编程语言中的应用程序类似,您可以使用If模块:https://github.com/InterLinked1/phreakscript/blob/master/apps/app_if.c(这已经合并到Asterisk中,您不需要单独进行修补)。
它目前还没有包含在主线Asterisk中,所以您需要将其放入源代码中,编译并重新安装。
有了这个,你可以做一些类似的事情:
same => n,If($["${CURL_RESULT}" = "OK" ])
same => n,Dial(PJSIP/${EXTEN},60)
same => n,NoOp(${DIALSTATUS})
same => n,Else()
same => n,Playback(goodbye) ; do something else
same => n,EndIf()
same => n,Hangup() ; something after both
在特定情况下,每种类型的条件语法往往比其他类型的语法工作得稍微好一些。