Asterisk 13技术问询:获取通话时长与分机限时挂断实现
Asterisk 13 通话时长查询与自动挂断计费方案
1. 获取活跃通话的通话时长
在Asterisk 13里查活跃通话时长,有几种实用的方式,看你是手动排查还是要集成到程序里:
- CLI手动查询:直接登录Asterisk CLI输入
core show channels verbose,输出里的Duration列会显示每个活跃通话的时长(格式是HH:MM:SS)。要是想在系统shell里直接跑,用asterisk -rx "core show channels concise"能拿到更紧凑的结果,方便脚本处理。 - Dialplan内实时获取:如果是在extensions.conf里处理当前通话,用
${CHANNEL(duration)}变量就能拿到当前通话已经持续的秒数,适合做实时逻辑判断。另外CDR变量${CDR(duration)}也能拿到累计时长,效果差不多,看你习惯用哪个。 - AMI接口程序化查询:如果是要做监控工具或者集成到业务系统,用Asterisk Manager Interface发送
Action: CoreShowChannels指令,返回的响应里每个通话条目都会带Duration字段,很适合开发自动化功能。
2. 监控特定分机(0001)通话,10分钟自动挂断的Dialplan实现
要实现这个计费控制需求,核心是在分机的通话流程里加入时长限制,下面给你两种靠谱的方案,按需选:
方案一:绝对超时快速实现
这是最省心的方式,直接用TIMEOUT(absolute)变量设置通话最长时长,到点自动挂断:
[internal] ; 处理0001的呼入 exten => 0001,1,NoOp(Processing incoming call for extension 0001) ; 设置绝对超时为600秒(10分钟),从这里开始计时 exten => 0001,n,Set(TIMEOUT(absolute)=600) ; 呼叫分机,20秒无人接听则终止 exten => 0001,n,Dial(SIP/0001,20) exten => 0001,n,Hangup() ; 处理0001的呼出 exten => _X.,1,NoOp(Handling outgoing call from ${CALLERID(num)}) ; 判断主叫是否是0001,是的话触发超时设置 exten => _X.,n,GotoIf($["${CALLERID(num)}" = "0001"]?set_timeout:proceed) exten => _X.,n(set_timeout),Set(TIMEOUT(absolute)=600) exten => _X.,n(proceed),Dial(SIP/your_trunk/${EXTEN},60) exten => _X.,n,Hangup()
小贴士:TIMEOUT(absolute)是全局生效的,设置后不管通话怎么转接,只要没被重置,到时间就会自动挂断。要是给不同分机设不同时长,只要在对应分支里改数值就行。
方案二:带提前提示的时长控制
如果需要在挂断前给用户发个提醒(比如提前30秒播放“通话即将结束”的提示音),可以用Gosub启动一个后台计时进程:
[internal] exten => 0001,1,NoOp(Handling call for extension 0001) ; 总时长600秒,提前30秒触发提示 exten => 0001,n,Set(total_duration=600) exten => 0001,n,Set(warn_seconds=${total_duration}-30) ; 启动后台计时检查线程 exten => 0001,n,Gosub(check_duration,s,1(${warn_seconds},${total_duration})) ; 呼叫分机 exten => 0001,n,Dial(SIP/0001,20) exten => 0001,n,Hangup() ; 子上下文:负责时长监控与提示 [check_duration] exten => s,1,NoOp(Starting duration monitoring) ; 等待到提示时间点 exten => s,n,Wait(${ARG1}) ; 播放提示音(把pbx-invalid换成你自己的音频文件,比如custom/call-will-end-soon) exten => s,n,Playback(pbx-invalid) ; 等待剩余时间到点,然后挂断 exten => s,n,Wait(${ARG2}-${ARG1}) exten => s,n,Hangup()
说明:Gosub会开一个独立的执行线程,完全不影响主通话的正常进行。当计时到设定的提示时间,会先播放提醒,然后等剩余时间走完就自动挂断通话。
内容的提问来源于stack exchange,提问作者user3756834
相关产品推荐
相关产品推荐

