You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:37:00