您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
从零开始搭建云呼叫中心之FreeSwitch实战
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
从零开始搭建云呼叫中心之FreeSwitch实战
jd****
2024-04-10
IP归属:北京
100浏览
## 一. 开篇 在当今快速发展的数字化时代,企业对于高效率、低成本、可扩展性强的通信解决方案的需求日益增长。云呼叫中心作为一种新兴的服务模式,正逐渐取代传统的硬件呼叫中心。FreeSwitch,作为一款强大的开源通信平台,因其卓越的性能和灵活性而成为搭建云呼叫中心的理想选择。 本文将从零开始,详细介绍如何使用FreeSwitch搭建一个简单的云呼叫中心。将一步步探讨FreeSwitch的安装、配置、以及如何利用其提供的丰富特性来实现一个云呼叫中心的核心功能。 无论您是通信技术的初学者,还是希望为您的企业寻找一种创新的通信解决方案,这篇文章都将为您提供一个全面的指南,帮助您快速入门并实践搭建一个基于FreeSwitch的云呼叫中心。 ## 二. freeswitch简介 FreeSWITCH是一个自由开源的软交换。它采用Mozilla Public License授权协议,MPL是一个开源的软件协议。它的核心库libfreeswitch可以嵌入其它系统或产品中,也可以做一个单独的应用存在。 您可以使用freeswitch搭建一个简单的云呼叫中心,实现互联网中的语音通话,因为其符合标准的sip通信协议,你也可以使用一些开源的实现了标准SIP协议的客户端sdk,从而将语音呼叫集成在各种设备中,例如手机,或者别的嵌入式的设备中。你也可以通过对接能提供标准SIP呼叫的供应商,实现呼出到用户真实的手机号。 freeswitch还提供了一套非常易用的扩展模块,你可以使用他实现非常多的功能,包括控制通话路由,控制录音文件的生成,对通话进行拦截等。 freeswitch还允许你自行编写模块,从而实现你定制化的功能。 ## 三. freeswitch典型功能 - 在线计费、预付费功能 - 电话路由服务器 - 语音转码服务器 - 多点会议服务器 - IVR、语音通知服务器 - VoiceMail服务器 - PBX应用和软交换 - 应用层网关 - 防火墙/NAT穿越应用 - 私有服务器 - 第三方呼叫控制应用 - 业务生成环境运行时引擎 - 会话边界控制器 - IMS中的S-CSCF/P-CSCF/I-CSCF - SIP网间互联网关 - SBC及安全网关 - 传真服务器、T.30到T.38网关 ## 四. 通话建立过程 一通电话要能正常,主要分为两个过程,信令协商过程,媒体传输过程,而实际上媒体传输需要的一些信息是在信令协商过程中完成的,即先进行信令协商,后进行媒体传输。信令协商使用的是SIP协议进行,协商过程会SIP会携带SDP信息完成媒体过程的协商,而媒体传输的传输层使用的是RTP协议。 ### 1. 协议层 ![未命名绘图.drawio.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-10-54IZxDimkwON810VZK.png) 从上图可以看出,RTP协议和SIP协议都是应用层协议,都是基于TCP/UDP的,而SIP和RTP普遍大家都是基于UDP。 ### 2. 相关术语 2.1 UAC/UAS 用户代理客户端(UAC)指的是启动呼叫流程的应用程序。用户代理服务器(UAS)则是接收端,它的主要职责是接收呼叫、将呼叫重定向或拒绝呼叫,并对传入的呼叫提供相应的回应。UAC和UAS这两个角色是相对的,当一个SIP设备(例如:VoIP软件)发起呼叫时,它扮演的是UAC;而当它接收到呼叫时,它则作为UAS。 2.2 Register Server 在SIP设备(无论软电话还是硬件电话)使用之前,它需要向一个服务器发送REGISTER请求以注册自己。这个负责处理REGISTER请求的服务器被称为注册服务器。 2.3 Location Server 位置服务器负责追踪用户的位置信息。位置服务器与注册服务器通常是逻辑上的区分,在实际应用中,它们常常由同一个服务器实体承担这两种角色。 2.4 Proxy Server 代理服务器的职责是接收SIP请求并进行转发。如有必要,它还可以解析和修改SIP信息,但不得干扰请求或会话的状态。 2.5 Redirect Server 重定向服务器的作用是将请求的地址映射到一个新的地址,并对请求进行重定向。它与代理服务器的不同之处在于,重定向服务器不会转发INVITE请求。 2.6 B2BUA 背靠背用户代理(B2BUA)是用户代理客户端(UAC)和用户代理服务器(UAS)的结合体。简而言之,它同时扮演两者的角色。FreeSWITCH就是一个典型的B2BUA实例。 ### 2. 通话建立 ``` Alice FreeSwitch Bob | | INVITE F1 | | INVITE F2 |<-------------| |<---------------| | | 200 OK F3 | | |--------------->| 200 OK F4 | | |------------->| | | ACK F5 | | ACK F6 |<-------------| |<---------------| | | Both way RTP Established | |<=============================>| | BYE F7 | | |--------------->| BYE F8 | | |------------->| | | 200 OK F9 | | 200 OK F10 |<-------------| |<---------------| | ``` 上图是一个使用了Freeswitch的最基础的sip建立过程,并且由Bob向Alice发起通话,最终由Alice发起挂断请求,实际上不管谁发起呼叫或者挂断请求,都只是方向不同而已。 当F1~F6完成后,双方即开始进行媒体流的传输,上面可以发现媒体流不通过freeswitch,这样freeswitch只用来处理信令,这种方式没法控制录音等。实际上freeswitch针对媒体处理非常灵活,支持三种方式: | 媒体代理方式 | 描述 | 适用场景 | 性能 | | ------------ | ---- | -------- | ---- | | 默认方式 | 媒体经过FreeSwitch,RTP的媒体流被FreeSwitch接收后转发,并且freeswitch控制编码协商,提供转码能力,支持录音、二次拨号等。 | 呼叫中心等应用 | 相对较低 | | 代理模式(Proxy Media) | 媒体通过FreeSwitch转发但不处理,不提供转码能力,只改动SDP中的IP,不控制SDP参数。终端需有一致编码,不支持录音、二次拨号。 | 处理NAT问题 | 比默认方式好 | | 旁路模式(Bypass Media) | 不转发也不处理媒体,FreeSwitch作为信令代理服务,媒体不经过给freeswitch,无录音、二次拨号功能。 | 信令代理| 最高 | ## 五. freeswitch安装(windows) ### 5.1 下载 windows官方提供了编译好的二进制 MSI 安装程序,可以直接下载安装 下载地址: https://files.freeswitch.org/windows/installer/x64/ ### 5.2 配置文件 freeswitch的配置文件非常重要,几乎所有的功能都离不开配置文件 默认安装路径为:C:\Program Files\FreeSWITCH 配置文件路径:C:\Program Files\FreeSWITCH\conf | conf/目录和文件 | 说明 | |------------------------|------------------------------------| | ||——vars.xml | 基本的配置 | | ||——autoload_configs/ | 目录,存放各个模块的配置文件 | | || ||——modules.conf.xml | 配置FreeSWITCH启动时装载的模块 | | || ||——*.xml | 基本上每个模块都有相应的一个配置文件 | | ||——dialplan/ | 拨号计划 | | || ||——default.xml | 用于内部用户路由的拨号计划配置 | | || ||——public.xml | 外部来话路由的拨号计划配置 | | ||——directory/ | 用户目录 | | || ||——default/ | 默认的用户目录配置 | | || ||——*.xml | SIP用户,每个用户都有一个配置文件 | | ||——sip_profiles/ | SIP配置文件 | | || ||——internal.xml | 一般SIP profile,或称作一个SIP-UA,监听在本地IP及端口 | | || ||——external.xml | 另一个SIP-UA,用作外部连接 | | ||——freeswitch.xml | freeswitch.xml 引入各个配置文件,整合 | ### 5.3 配置文件修改 freeswitch默认配置已经非常完善了,我们只需要修改某些配置文件就能轻易完成配置 打开vars.xml文件,我们需要修改一些配置信息: 1. 修改监听的本地的ipv4地址 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-38WjGTxunp6ovXtQ4.png) 2. 修改external_sip_ip为本地ipv4地址 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-40VkYWQgW6zggVw40O.png) ### 5.4 freeswitch启动 我们回到freeswitch安装目录C:\Program Files\FreeSWITCH,双击FreeSwitchConsole.exe即可启动,启动成功后会默认进入其控制台。 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-43UVo2eco2YZXYXUm.png) 我们也可以通过安装目录下的fs_cli.exe工具,直接进入控制台: ``` ./fs_cli.exe -H 127.0.0.1 -P 8021 ``` 通过控制台我们可以输入一些命令,如:reloadxml,这个可以在我们修改配置文件后,让freeswitch重新加载配置文件里的内容 常见命令: - /exit 退出 - console loglevel (0~7)越往上级别越大 修改日志级别 - sofia global siptrace on/off 开启/关闭sip路径追踪 - sofia status profile internal reg 获取已经注册的用户 - show calls 展示当前正在进行的通话 - status 展示当前freeswitch的状态 ## 六. 客户端配置 ### 6.1 Linphone安装 1. 打开网址:https://www.linphone.org/ 2. 点击页面下面想要安装平台图标 3. 下载后安装 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-32DDjU7sLZ0tkF9U6.png) ### 6.2 Linphone配置 当我们的freeswitch启动后,我们配置两个Linphone,以达到两个客户端互相呼叫的目的。 1. 打开软件 2. 点击助手 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-55luFyMhO14GVFnht.png) 4. 点击使用一个SIP账户 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-55XOhvchFuxSikbXB.png) 6. 配置 - 用户名:默认分配1001~1019共20个账号(在C:\Program Files\FreeSWITCH\conf\directory\default下配置) - SIP域:123.456.789.78:5060 - 密码:1234(在vars.xml中配置) - 交通工具:UDP ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-577NWj2c48QsoAqGc.png) 7. 点击使用 8. 点击右上角拨号盘输入分机号即可拨打 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-08-14-55F8joS467KmnHeu6q.png) ## 七. 进阶使用(EventSocket模块) EventSocket是freeswitch提供的一个扩展模块,该模块允许用户使用各种语言,比如java,python等与freeswitch建立socket链接,从而控制freeswitch,或获取通话过程中产生的一些事件,从而进行扩展开发。 EventSocket支持两种模式,内联模式和外联模式,freeswitch支持将自己作为Server端等待client端连接,也可以支持由freeswitch作为client端主动连接server端。 内联模式: ![TCP server.drawio.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-09-17-55gtyM55khWihqaA5o.png) 外联模式: ![TCP client.drawio.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-04-09-17-55pSi9vm5mHzNo55yc.png) ### java版本示例 我们只需要新建一个maven项目,引入以下依赖: ```xml <dependency> <groupId>org.freeswitch.esl.client</groupId> <artifactId>org.freeswitch.esl.client</artifactId> <version>0.9.2</version> </dependency> ``` 然后新建一个类,使用以下代码即可监听所有事件: ```java package com.jd.cloud.freeswitch.esl.inbound; import org.freeswitch.esl.client.IEslEventListener; import org.freeswitch.esl.client.inbound.Client; import org.freeswitch.esl.client.inbound.InboundConnectionFailure; import org.freeswitch.esl.client.transport.event.EslEvent; public class test { public static void main(String[] args) throws InterruptedException { Client client = new Client(); try { //连接freeswitch client.connect("127.0.0.1", 8021, "ClueCon", 10); client.addEventListener(new IEslEventListener() { @Override public void eventReceived(EslEvent event) { String eventName = event.getEventName(); System.out.println(eventName); } @Override public void backgroundJobResultReceived(EslEvent event) { String jobUuid = event.getEventHeaders().get("Job-UUID"); System.out.println("异步回调:" + jobUuid); } }); client.setEventSubscriptions("plain", "all"); //这里必须检查,防止网络抖动时,连接断开 if (client.canSend()) { System.out.println("连接成功,准备发起呼叫..."); //(异步)向1000用户发起呼叫,用户接通后,播放音乐/tmp/demo1.wav String callResult = client.sendAsyncApiCommand("originate", "user/1000 &playback(/tmp/demo.wav)"); System.out.println("api uuid:" + callResult); } } catch (InboundConnectionFailure inboundConnectionFailure) { System.out.println("连接失败!"); inboundConnectionFailure.printStackTrace(); } } } ``` ## 八. sip sdk使用 通过使用支持标准sip协议的sdk,我们可以使用任何嵌入式设备接入我们的平台,从而实现嵌入式设备呼出 SDK开发参考(liblinphone)SDK仓库 : https://github.com/BelledonneCommunications/liblinphone 官方其他平台开发示例:https://github.com/BelledonneCommunications
上一篇:SpringBoot如何优雅的进行参数校验(一)
下一篇:如何从根本上避免钓鱼--安全意识的重要性
jd****
文章数
2
阅读量
0
作者其他文章
01
SpringBoot如何优雅的进行参数校验(一)
SpringBoot如何优雅的进行参数校验一.为什么要进行参数校验在日常的开发过程中,我们常常需要对传入的参数进行校验,比如在web前后端分离项目中,参数校验有两个方面:前端进行参数校验后端进行参数校验那这两种有什么区别呢?只完成一个可不可以呢?答案是不可以的!前端校验前端校验主要是针对用户输入时,一些基础的错误进行提示,提升用户体验。比如:必填的选项,邮箱,网址的规则,如果前端校验不通过的话就不
01
从零开始搭建云呼叫中心之FreeSwitch实战
一. 开篇在当今快速发展的数字化时代,企业对于高效率、低成本、可扩展性强的通信解决方案的需求日益增长。云呼叫中心作为一种新兴的服务模式,正逐渐取代传统的硬件呼叫中心。FreeSwitch,作为一款强大的开源通信平台,因其卓越的性能和灵活性而成为搭建云呼叫中心的理想选择。本文将从零开始,详细介绍如何使用FreeSwitch搭建一个简单的云呼叫中心。将一步步探讨FreeSwitch的安装、配置、以及如
jd****
文章数
2
阅读量
0
作者其他文章
01
SpringBoot如何优雅的进行参数校验(一)
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号