本文主要記錄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已經能正常通信。
網絡電話時代圖

