顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-常见问题

常见问题

本文档以faq的方式解答常见问题,如果你的配置和本文档描述的有点不一样是正常的,本文档以ccadmin1.09导入的默认配置讲解的。

怎么设置机器人最大通话时间

进入机器人的拨号方案park_timeout=${robot_maximum_connect_time},${robot_maximum_connect_time}这个就是最大通话时间的变量,默认值在配置文件vars.xml里面设置robot_maximum_connect_time=3600。如果你要给不同的任务设置不同的机器人最大通话时间,可以给在队列外呼模板添加一个名为robot_maximum_connect_time的变量,然后任务里面给这个变量设置一个你需要的值就可以了。

自动外呼要录音接通前的声音怎么设置

在队列外呼任务配置,配置录音模板和勾选允许嵌套变量就可以了。mod_cti 1.3.15版本之后推荐的配置方法是,自动外呼勾选不等待应答,然后路由里面把拨号方案调整拨号方案的顺序,把通话录音放到等待应答之前。

自动外呼不呼叫了怎么分析

执行fs命令 cti show queue_dialer 任务名 会输出任务的全部参数。重点查看这几个参数,允许外呼的时间,外呼线路是否有空闲的并发,如果配置了坐席线路组,检测坐席线路组是否有空闲的并发。
enable:false (任务是否启用)
call_limit:1 (任务最大并发)
number_queue:number_robot (号码队列)
line_group:[default(idle=0)] (外线线路空闲的并发,idle要大于0)
start_time:2021-07-28 08:52:20 (开始时间)
stop_time:2023-07-28 08:52:22 (停止时间)
work_hour:[wday:-1 08:00-23:00] (上班时间)
work_week:[0,1,2,3,4,5,6] (工作日)
service_line_group: (坐席线路组)
service_line_group_idle:0 (坐席线路组空闲坐席个数)

  • 查看线路组的内存状态的命令是 cti show line_group 线路组 如果外呼线路组和坐席线路组空闲并发不对,可以查看线路组内存状态看看。新添加的线路组要点更新(线路组里面的每个线路,如果也是新加的,需要先更新,然后再更新线组)。
  • 空闲CPU小于cti.json配置(queuedialer.idle_cpu)默认是10% 会停止外呼
  • 系统负载/CPU核心数大于cti.json配置(queuedialer.loadavg)默认是1.5 会停止外呼

自动外呼怎么启用空号识别功能

安装好空号识别模块,任务配置里面启用空号识别,然后cdr.json的cdr配置把空号识别的结果变量da2_result记录到数据库就可以了。

自动外呼的号码怎么和通话记录关联

如果每个任务的号码是唯一的,可以通过任务名和被叫号码来关联,如果不是唯一的,可以导入号码时添加一个origination_uuid的变量,这样外呼系统就会使用这个uuid作为通话的UUID。

自动外呼呼叫速度(cps)和并发的关系

cps和limit 的关系:比如并发设置为100,当前存在的通话是0个,呼叫速度设置为10时,第一秒发起10个呼叫,第二秒再发起10个呼叫,以这样的速度发起呼叫,直到通话总数达到并发就停止发起新的呼叫。如果有电话挂断了,那么以1秒10个的速度继续发起新的呼叫,使通话总数达到并发设置的值。

自动外呼任务并发和线路并发的关系

自动外呼实际并发控制方式时, 第一步获取任务配置的最大并发,第二步如果配置了坐席组(根据空闲坐席,和呼叫倍数等设置)动态计算可以呼叫的并发,第三步计算外呼线路组的可用并发。然后3个并发取最小值。

自动外呼呼叫速度(cps)小于1的计算方法

比如需要几秒才呼叫一个电话,这个时候怎么设置CPS呢,1÷秒数,就是CPS。比如 20秒呼叫一个,就是1÷20=0.05,CPS 就设置0.05

拨打外地手机自动加0

ccadmin导入导出,导入手机号码归属地数据库(ccadmin下载包里面包含这个库),然后再外呼使用的线路设置以下本地区号就可以外地手机自动加0了。

