如何判断Elastix Server4通话中是客户还是坐席挂断?
判断Elastix Server 4中通话挂断方的方法
我之前维护Elastix 4系统时也碰到过这个头疼的问题,其实核心要利用好Asterisk(Elastix的底层引擎)的日志和通话记录能力,下面是几个亲测有效的方案:
1. 深挖Asterisk全量日志
Elastix的Asterisk日志默认存在/var/log/asterisk/full,这是判断挂断方最直接的途径:
- 搜索包含
hangup的日志条目,重点关注**发起挂断的通道(Channel)**和挂断原因码(Cause Code) - 比如日志显示:
[2024-05-20 14:30:00] VERBOSE[12345] chan_sip.c: Channel SIP/101-00000abc got hangup request, cause 16,这里的SIP/101就是坐席的分机号,说明是坐席主动挂断;如果是外线客户挂断,通道会显示中继相关标识,比如SIP/MyTrunk-00000def - 常见挂断原因码:16(正常挂断)、34(无应答)、486(对方忙),但核心还是看哪个通道先触发hangup事件
2. 自定义CDR记录补充挂断信息
Elastix默认的CDR(通话详细记录)可能没直接显示挂断方,但可以通过自定义字段来补充:
- 编辑
/etc/asterisk/cdr_custom.conf,添加自定义字段配置:
[mappings] hangup_source => ${CHANNEL}
- 在拨号计划(
/etc/asterisk/extensions.conf或者Elastix后台的Inbound/Outbound Routes里的自定义上下文)中,添加挂断时的字段赋值:
exten => h,1,Set(CDR(hangup_source)=${CHANNEL})
- 重启Asterisk服务:
asterisk -rx "core restart now"
之后在Elastix后台的Reports -> Call Detail Records里,就能看到新增的hangup_source字段,直接对应发起挂断的通道,判断是坐席分机还是外线
3. 实时监控Asterisk AMI事件
如果需要实时判断挂断方,可以通过Asterisk的AMI接口监听Hangup事件:
- 写个简单的脚本(比如Python用
pyst库,PHP用php-agi)连接AMI,监听Hangup事件 - 事件中会包含
Channel(挂断通道)、Cause(原因码)、Uniqueid(通话唯一ID)等信息,通过识别通道前缀(比如SIP/xxx是分机,SIP/Trunkxxx是外线)就能实时确定挂断方 - 注意要在Elastix后台的Asterisk -> Manager Users里创建有权限的AMI用户,确保脚本能正常连接
额外注意事项
- 确保Asterisk日志级别足够:在Elastix后台Asterisk -> Asterisk Settings -> Logging里,把日志级别调到
Verbose或Debug,或者修改/etc/asterisk/logger.conf设置full => debug,verbose,避免关键信息被过滤 - 不同中继类型的通道格式不同:PRI中继的通道是
DAHDI/1-1这类,IAX中继是IAX2/Trunk-xxx,需要对应到你的外线配置来识别
内容的提问来源于stack exchange,提问作者MLazar




