使用mod_fifo 实现简单呼叫队列

ACD(Automatic Call Distribution,自动电话分配)- 呼叫中心常用的功能。

呼叫停泊与取回

在电话分配中,一般采用停泊与取回的方式进行电话搭接。

停泊,dialplan 设置:

高级功能与配置实例_数据库

拨打5900,就可以将电话停在一个泊位上。使用set设置了一个fifo_music 通道变量,指定电话停靠在泊位上时播放的音乐。使用fifo App将电话放入一个先入先出的队列中。${domain_name}的值为freeswitch服务器的ip地址,in表示入队。

当有电话呼入时:

高级功能与配置实例_App_02

WAITING(在队列中等待服务),fifo是一个“生产者-消费者”模型。

如果座席端通过某种方式知道队列里有一个来电需要服务,座席话务员就可以拨打5901将该来电从队列里取出来,然后双方进行通话。

高级功能与配置实例_数据库_03

nowait参数表示如果队列中没有电话在等待,座席端就没必要在这里等待了。

配置座席

静态座席的配置

mod_fifo 的配置文件:conf/autoload_configs/fifo.conf.xml。新建一个fifo队列,命名为book。

高级功能与配置实例_App_04

book队列配置了两个member,每个member相当于一个座席。

高级功能与配置实例_数据库_05

重新加载配置,roladxml;fifo reparse

将来话路由配置到book:

高级功能与配置实例_数据库_06

当有用户拨打1234时,便会进入book,听等待音乐。1005和1006会轮流振铃。

动态座席的配置

fifo_member 可以动态的增加和删除座席。

高级功能与配置实例_App_07

高级功能与配置实例_App_08

使用话机签入签出:

高级功能与配置实例_xml_09

上班时在自己话机上拨打5902进行签入,下班时拨打5903进行签出。

offhook座席

不管是静态配置还是动态配置的,都是onhook(挂机)座席,特点是当队列中来了电话再去呼叫座席。offhook(摘机)座席,特点是事先呼入队列并等待,当有来电时就立即接听,省去了呼叫座席的时间。

当座席呼叫5902时,就执行fifo App,它会尝试从队列中取出一个呼叫。

高级功能与配置实例_xml_10

fifo

相关的通信变量

使用fifo_priority变量来指定来话的优先级:

高级功能与配置实例_App_11

在从队列中取出(out)电话前先把fifo_bridge_uuid 变量设置为想取出的channel的uuid:

高级功能与配置实例_xml_12

案例:

高级功能与配置实例_数据库_13

高级功能与配置实例_xml_14

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事件。

高级功能与配置实例_数据库_15

高级功能与配置实例_数据库_16

其他

为了在b-leg上设置相要的通道变量,在向b-leg发起呼叫的呼叫字符串上设置

,在呼叫1007时将主叫号码改为7777:

高级功能与配置实例_数据库_17

通过某网关能打通一个手机号:

高级功能与配置实例_xml_18

使用mod_callcenter 实现呼叫中心应用

mod_callcenter采用一种基于积分(score)策略的排队算法。用户在队列中每等待1s,积分就自动加1。

mod_callcenter模块简介

编译安装:

高级功能与配置实例_App_19

自动加载该模块,编辑 conf/autoload_configs/modules.conf.xml:

高级功能与配置实例_xml_20

队列(Queue):用于标志一个队列,呼入的电话会在相关的队列中进行排队。

座席(Agent):座席会事先登录到一个梯队中,该梯队与某个队列相关联,当关联的队列中有来话是,系统会根据策略选择一个空闲的座席为来话客户服务。

高级功能与配置实例_App_21

高级功能与配置实例_数据库_22

高级功能与配置实例_数据库_23

座席配置与管理

静态座席的配置

mod_callcenter 默认的配置文件:conf/autoload_configs/callcenter.conf.xml,其中配置了一个 support@default队列:

高级功能与配置实例_App_24

strategy参数指定了队列的分配方式。

配置一个座席:

高级功能与配置实例_xml_25

高级功能与配置实例_数据库_26

高级功能与配置实例_xml_27

reject-delay-time 为座席拒接后再次选到该座席的最短时长;busy-delay-time 为如果该座席忙,则再次尝试选到该座席的最短时间。

增加1006、1007座席,配置tier,将座席和队列关联起来:

