这一篇用esl实战一把,利用esl client来实现一个小型呼叫中心的原型,先看看下面这张图:
企业通常会对外公布一个400之类的服务电话,当用户拨打这个电话时,实际上背后是一堆客服妹纸带着耳麦通过电脑连着自己的电话分机。客人进线时,系统会根据一定的规则(比如挑1个当前空闲的客服),然后把电话转接过去,当然转接有可能不成功(比如目标客服没接听,或者当时走开了,或者误操作按了挂机...),系统要监听这些异常情况,然后再分配1个其它客服,直到接通(或客人等得不耐烦,主动挂机)
这是大致的时序图,解释一下:
1、客人来电后,数据会到过freeswitch
2、fs上配置outbound规则(见之前的文章)后,会把一些关键信息(比如客人来电号码),传到esl client
3、esl client根据自己的业务规则,分配一个客服(即:分机号)
4、fs主动向该客服发起呼叫(originate命令) --问题1:为啥这里不直接用bridge命令?
5、考虑到客服可能正好离开位置(比如:起身去倒杯水),或者比较忙,直接挂断了电话,步骤4的呼叫肯定失败。这里要用inbound模式,监听目标客服的分机状态,才能知道应答情况
6、如果目标客服无应答(挂机或一直振铃不接),则挂断客服这一头的电话(注:uuid_kill 客服通话的uuid),然后重复步骤2,继续分配另外一个客服 (注:这个重复分配的过程,客人是感知不到的)
7、如果目标客服接起了电话(即:应答),则先将客人来电应答(answer指令,否则客人那边还会一直听到等待音),然后将两头的电话接通(uuid_bridge uuid1 uuid2)
回答下刚才提到的一个小问题:步骤4为什么不用bridge命令?
答案:bridge也可用于转接,正常情况是没问题的,但是bridge命令执行成功,并不代表对方一定就接通了(见上面未接听情况的各种分析),如果对方挂断了,客人会先听到对方的振铃声,然后听到挂断,但是自己这一头的电话并未断,接下来又会听到排队的等待声,体验很不好,所以这个方式不推荐。
时序图中涉及的freeswitch命令列一下:
1、originate 向客服发起呼叫
tips: 可以在发起呼叫时,就指定uuid(避免fs自动生成),方便后面uuid_kill或uuid_bridge,示例如下
originate {ignore_early_media=true,call_timeout=60,hangup_after_bridge=false,origination_uuid=新的uuid,origination_caller_id_number=主叫号码,origination_caller_id_name=主叫号码显示名称}user/目标号码 &park()
注:最后的&park()不要忘了加,这个相当于系统自动应答,把客服端的电话先保持住,否则会超时自动挂断;另外新的uuid,可以通过create_uuid先生成。
2、answer 自动应答
用于客服拨通后,自动应答客人电话,否则客人那边一直播等待声音,没人接听,最终会超时。
3、uuid_kill 结束某一些的通话
如果目标客服一直振铃未接听,可以用该命令直接掐掉。
4、uuid_bridge
接通二边的电话
参考:
https://freeswitch.org/confluence/display/FREESWITCH/Originate+Example
https://freeswitch.org/confluence/display/FREESWITCH/mod_commands
https://freeswitch.org/confluence/display/FREESWITCH/Event+List#EventList-3.21CHANNEL_UUIDevent