分机注册超时(408 Request Timeout)

  1. fs_cli -x "sofia status profile internal" 查看internal的sip状态,如果输出Invalid Profile!,进入fs_cli 执行 reload mod_sofia重载模块,然后在执行sofia status profile internal,看BIND-URL(sip:mod_sofia@101.43.12.232:11450;maddr=10.0.16.17;transport=udp,tcp) 绑定的端口。mod_sofia@101.43.12.232:11450;maddr=10.0.16.17意思是端口是11450,外网IP是101.43.12.232,本机IP是10.0.16.17,transport=udp,tcp 绑定了UDP和TCP,这个就是绑定了本机IP 10.0.16.17的11450,配置了外网IP为101.43.12.232。如果绑定的端口不是ccadmin->sip->internal->sip-port设置的,先检查ccadmin->配置文件->vars->external_ip=公网IP,是否把stun:stun.freeswitch.org修改成了正确的公网IP,如果多网卡maddr地址错了,ccadmin->sip->internal->sip-ip和rtp-ip的值默认$${local_ip_v4}改成实际的本机Ip,修改后重启fs,或者fs_cli 里面执行 reload mod_sofia,再次查看sip状态
[root@VM-16-17-centos ~]# fs_cli -x "sofia status profile internal"
=================================================================================================
Name internal
Auto-NAT false
Dialplan XML
Context internal
Challenge Realm auto_from
RTP-IP 10.0.16.17
Ext-RTP-IP 101.43.12.232
SIP-IP 10.0.16.17
Ext-SIP-IP 101.43.12.232
URL sip:mod_sofia@101.43.12.232:11450
BIND-URL sip:mod_sofia@101.43.12.232:11450;maddr=10.0.16.17;transport=udp,tcp
WSS-BIND-URL sips:mod_sofia@0.0.0.0:7564;transport=wss
  1. netstat -ntulp | grep freeswitch 或者 ss -ntupl | grep freeswitch 查看tcp和udp对应的sip端口是否监听了,本例子 tcp 10.0.16.17:11450和udp 10.0.16.17:11450 都是有监听的。
[root@VM-16-17-centos ~]# netstat -nap | grep freeswitch
tcp 0 0 127.0.0.1:7564 0.0.0.0:* LISTEN 13612/freeswitch
tcp 0 0 10.0.16.17:7564 0.0.0.0:* LISTEN 13612/freeswitch
tcp 0 0 0.0.0.0:88 0.0.0.0:* LISTEN 13612/freeswitch
tcp 0 0 10.0.16.17:11450 0.0.0.0:* LISTEN 13612/freeswitch
tcp 0 0 10.0.16.17:11451 0.0.0.0:* LISTEN 13612/freeswitch
tcp 0 0 10.0.16.17:11452 0.0.0.0:* LISTEN 13612/freeswitch
tcp6 0 0 :::8021 :::* LISTEN 13612/freeswitch
udp 0 0 10.0.16.17:11450 0.0.0.0:* 13612/freeswitch
udp 0 0 10.0.16.17:11451 0.0.0.0:* 13612/freeswitch
udp 0 0 10.0.16.17:11452 0.0.0.0:* 13612/freeswitch
  1. iptables --list 查看防火墙规则,如果有屏蔽的规则,并且 Chain INPUT (policy ACCEPT)不是DROP, 可以先 清空防火墙规则试试,清空防火墙规则的命令是 iptables -F,如果默认是 Chain INPUT (policy DROP),先iptables -P INPUT ACCEPT 把默认规则改成ACCEPT,然后在清除规则。

  2. 云服务器后台或者路由器里面检查是否映射了端口进来,云服务器的网络安全必须放开SIP端口和RTP端口,如果是本地服务器路由器里面先把SIP端口和RTP端口映射进来。

  3. tcpdump抓包看是否收到了客户端的注册请求,命令是 tcpdump -Aqnns 0 port 11450 端口如果不是11450改成port sip端口。

  4. fs_cli 打开sip信令看是否能收到注册请求,打开信令输出的命令是 fs_cli里面执行 sofia global siptrace on

外呼进度通知

比如需要183或者180的时候触发一个通知用来发送闪信。
可以通过设置变量,来绑定事件和回掉url

  1. api_on_pre_originate_notify 呼叫前触发 (只有a呼叫b的时候a路有效)
  2. api_on_orphaned_bleg_notify 发起呼叫的通道先挂断了触发(只有a呼叫b的时候a路有效)
  3. api_on_originate_notify 呼叫请求发送后触发
  4. api_on_post_originate_notify 呼叫完成后(180或者200)触发
    注意呼叫完成分2种情况,如果加了ignore_early_media=true|consume,接通后才触发,如果ignore_early_media=false ,彩铃的时候就是收到183就触发。
    例子: api_on_post_originate_notify='cti_http_get_async http://127.0.0.1/uuid=${uuid}&number=${cti_dial_number}'如果是队列外呼需要勾选嵌套变量,其他场景加上变量origination_nested_vars=”true”。

