You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何判断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(通话详细记录)可能没直接显示挂断方,但可以通过自定义字段来补充:

  1. 编辑/etc/asterisk/cdr_custom.conf,添加自定义字段配置:
[mappings]
hangup_source => ${CHANNEL}
  1. 在拨号计划(/etc/asterisk/extensions.conf或者Elastix后台的Inbound/Outbound Routes里的自定义上下文)中,添加挂断时的字段赋值:
exten => h,1,Set(CDR(hangup_source)=${CHANNEL})
  1. 重启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里,把日志级别调到VerboseDebug,或者修改/etc/asterisk/logger.conf设置full => debug,verbose,避免关键信息被过滤
  • 不同中继类型的通道格式不同:PRI中继的通道是DAHDI/1-1这类,IAX中继是IAX2/Trunk-xxx,需要对应到你的外线配置来识别

内容的提问来源于stack exchange,提问作者MLazar

火山引擎 最新活动