freeswitch編譯安裝,初探, 以及聯合sipgateway, webrtc server的使用場景。


本文主要記錄freeswitch學習過程。

一 安裝freeswitch

NOTE

以下兩種安裝方式,再安裝的過程中遇到了不少問題,印象比較深刻的就是lua庫找到不到這個問題。這個問題發生在make && make install 階段,如果你的機器上遇到lua.sh文件找不到可以參考下面的解決方式:

1,下載lua的tar.gz包並手動解壓copy到對應的模塊目錄下。

      curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz; tar zxvf lua-5.3.0.tar.gz; cp lua-5.3.0/src/* src/mod/languages/mod_lua/

      copy完成后,你必須重新執行

      ./configure -C; make && make install;

 

On MacOS:

1:install homebrew

      ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

2: install git

     [sudo] brew install git

3: clone freeswitch master branch

    git clone https://stash.freeswitch.org/scm/fs/freeswitch.git freeswitch.git

4: checkout the tag what you want to build

    git checkout -b v1.x.x

5: build

    ./bootstrap.sh # 如果提示你有一些庫沒有安裝,請直接使用[sudo] brew install xxx。例如 brew install autoconf automack libtool。

    ./configure #如果提示你某個package沒有找到,請直接下載brew install xxx。好吧,我承認這個過程中你可能會遇到很多package沒有安裝,你可以嘗試安裝,也可以根據提示將其disable,這些應該都是freeswitch的外圍模塊需要的依賴,如果你不需要用到,可以不安裝。

    make && make install #這個過程依然可能提示安裝失敗,原因和上面一樣缺少依賴,請直接brew install xxx。

    make sounds-install;make moh-install #安裝聲音文件

    make cd-sounds-install; make cd-moh-install #安裝高清聲音文件

On Ubuntu:

1:更新源

    sudo apt-get update 

2: 安裝依賴

    sudo apt-get install libedit-dev libldns-dev libpcre3-dev libspeexdsp-dev libspeex-dev libcurl4-openssl-dev libopus-dev libncurses5-dev libtiff-dev libjpeg-dev zlib1g-dev libssl-dev libsqlite3-dev build-essential automake autoconf git-core wget libtool liblua50-dev libsndfile1-dev yasm

3: 下載freeswitch源碼

   git clone https://stash.freeswitch.org/scm/fs/freeswitch.git freeswitch.git

4: 編譯

   git tag #查看歷史版本

   git checkout -b 1.x.x #選擇要編譯的版本

   ./bootstrap.sh; ./configure;sudo make && sudo make install

    make sounds-install;make moh-install #安裝聲音文件

    make cd-sounds-install; make cd-moh-install #安裝高清聲音文件

二:freeswitch初探

   1,架構

    總的來說freeswitch是有一個穩定的核心,和大量的外圍模塊組成。其中核心提供底層的統一的API接口,外圍模塊可以根據需要實現相應的API調用。這樣有2個好處:

    1)松耦合,核心的存在不依賴與外圍模塊,換句話說我可以只加載我需要的模塊。

    2)高擴展,核心層暴露出來統一的API,外圍模塊可以根據需求來調用不同的API。這樣圍繞核心層就能產生出很多很多的模塊,它們就像插件極大的方便了用戶的使用。

    根據模塊的功能和用途可分為Endpoint(如作為sip終端), Codec(如h264,vp8,vp9常用的video編碼,pcmu,opus,g722等常用的audio編碼), Dialplan, Applicaltion, DB,

   TTS(test to speeck)/ASR(autometic speeck recognition), Chatplan等等模塊。

   貼上我畫的美圖:

   2:freeswitch常用命令

      現在我們安裝好了freeswitch,那就練習下常用命令吧。

      哦,再練習之前我們需要把freeswitch的可執行文件加入到PATH中去,這樣我們就能像執行shell命令一樣來使用freeswitch相關命令了。

      freeswitch默認的安裝路徑是: /usr/local/freeswitch/, 它的可執行文件在bin/目錄下,所以你只需要執行: 

      export PATH=/user/local/freeswitch/bin:$PATH.

      Ok, 萬事具備,開始練習吧:

      freeswitch -help #幫助命令,注意哦,一個"-"中划線。這里列出的命令主要是控制freeswitch啟動模式的命令,如:

     -waste 允許浪費內存; -core 出錯時進行內核轉儲(這個對測試開發很有用,在出現bug是能記錄當時的錯誤信息);-nc 啟動后台模式(也是我目前學習階段唯一用到的)等等。

      note freeswitch需要使用UDP 5060端口,這個和很多的SIP Client相沖突(如linphone)。

      現在通過 “”freeswitch -nc” 你的freeswitch已經啟動了,如何確定你的freeswitch確實在運行呢?

      sudo ps -aux | grep freeswitch 或者 sudo netstat -pan | grep :5060可以檢查到的freeswitch是否在正常運行。

       像很多的服務一樣,freeswitch安裝的時候默認就幫我們安裝好了freeswitch的客戶端fs_cli,從cli就能看出它是基於命令行的。。好了,來看下fs_cli的常用命令

        執行 “fs_cli“可以直接進入命令行交互頁面在交互頁面輸入:

        version   #當前版本,status  #當前狀態, sofia status 顯示sofia, help 幫助信息。

        執行 "fs_cli -x 'commond' " 可以在命令執行結束后退出交互頁面。

  3 API命令與APP

     API命令是freeswitch內部的命令, APP是一個應用程序,好吧其實大多情況下分不清它們誰是誰。下面通過一個小的呼叫案例來感受下它們(fs_cli交互頁面):

     1, 發起呼叫 freeswitch> originate user/1000 &echo #詞語句在通過originate user/1000呼叫了一個用戶后,執行了echo這個程序。echo是一個回音程序,它把任何它聽到的聲音反播給對方。originate是一個內部命令。

   4 freeswitch目錄結構

    bin:   可執行文件freeswitch, fs_cli都在這里。

    db: 

     htdocs: HTTP server 根目錄

     mod: 可加載模塊

     run: 存放freeswitch運行時的pid

     sounds: 聲音文件

      grammar: 語法, 用於ASR

      includ: 頭文件

       log:  日志

       recordings: 錄音存放目錄

       scripts:  嵌入式語言寫的腳本lua, luarun jsrun.

        stoerage: 語音留言

       conf: 配置文件目錄。

三 SIP協議基礎

      在真正使用freeswitch之前,我們是需要了解sip協議基礎的。下面我以http和sip的對比來介紹下sip協議:

 我們來比較下http和sip的請求行,請求頭

請求行:

http協議請求行中第一個字段是http協議的方法(get, post, put, patch, delete等)

sip協議的請求行中第一個字段是sip協議支持的方法(invite,register,ack,cancel,bye,options)

http協議的請求行中第二個字段代表的是server端的某一資源

sip協議的請求行第二個字段代表的是server端的某一個人

二者請求行中第三個字段都代表協議的版本號。

請求頭:

請求頭主要是想表達client端一些信息

http協議中有client可以接受什么樣的數據,支持的壓縮方法,與服務器連接的狀態等等

sip協議中有呼叫端的標識,被叫者的標識,會話的標識等等信息。

       http協議 sip 協議

請求行:  GET /aggsite/AggStats HTTP/1.1

請求行: INVITE sip:username@sip_server_ip SIP/2.0

請求頭 Host: www.cnblogs.com;Connection: keep-alive Accept: text/plain, */*;

