使用mod_fifo 实现简单呼叫队列
ACD(Automatic Call Distribution,自动电话分配)- 呼叫中心常用的功能。
呼叫停泊与取回
在电话分配中,一般采用停泊与取回的方式进行电话搭接。
停泊,dialplan 设置:
拨打5900,就可以将电话停在一个泊位上。使用set设置了一个fifo_music 通道变量,指定电话停靠在泊位上时播放的音乐。使用fifo App将电话放入一个先入先出的队列中。${domain_name}的值为freeswitch服务器的ip地址,in表示入队。
当有电话呼入时:
WAITING(在队列中等待服务),fifo是一个“生产者-消费者”模型。
如果座席端通过某种方式知道队列里有一个来电需要服务,座席话务员就可以拨打5901将该来电从队列里取出来,然后双方进行通话。
nowait参数表示如果队列中没有电话在等待,座席端就没必要在这里等待了。
配置座席
静态座席的配置
mod_fifo 的配置文件:conf/autoload_configs/fifo.conf.xml。新建一个fifo队列,命名为book。
book队列配置了两个member,每个member相当于一个座席。
重新加载配置,roladxml;fifo reparse
将来话路由配置到book:
当有用户拨打1234时,便会进入book,听等待音乐。1005和1006会轮流振铃。
动态座席的配置
fifo_member 可以动态的增加和删除座席。
使用话机签入签出:
上班时在自己话机上拨打5902进行签入,下班时拨打5903进行签出。
offhook座席
不管是静态配置还是动态配置的,都是onhook(挂机)座席,特点是当队列中来了电话再去呼叫座席。offhook(摘机)座席,特点是事先呼入队列并等待,当有来电时就立即接听,省去了呼叫座席的时间。
当座席呼叫5902时,就执行fifo App,它会尝试从队列中取出一个呼叫。
fifo
相关的通信变量
使用fifo_priority变量来指定来话的优先级:
在从队列中取出(out)电话前先把fifo_bridge_uuid 变量设置为想取出的channel的uuid:
案例:
1 对来话进行处理,2 设置来话在队列中听到的保持音乐, 3、4 设置TTS引擎的参数, 5、6 设置一个声音,每隔15s播放一次, 7 设置一个分机号,如果等待超时,会转到该号码,8、9 是与 7配合的dialplan和context,10 设置一个声音,如果座席接听,先给来话用户播放一段提示音,11 设置一个按键,配合5 ,12 实现在用户按了 11 按键后转到7的号码上,13 是在座席接听后,在与来电客户通话前播放给座席的, 14 将来话送入 book。
相关事件
当fifo相关的状态发送变化,会产生一些subclass为fifo::info的CUSTOM事件。
其他
为了在b-leg上设置相要的通道变量,在向b-leg发起呼叫的呼叫字符串上设置
,在呼叫1007时将主叫号码改为7777:
通过某网关能打通一个手机号:
使用mod_callcenter 实现呼叫中心应用
mod_callcenter采用一种基于积分(score)策略的排队算法。用户在队列中每等待1s,积分就自动加1。
mod_callcenter模块简介
编译安装:
自动加载该模块,编辑 conf/autoload_configs/modules.conf.xml:
队列(Queue):用于标志一个队列,呼入的电话会在相关的队列中进行排队。
座席(Agent):座席会事先登录到一个梯队中,该梯队与某个队列相关联,当关联的队列中有来话是,系统会根据策略选择一个空闲的座席为来话客户服务。
座席配置与管理
静态座席的配置
mod_callcenter 默认的配置文件:conf/autoload_configs/callcenter.conf.xml,其中配置了一个 support@default队列:
strategy参数指定了队列的分配方式。
配置一个座席:
reject-delay-time 为座席拒接后再次选到该座席的最短时长;busy-delay-time 为如果该座席忙,则再次尝试选到该座席的最短时间。
增加1006、1007座席,配置tier,将座席和队列关联起来:
配置dialplan将电话转到该callcenter队列中:
动态管理队列和座席
callcenter_config 的API命令,用于管理与该模块相关的各种资源。
手工将座席签入:
添加一个1007@default的座席:
offhook座席
如果座席呼叫4009,会匹配到第2行,并进入该dialplan;
数据库
默认数据库中有什么?
核心数据库
freeswitch 默认使用 SQLite嵌入式数据库,不需要其他配置就能工作。名称为:core.db。
当freeswitch有通话时,查询:
查看表的结构:
Sofia 数据库
很多外部模块也使用数据库存储数据。mod_sofia模块中的每一个profile都使用一个单独的数据库。
查看每个数据库:
查看 sofia_reg_internal.db:
其他数据库
ODBC
freeswitch支持通过ODBC接口连接外部的数据库。
增加ODBC数据库支持
编译前需要安装 unixODBC的开发包,并安装相关的数据库驱动。
再重新执行./configure && make install。
Mysql
需要安装MySQL数据库的ODBC驱动程序myODBC。
_r版本:
/etc/odbc.ini 中配置DSN:
postgresql
两个版本的postgresql_ODBC驱动:
/etc/odbc.ini:
测试ODBC连接
用于连接测试的isql命令行工具。
格式:
提供用户名和密码:
使用ODBC
把核心数据库放到ODBC数据库中,配置 switch.conf.xml:
使用数据库原生客户端库直接连接数据库
增加:
视频通话
配置视频通话
freeswitch默认不支持视频呼叫。如果需要支持,需要在配置文件中增加相关的视频编解码。
支持的视频编解码:H261、H263、H263-1998、H263-2000、H264、VP8等。
freeswitch 目前仅支持透传,仅将通话中一方的视频原样送到另一方去,而不做任何编码转换。
支持的媒体编码默认在 conf/vars.xml:
增加H264、VP8:
重读sofia的配置:
不修改全局变量,直接修改profile的配置,如 internal.xml:
查看是否生效:
视频录像与回放
录像数据要按一定的格式存储在文件中,而这些文件格式有好多种。不同的文件格式称为不同的容器,容器中会包含多个音频轨道(Track)和视频轨道,有的还有同步信息。
处理视频格式最好的开源软件是ffmpeg。freeswitch 中实现了一个简单的mod_fsv模块,提供录像及回放支持。它不依赖于其他的视频处理库,自己定义了一种私有的格式,将音频轨道用L16编码的数据保存,视频轨道则将整个RTP原始包都保存进去。
拨打9193 可以通过record_fsv App进行录像,dialplan的设置:
拨打9194播放刚刚录制的,使用play_fsv App 实现。
视频转码
多人电话会议
freeswitch 支持多人电话会议,在会议过程中,可以随时播放声音文件、对会议进行录音,也可以对任意成员进行禁言、禁听等操作。也支持简单的视频会议功能。
音频会议
拨打3000,会进入一个会议。每一个channel都是会议的一个成员(member),以member_id标志的,是一个整数值。
使用DTMF按键进行控制
配置dialplan将电话路由到会议
mod_conference 提供了一个 conference App,
下面三个dialplan配置:
除了匹配的被叫号码不同外,进入会议的profile也不同。
如果拨打31开头的4位数电话号码就进入一个宽带(wideband,16kHz)的会议,如果拨打32开头的4位数电话号码就进入一个超宽带(UItra wideband,32kHz)的会议,如果拨打33开头的4位数电话号码就进入一个CD音质(CD Quality,48kHz)的会议。
使用API命令控制会议
conference API命令用于对会议进行各种控制。
配置文件
会议的配置文件:conf/autolaod_configs/conference.conf.xml,配置了一组DTMF按键控制功能:
这些profile之间最主要的区别是会议的采样率,不同音质的会议采样率不同。
最常用的default Profile使用与PSTN一致的8000Hz的采样率。
视频会议
普通视频会议
花屏现象。freeswitch 支持在发生视频切换时主动请求一个关键帧。
vid-floor,来控制当前哪个成员显示在大家面前。
force参数是可选的。没有表示临时切换到该成员,有表示固定显示这个成员。
多画面触屏
视频融屏原理
视频监控
找一个支持SIP协议的摄像机。
RFC4579
在会议的profile中开启:
把默认3000会议中的dialplan中会议名称中的“-${domain_name}”部分去掉。
话单
CSV格式的话单
话单的格式是以模块定义的:
直接将话单写入数据库
安装:
配置完毕后就可以加载该模块将话单直接写入数据库了:
使用HTTP服务器接受话单
有三个模块可以实现该功能:mod_xml_cdr、mod_json_cdr、mod_format_cdr。
计费
它需要配合一个外部数据库才能工作,外部数据库可以是通过ODBC或内置的PostgreSQL原生模式连接。
创建一个数据库用于存储账户:
可以根据不同的被叫号码设置不同的费率。在dialplan中设置,如果是长途呼叫,则每分钟0.3元: