Asterisk拨号方案:如何检测呼叫是否已成功接通?
Asterisk拨号方案中检测呼叫接通状态的解决方法
兄弟,你这个问题我之前帮不少同行排查过,其实你写的代码框架已经找对方向了,只是在语法细节和变量使用的地方没摸透。
首先明确一点:Dial动作执行后,${DIALSTATUS}变量会被自动设置,其中ANSWER就是呼叫成功接通的状态值,你想跳转到s-ANSWER分支的思路完全正确,只是原代码里的分支写法有语法错误。
你可能踩的坑
- 分支语法错误:原代码里的
exten => s-ANSWER(do something)是错误的,Asterisk的拨号方案中,分机号后面必须指定优先级(比如,1,),然后才是要执行的动作。 - 缺少调试步骤:如果没看到预期效果,最好先打印出
${DIALSTATUS}的值,确认Dial动作返回的状态到底是什么。 - 动作太简短:如果接通后立即执行Hangup,可能你根本没机会看到状态变化,可以加个播放提示音或者等待动作来验证。
修正后的完整拨号方案示例
exten => s,7,Dial(${ARG1},20,rt) ; 振铃20秒,允许被叫挂机 exten => s,8,NoOp(当前DIALSTATUS状态: ${DIALSTATUS}) ; 调试用,打印当前状态 exten => s,9,Goto(s-${DIALSTATUS},1) ; 根据状态跳转 ; 呼叫成功接通的分支 exten => s-ANSWER,1,NoOp(呼叫已成功接通!) exten => s-ANSWER,n,Playback(thank-you) ; 播放提示音验证 exten => s-ANSWER,n,Hangup() ; 其他状态分支 exten => s-NOANSWER,1,NoOp(无人接听) exten => s-NOANSWER,n,Hangup() exten => s-BUSY,1,NoOp(线路忙) exten => s-BUSY,n,Hangup() exten => s-CHANUNAVAIL,1,NoOp(通道不可用) exten => s-CHANUNAVAIL,n,Hangup() exten => s-CONGESTION,1,NoOp(线路拥塞) exten => s-CONGESTION,n,Hangup()
额外小技巧
除了${DIALSTATUS},你还可以用${ANSWEREDTIME}变量获取通话时长(单位是秒),如果这个变量有值,就说明呼叫确实接通过,能进一步辅助验证状态。
内容的提问来源于stack exchange,提问作者Jb1128
相关产品推荐
相关产品推荐