請求頭:Call-ID: xxx, CSeq:xx, From:xxx, To:xxx, Max-Forwards:, Via:xxx

四:freeswitch通話模型初探

     了解sip協議后,我們就可以試着了解freeeswitch的核心技術了。

      sip協議是一個點對點的協議(Peer to Peer),理論上只要兩個sip端就可以直接通話了。但是實際情況是不容易實現的。想象一下,sipA,sipB是兩個互不相識的sip客戶端,A和B要想通話,則必須讓A和B先認識,如何讓A和B認識呢,一個比較簡單的辦法就是找一個A,B都認識的人S,讓S 為A,B牽橋搭線。這里A,B是client的角色,S就是一個服務器的角色,不過這個角色比較特殊,它只負責牽線的工作,剩下的完全交給A,B,因此S這個服務器又稱之為Signaling Server.

用個圖表達下

上面介紹了P2P的簡單流程,然而freeswitch采用的不是這種通信建立的模式。也當然,freeswitch不會采用這用架構,因為這種模式server只起到牽線的作用,完成牽線的作用后就沒事情做了,無法對通話進行監控和管理。

那如果我們想要實現對通話的管理呢?比如,錄音,狀態查看等。答案是 Back-to-Back UA.那么如何理解這個家伙呢?

我們把上面的案例做一點點改變:角色變化如下