高级功能与配置实例_xml_28

配置dialplan将电话转到该callcenter队列中:

高级功能与配置实例_xml_29

动态管理队列和座席

callcenter_config 的API命令,用于管理与该模块相关的各种资源。

手工将座席签入:

高级功能与配置实例_App_30

高级功能与配置实例_App_31

添加一个1007@default的座席:

高级功能与配置实例_App_32

高级功能与配置实例_数据库_33

offhook座席

高级功能与配置实例_数据库_34

如果座席呼叫4009,会匹配到第2行,并进入该dialplan;

高级功能与配置实例_数据库_35

数据库

默认数据库中有什么?

核心数据库

freeswitch 默认使用 SQLite嵌入式数据库,不需要其他配置就能工作。名称为:core.db。

高级功能与配置实例_xml_36

高级功能与配置实例_数据库_37

高级功能与配置实例_数据库_38

当freeswitch有通话时,查询:

高级功能与配置实例_数据库_39

查看表的结构:

高级功能与配置实例_xml_40

Sofia 数据库

很多外部模块也使用数据库存储数据。mod_sofia模块中的每一个profile都使用一个单独的数据库。

查看每个数据库:

高级功能与配置实例_xml_41

查看 sofia_reg_internal.db:

高级功能与配置实例_数据库_42

高级功能与配置实例_xml_43

其他数据库

高级功能与配置实例_xml_44

ODBC

freeswitch支持通过ODBC接口连接外部的数据库。

增加ODBC数据库支持

编译前需要安装 unixODBC的开发包,并安装相关的数据库驱动。

高级功能与配置实例_数据库_45

高级功能与配置实例_App_46

再重新执行./configure && make install。

Mysql

需要安装MySQL数据库的ODBC驱动程序myODBC。

高级功能与配置实例_数据库_47

高级功能与配置实例_App_48

_r版本:

高级功能与配置实例_xml_49

/etc/odbc.ini 中配置DSN:

高级功能与配置实例_App_50

postgresql

高级功能与配置实例_App_51

两个版本的postgresql_ODBC驱动:

高级功能与配置实例_xml_52

/etc/odbc.ini:

高级功能与配置实例_数据库_53

测试ODBC连接

用于连接测试的isql命令行工具。

格式:

高级功能与配置实例_数据库_54

提供用户名和密码:

高级功能与配置实例_xml_55

使用ODBC

把核心数据库放到ODBC数据库中,配置 switch.conf.xml:

高级功能与配置实例_xml_56

高级功能与配置实例_xml_57

高级功能与配置实例_xml_58

使用数据库原生客户端库直接连接数据库

增加:

高级功能与配置实例_数据库_59

高级功能与配置实例_xml_60

视频通话

配置视频通话

freeswitch默认不支持视频呼叫。如果需要支持,需要在配置文件中增加相关的视频编解码。

支持的视频编解码:H261、H263、H263-1998、H263-2000、H264、VP8等。

freeswitch 目前仅支持透传,仅将通话中一方的视频原样送到另一方去,而不做任何编码转换。

支持的媒体编码默认在 conf/vars.xml:

高级功能与配置实例_xml_61

增加H264、VP8:

高级功能与配置实例_App_62

重读sofia的配置:

高级功能与配置实例_App_63

高级功能与配置实例_数据库_64

不修改全局变量,直接修改profile的配置,如 internal.xml:

高级功能与配置实例_数据库_65

高级功能与配置实例_App_66

高级功能与配置实例_xml_67

查看是否生效:

高级功能与配置实例_xml_68

视频录像与回放

录像数据要按一定的格式存储在文件中,而这些文件格式有好多种。不同的文件格式称为不同的容器,容器中会包含多个音频轨道(Track)和视频轨道,有的还有同步信息。

处理视频格式最好的开源软件是ffmpeg。freeswitch 中实现了一个简单的mod_fsv模块,提供录像及回放支持。它不依赖于其他的视频处理库,自己定义了一种私有的格式,将音频轨道用L16编码的数据保存,视频轨道则将整个RTP原始包都保存进去。

拨打9193 可以通过record_fsv App进行录像,dialplan的设置:

高级功能与配置实例_数据库_69

拨打9194播放刚刚录制的,使用play_fsv App 实现。

