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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:52:49