從零開始搭建雲呼叫中心之FreeSwitch實戰

一. 開篇

在當今快速發展的數字化時代,企業對於高效率、低成本、可擴展性強的通信解決方案的需求日益增長。雲呼叫中心作爲一種新興的服務模式,正逐漸取代傳統的硬件呼叫中心。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

從上圖可以看出,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

  2. 修改external_sip_ip爲本地ipv4地址
    image.png

5.4 freeswitch啓動

我們回到freeswitch安裝目錄C:\Program Files\FreeSWITCH,雙擊FreeSwitchConsole.exe即可啓動,啓動成功後會默認進入其控制檯。

image.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

6.2 Linphone配置

當我們的freeswitch啓動後,我們配置兩個Linphone,以達到兩個客戶端互相呼叫的目的。

  1. 打開軟件

  2. 點擊助手
    image.png

  3. 點擊使用一個SIP賬戶

image.png
6. 配置
- 用戶名:默認分配1001~1019共20個賬號(在C:\Program Files\FreeSWITCH\conf\directory\default下配置)
- SIP域:123.456.789.78:5060
- 密碼:1234(在vars.xml中配置)
- 交通工具:UDP
image.png
7. 點擊使用
8. 點擊右上角撥號盤輸入分機號即可撥打
image.png

七. 進階使用(EventSocket模塊)

EventSocket是freeswitch提供的一個擴展模塊,該模塊允許用戶使用各種語言,比如java,python等與freeswitch建立socket鏈接,從而控制freeswitch,或獲取通話過程中產生的一些事件,從而進行擴展開發。

EventSocket支持兩種模式,內聯模式和外聯模式,freeswitch支持將自己作爲Server端等待client端連接,也可以支持由freeswitch作爲client端主動連接server端。

內聯模式:
TCP server.drawio.png

外聯模式:
TCP client.drawio.png

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章