写点什么

从零开始搭建云呼叫中心之 FreeSwitch 实战

  • 2024-04-11
    北京
  • 本文字数:4187 字

    阅读完需:约 14 分钟

一. 开篇

在当今快速发展的数字化时代,企业对于高效率、低成本、可扩展性强的通信解决方案的需求日益增长。云呼叫中心作为一种新兴的服务模式,正逐渐取代传统的硬件呼叫中心。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. 协议层


从上图可以看出,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 安装(windows)

5.1 下载

windows 官方提供了编译好的二进制 MSI 安装程序,可以直接下载安装


下载地址: https://files.freeswitch.org/windows/installer/x64/

5.2 配置文件

freeswitch 的配置文件非常重要,几乎所有的功能都离不开配置文件


默认安装路径为:C:\Program Files\FreeSWITCH


配置文件路径:C:\Program Files\FreeSWITCH\conf


5.3 配置文件修改

freeswitch 默认配置已经非常完善了,我们只需要修改某些配置文件就能轻易完成配置


打开 vars.xml 文件,我们需要修改一些配置信息:


  1. 修改监听的本地的 ipv4 地址

  2. 修改 external_sip_ip 为本地 ipv4 地址

5.4 freeswitch 启动

我们回到 freeswitch 安装目录 C:\Program Files\FreeSWITCH,双击 FreeSwitchConsole.exe 即可启动,启动成功后会默认进入其控制台。



我们也可以通过安装目录下的 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. 下载后安装

6.2 Linphone 配置

当我们的 freeswitch 启动后,我们配置两个 Linphone,以达到两个客户端互相呼叫的目的。


  1. 打开软件

  2. 点击助手

  3. 点击使用一个 SIP 账户



6. 配置


  • 用户名:默认分配 1001~1019 共 20 个账号(在 C:\Program Files\FreeSWITCH\conf\directory\default 下配置)

  • SIP 域:123.456.789.78:5060

  • 密码:1234(在 vars.xml 中配置)

  • 交通工具:UDP


  1. 点击使用

  2. 点击右上角拨号盘输入分机号即可拨打

七. 进阶使用(EventSocket 模块)

EventSocket 是 freeswitch 提供的一个扩展模块,该模块允许用户使用各种语言,比如 java,python 等与 freeswitch 建立 socket 链接,从而控制 freeswitch,或获取通话过程中产生的一些事件,从而进行扩展开发。


EventSocket 支持两种模式,内联模式和外联模式,freeswitch 支持将自己作为 Server 端等待 client 端连接,也可以支持由 freeswitch 作为 client 端主动连接 server 端。


内联模式:



外联模式:


java 版本示例

我们只需要新建一个 maven 项目,引入以下依赖:


<dependency>    <groupId>org.freeswitch.esl.client</groupId>    <artifactId>org.freeswitch.esl.client</artifactId>    <version>0.9.2</version></dependency>
复制代码


然后新建一个类,使用以下代码即可监听所有事件:


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

发布于: 刚刚阅读数: 5
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
从零开始搭建云呼叫中心之FreeSwitch实战_京东科技开发者_InfoQ写作社区