机器人伴随转人工或者排队转人工 把坐席通道变量同步到外呼通道

设置通道变量 cti_import=要同步的变量名,多个变量用逗号隔开。如果要给导入后的变量加一个前缀可以设置一个导入前缀变量cti_import_prefix

机器人伴随转人工或者排队转人工 把外呼通道同步到坐席通道变量

在拨号方案转人工动作cti_acd,或者转机器人动作cti_rotobt的前面,添加一个 export nolocal:变量名=${变量名}

CDR记录媒体信息(丢包,抖动等)

以下通道变量记录了媒体信息可以把需要的变量写入到CDR表

"rtp_audio_in_raw_bytes": "0",
"rtp_audio_in_media_bytes": "0",
"rtp_audio_in_packet_count": "0",
"rtp_audio_in_media_packet_count": "0",
"rtp_audio_in_skip_packet_count": "0",
"rtp_audio_in_jitter_packet_count": "0",
"rtp_audio_in_dtmf_packet_count": "0",
"rtp_audio_in_cng_packet_count": "0",
"rtp_audio_in_flush_packet_count": "0",
"rtp_audio_in_largest_jb_size": "0",
"rtp_audio_in_jitter_min_variance": "0.00",
"rtp_audio_in_jitter_max_variance": "0.00",
"rtp_audio_in_jitter_loss_rate": "0.00",
"rtp_audio_in_jitter_burst_rate": "0.00",
"rtp_audio_in_mean_interval": "0.00",
"rtp_audio_in_flaw_total": "0",
"rtp_audio_in_quality_percentage": "100.00",
"rtp_audio_in_mos": "4.50",
"rtp_audio_out_raw_bytes": "0",
"rtp_audio_out_media_bytes": "0",
"rtp_audio_out_packet_count": "0",
"rtp_audio_out_media_packet_count": "0",
"rtp_audio_out_skip_packet_count": "0",
"rtp_audio_out_dtmf_packet_count": "0",
"rtp_audio_out_cng_packet_count": "0",
"rtp_audio_rtcp_packet_count": "0",
"rtp_audio_rtcp_octet_count": "0"

如果cti.json的cdr.details 设置为true, details信息里面的callstats也有媒体信息。

"callStats": {
"audio": {
"inbound": {
"raw_bytes": 0,
"media_bytes": 0,
"packet_count": 0,
"media_packet_count": 0,
"skip_packet_count": 0,
"jitter_packet_count": 0,
"dtmf_packet_count": 0,
"cng_packet_count": 0,
"flush_packet_count": 0,
"largest_jb_size": 0,
"jitter_min_variance": 0,
"jitter_max_variance": 0,
"jitter_loss_rate": 0,
"jitter_burst_rate": 0,
"mean_interval": 0,
"flaw_total": 0,
"quality_percentage": 100,
"mos": 4.5
},
"outbound": {
"raw_bytes": 0,
"media_bytes": 0,
"packet_count": 0,
"media_packet_count": 0,
"skip_packet_count": 0,
"dtmf_packet_count": 0,
"cng_packet_count": 0,
"rtcp_packet_count": 0,
"rtcp_octet_count": 0
}
}

默认通道变量

配置文件 -> vars.xml 配置的变量就是默认的通道变量。

分机掉线检测

  1. 修改注册过期时间

    sip 客户端注册的时候会设置一个注册过期时间,freeswitch的分机配置 sip-force-expires 可以强制修改客户端的注册过期时间(建议 sofia的配置(sip->internal) NDLB-expires-in-register-response 改成 true), 如果更快的检测到分机掉线,建议 sip-force-expires 设置小点,比如60秒。

  2. 开启ping

    分机配置 force_ping 勾选,然后 sofia配置(sip->internal) unregister-on-options-fail 改成true。

    如果单独勾选了force_ping ,分机掉线后会把分机注册状态改成 Unreachable。

    如果unregister-on-options-fail设置为true,会把掉线的分机的注册信息直接删除。

ubuntu系统启动失败

因为 ubuntu系统默认不是root权限,切换用户,会导致启动失败
先把/ddt目录所有者改成要启动的用户 sudo chown -R ddt /ddt
然后指定用户权限前台启动看输出失败信息
freeswitch 指定启动用户权限的方法
sudo freeswitch -u ddt
asrproxy 指定启动用户权限的方法,先cd /ddt/asrproxy 切换到程序目录
sudo ./asrproxy -uddt
如果提示锁定文件失败,可以直接删除对应的文件

非root权限监听端口失败

非root权限不能监听低于1024的端口,可以把监听端口改成大于1024