A是個男孩,青春期;B是個女孩,也是青春期;S的角色變化比較大是一個成年人微信群,現在里面有 A的父親,B的父親。

故事在一個春天里開始了:A 不知道在哪里聽說B是一個漂亮的女孩,於是他想和B見面,見不了面通個電話也行啊。A知道他的父親在一個成年人的微信群里,心想說不定這個群里有認識B的人。於是乎A拿起了電話和父親建立了連接,說道: 爸爸,你在群里幫我問下有認識B的人嗎? A的父親就開始尋找,他發現一個男人臉上寫着B的信息,於是就對這個男人(B的父親)發起呼叫,嘿兄弟,幫忙聯系下B,我兒子想給她通電話。B的父親正想為女兒相親呢,這下正好,趕快拿起手機與B建立起來了連接。現在我們來看看連接有多少個了; 1,A---A的父親; 2,A的父親---B的父親;3, B的父親---B。因為A的父親和B的父親都想對A,B之間的通話進行了解,因此連接就這樣保持着。

 來個圖表示下:

 

好了,到此freeswitch初探就寫到這里,下面學習下它的應用場景。

五:freeswitch應用場景

    在介紹freeswitch應用場景之前,不得不提一下IP-PBX和PBX,以及一些呼叫中心業務相關的概念。

    以下內容大多提取自<freeswitch權威指南>一書:敬上鏈接地址  https://wenku.baidu.com/view/f0deb939e518964bcf847cb4.html,雖然只有前面幾章免費(我也只是看了前面免費的幾章),但是作者由淺入深,從古至今的講述了呼叫業務的發展歷史,並且詳細的介紹了freeswitch如何安裝,使用。下面記錄下本人讀后所得,便於以后復習:

   記得作者在書中有一句話,大意是“我們對一直存在於身邊的事物一知半解”。再次感謝作者的寫作思路,能讓我從歷史的角度,迅速漸進地,由簡入繁地,去了解電話業務的發展過程。

   PSTN(Public Switch Telephone Network)公共電話網絡。

  我們對internet很了,在internet上我們可以通過路由器,交換機連接到世界上任何一個可訪問的公有IP。但是我們對時時刻刻在用的電話網絡卻不明所以,其實PSTN也像internet一樣,通過運營商提供給我的號碼(就像internet上的公網IP),我們就可以在PSTN上與其他終端用戶交流(就像internet上不同IP間的訪問一樣)。

   貼上我畫的PSTN的發展簡圖。

   

      PBX(Private Branch eXchange)私有或專有交換機。PBX的使用場景就像internet上的路由器一樣,它的一端通PSTN相連,一端和公司內部的話機終端相連,我們可以通過PBX設置接聽方式。

     貼上我畫的PBX在公司電話系統中的位置:

      

 

   上面的案例只試用與小規模的部署,當有大規模的部署需求時,呼叫中心(Call center)就孕育而生了。呼叫中心提供了更多的服務,如排隊,IVR,錄音系統等等,下面以一張圖來表達:圖片引用自《FreeSwitch權威指南》:

   

隨着互聯網的發展交換機由硬件交換機到軟件交換機轉換,而freeswitch正被作為軟交換,網關服務器來使用。結合目前很火的webrtc,webrtc sipgateway等服務可以搭建起來網頁版的sip client,也可以很方便的搭建起電話會議,視頻會議。

我使用Intel提供的webrtc開發套件(在服務器端集成sip client), sipgateway(一個sip網關,通過這個服務,可以實現網頁版的sip client)以下紅色方框內的是本人經過測試實際可行的。由於對電話業務不熟,只是走通了不同sip端,通過freeswitch鏡像交互這一步。

不同的sip client如 jitsi,xlite,linphone, web sip client, webrtc-mcu-server(集成的有sip client)通過freeswitch已經能正常通信。

 

網絡電話時代圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM