前言
两年来,新冠疫情给我们的工作生活带来了巨大影响,社会各界都面临着严峻的挑战。汽车之家敏锐的洞察到降低人力成本,筛选高优客户、提高意向成交率已经成为各主机厂的迫切需求,因此,智能外呼平台,应运而生。
通过对市面上的几款外呼平台调研,发现有很多业务场景并不支持,不仅可扩展性差、而且维护成本高,所以为了更好地承接主机厂业务,满足客户定制化需求,决定研发自己的智能外呼平台。
常见的外呼平台都是基于VoIP(Voice over Internet Protocol,缩写为VoIP)实现的,VoIP是基于IP的语音传输,是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议。
VoIP电话
不同于传统的电话,VoIP是一种新兴的电话通信方式。它是一种把语音技术集成在IP协议中,通过互联网进行传输的一种全新的通信方式,其成本远低于传统电话。
初识Freeswitch
Freeswitch是一个开源的电话交换平台。官方给它的定义是——世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。在Freeswitch出现之前,软交换技术基本上掌握在少数通信企业,集成在硬件设备上整机出售,价格昂贵。需要大量的专业积累才能入门,使用者基本上偏运维,无法掌握实质的技术。
当Freeswitch以BypassMedia(旁路模式:此模式下freeswitch更像是一个信令proxy,媒体不会通过freeswitch,sdp消息体不做修改,没有录音,二次拨号等功能)运作时,它和其它VoIP通信原理一致,同样是点到点的实时通信。负责通话双方的媒体协商,交换RTP端口,编解码等信息,详细的SIP协议或协商流程可参见:RFC3261文档,源码及编译安装可以参见Freeswitch官网。' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
- Freeswitch内部使用线程模型来处理并发请求,每个连接都在单独的线程中进行处理,不同的线程间通过Mutex互斥访问共享资源,并通过消息和异步事件等方式进行通信。这种架构能处理很高的并发, 并且在多核环境中运算能均匀地分布到多颗CPU或单CPU的多个核心上。Freeswitch的核心非常短小精悍,这也是其保持稳定的关键。绝大部分应用层的功能都在外围的模块中实现。外围模块是可以动态加载(以及卸载)的,在实际应用中可以只加载用到的模块。外围模块通过核心提供的Public API与核心进行通信,而核心则通过回调(或称钩子)机制执行外围模块中的代码。
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
- 面向服务器开发,这种开发模式是基于脚本内嵌的方式,主要开发lua脚本或者使用C语言开发mod,开发人员的学习成本高,不易维护,脚本之间无法复用;
- 面向客户端开发,Freeswitch支持多种语言,开发人员可以使用自己熟悉的开发语言(java)。通过调用核心API的方式,可以控制整个会话流程。
综上所述:虽然lua脚本或C语言的执行效率更高,但是客户端的开发模式更加方便定制化开发,易于开发,况且把复杂的业务逻辑放在Freeswitch服务端不利于后续的维护和扩展。面向客户端开发有2种连接模式:内连(Inbound)模式和外连(Outbound)模式。这里我们仅说下内连模式。
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
在内连模式下,Freeswitch作为一个服务器,而用户的程序可以作为一个TCP Client主动连接到Freeswitch上。同样,Freeswitch允许多个客户端连接。每个客户端连接上来以后,可以订阅Freeswitch的内部事件,实现可定制化开发。
例如:电话转接、定制化彩铃等都可以通过内联模式实现控制。- 代理服务器立即向呼叫者(Alice)发送 100 Trying 响应以停止INVITE请求的重传。
- 代理服务器在位置服务器中搜索Bob的地址。在获得地址之后,它进一步转发INVITE请求。
- 此后,由Bob产生的 180响铃(临时响应)被返回给Alice。
- Bob在接听电话后立即生成 200 OK 响应。Alice收到 200 OK 时,Bob会收到来自Alice的 ACK 。
- 同时,会话建立并且RTP分组(对话)开始从两端流动。
- 在对话之后,任何参与者(Alice或Bob)可以发送 BYE 请求以终止会话。BYE 直接从Alice到Bob绕过代理服务器。
- 最后,Bob发送 200 OK 响应以确认BYE并且会话终止。
- 在上述基本呼叫流程中,三个事务(标记为1,2,3)可用。
完整的呼叫(从INVITE到200 OK)称为 Dialog 。
Freeswitch的核心底层代码是由C语言编写,如果需要重构Freeswitch核心功能、基于Freeswitch二次开发软交换,或者针对Freeswitch开发其他自定义模块,则需要在符合Freeswitch开发规范的情况下进行改造。而使用Freeswitch或者针对Freeswitch做esl应用端开发,则基本不需要更改Freeswitch底层代码逻辑,Freeswitch是通过提供基于静态xml的文件配置方式,来实现对Freeswitch所有功能的配置和调度控制。
拨号计划(dialplan)是Freeswitch配置文件中至关重要的一部分,它的主要作用就是对电话进行路由。就是当一个用户拨号时,对用户所拨的号码进行分析,进而决定下一步该做什么。如:可以拨打9197进行接通音乐校验,拨打1001不在线进入语音信箱留言等,通过拨号计划可以达到领编码进行功能的扩展。由于Freeswitch知识点较多,每一个知识点展开讨论都比较大,以上篇幅仅把Freeswitch使用过程中的主要知识点做了介绍。接下来讲解下Freeswitch服务中心的演化构建。Freeswitch 服务中心的演变
fs-router路由中心主要有2个功能点,其一是:拨号寻址,线路对接。其二是:会话中间消息路由的转发。
fs-media媒体交换中心主要作为媒体(通话语音)传递,以及ESL通过Api和命令的方式对fs-media的调用。- 外呼请求通过opensips服务动态分配可用的freeswitch服务;
- fs-media接入mysql数据库,存储双边通道信息,共用同一份Session数据,以便保持通话;
- fs-mediaA/B(媒体终结服务) 经拨号路由转发给fs-router,由fs-router和线路商进行sip信令的交互;
- 通信建立成功后由fs-mediaA/B直接和线路商进行语音流传递;
- 由于集群式的部署,可以通过拨号方式的配置,针对不同的租户,分配到不同的fs-media上,做到租户之间的物理隔离。
总结
从第一次语音传输在1876年使用振铃电路实现,到现在通过网络来实现的新型电话通信,历经了100多年,每一次通信的革新都离不开科技的进步。VoIP网络电话的兴起,不仅预示着通信方式的革新,而且标志着新一代呼叫中心成为了电话通信的宠儿。随着 Freeswitch服务中心的持续建设,通信业务层面的价值会逐步提升,打破了交换技术掌握在少数通信企业的壁垒,降低了接入难度和使用成本。从1.0的单一服务到3.0的汇接局+负载均衡,在架构升级后,Freeswitch服务中心不仅满足高并发,多租户的业务场景,而且还保证了服务的高可用、简化了对接流程、方便了服务的扩展。新一代的呼叫中心更多地融入了媒体渠道与通信渠道。未来,在业务层面,Freeswitch服务中心不仅适应于智能外呼平台,同时可满足其他业务场景的使用。如:人机协同、在线客服、多人会议、视频通话、排队等待来电呼入等诸多场景。在技术层面,不仅要考虑性能和可用性的提升,而且还要兼顾其通话、视频等质量的提高。通过多fs-router(路由中心),进一步提高它的性能和可用性。最后,追随技术的脚步,迎接新的挑战。- SIP 教程:https://www.w3cschool.cn/session_initiation_protocol/
作者简介
2020年加入汽车之家,现任职于主机厂技术部,负责AIDCC外呼平台的研发工作。
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)