高级功能与配置实例_xml_70

视频转码

高级功能与配置实例_xml_71

高级功能与配置实例_数据库_72

多人电话会议

freeswitch 支持多人电话会议,在会议过程中,可以随时播放声音文件、对会议进行录音,也可以对任意成员进行禁言、禁听等操作。也支持简单的视频会议功能。

音频会议

拨打3000,会进入一个会议。每一个channel都是会议的一个成员(member),以member_id标志的,是一个整数值。

使用DTMF按键进行控制

高级功能与配置实例_xml_73

配置dialplan将电话路由到会议

mod_conference 提供了一个 conference App,

高级功能与配置实例_xml_74

下面三个dialplan配置:

高级功能与配置实例_App_75

除了匹配的被叫号码不同外,进入会议的profile也不同。

如果拨打31开头的4位数电话号码就进入一个宽带(wideband,16kHz)的会议,如果拨打32开头的4位数电话号码就进入一个超宽带(UItra wideband,32kHz)的会议,如果拨打33开头的4位数电话号码就进入一个CD音质(CD Quality,48kHz)的会议。

高级功能与配置实例_xml_76

高级功能与配置实例_数据库_77

高级功能与配置实例_App_78

使用API命令控制会议

conference API命令用于对会议进行各种控制。

高级功能与配置实例_数据库_79

高级功能与配置实例_App_80

高级功能与配置实例_xml_81

高级功能与配置实例_数据库_82

高级功能与配置实例_数据库_83

高级功能与配置实例_App_84

高级功能与配置实例_xml_85

配置文件

会议的配置文件:conf/autolaod_configs/conference.conf.xml,配置了一组DTMF按键控制功能:

高级功能与配置实例_App_86

高级功能与配置实例_数据库_87

这些profile之间最主要的区别是会议的采样率,不同音质的会议采样率不同。

最常用的default Profile使用与PSTN一致的8000Hz的采样率。

高级功能与配置实例_xml_88

视频会议

普通视频会议

花屏现象。freeswitch 支持在发生视频切换时主动请求一个关键帧。

vid-floor,来控制当前哪个成员显示在大家面前。

高级功能与配置实例_xml_89

force参数是可选的。没有表示临时切换到该成员,有表示固定显示这个成员。

多画面触屏

高级功能与配置实例_App_90

高级功能与配置实例_xml_91

视频融屏原理

高级功能与配置实例_App_92

视频监控

找一个支持SIP协议的摄像机。

高级功能与配置实例_数据库_93

高级功能与配置实例_数据库_94

RFC4579

高级功能与配置实例_App_95

在会议的profile中开启:

高级功能与配置实例_数据库_96

把默认3000会议中的dialplan中会议名称中的“-${domain_name}”部分去掉。

高级功能与配置实例_xml_97

话单

CSV格式的话单

高级功能与配置实例_xml_98

话单的格式是以模块定义的:

高级功能与配置实例_数据库_99

高级功能与配置实例_xml_100

高级功能与配置实例_xml_101

高级功能与配置实例_App_102

高级功能与配置实例_App_103

直接将话单写入数据库

高级功能与配置实例_数据库_104

安装:

高级功能与配置实例_App_105

高级功能与配置实例_App_106

高级功能与配置实例_xml_107

高级功能与配置实例_xml_108

高级功能与配置实例_App_109

配置完毕后就可以加载该模块将话单直接写入数据库了:

高级功能与配置实例_数据库_110

使用HTTP服务器接受话单

高级功能与配置实例_数据库_111

有三个模块可以实现该功能:mod_xml_cdr、mod_json_cdr、mod_format_cdr。

高级功能与配置实例_xml_112

计费

高级功能与配置实例_App_113

高级功能与配置实例_xml_114

它需要配合一个外部数据库才能工作,外部数据库可以是通过ODBC或内置的PostgreSQL原生模式连接。

创建一个数据库用于存储账户:

高级功能与配置实例_xml_115

高级功能与配置实例_数据库_116

高级功能与配置实例_数据库_117

高级功能与配置实例_数据库_118

可以根据不同的被叫号码设置不同的费率。在dialplan中设置,如果是长途呼叫,则每分钟0.3元:

高级功能与配置实例_数据库_119

高级功能与配置实例_App_120