第二章 初識FreeSWITCH

Seven Du發表於2013-03-18

什麼是 FreeSWITCH ?

FreeSWITCH 是一個開源的電話交換平臺。它具有很強的可伸縮性---從一個簡單的軟電話客戶端到運營商級的軟交換裝置幾乎無所不能。它能原生地執行於Windows、Max OS X、Linux、BSD 及 Solaris 等諸多32/64位平臺。可以用作一個簡單的交換引擎、一個PBX,一個媒體閘道器或媒體支援IVR的伺服器,或在運營商的IMS網路中擔當Application Server等。

它支援SIP、H323、Skype、Google Talk等協議,並能很容易地與各種開源的PBX系統如sipXecs、Call Weaver、Bayonne、YATE及Asterisk等通訊。 FreeSWITCH 遵循RFC並支援很多高階的SIP特性,如 presence、BLF、SLA以及TCP、TLS和sRTP等。它也可以用作一個SBC進行透明的SIP代理(proxy)以支援其它媒體如T.38等。

FreeSWITCH 支援寬頻及窄帶語音編碼,電話會議橋可同時支援8、12、16、24、32及48kHz的語音。

至於 FreeSWITCH 能做什麼,通俗一點,我們可能以這樣說:

  • 任何像華為、中興等局端交換機能做的事情它都能做
  • 任何像Avaya、Cisco、NEC等企業級交換機能做的事情它也能做
  • 甚至上述兩類交換機不能做的事情它也能做

說的專業一點,它實際上就是一個 B2BUA。

快速體驗

FreeSWITCH 的功能確實非常豐富和強大,在進一步學習之前我們先來一次完整的體驗。

FreeSWITCH 預設的配置是一個SOHO PBX(家用電話小交換機),那麼我們本章的目標就是從零安裝,實現分機互撥電話,測試各種功能,並通過新增一個SIP-PSTN閘道器撥打PSTN電話。 這樣,即使你沒有任何使用經驗,你也應該能順利走完本章,從而建立一個直接的認識。在體驗過程中,你會遇到一點稍微複雜的配置,如果不能完全理解,也不用擔心,我們在後面會詳細的介紹。當然,如果你是一個很有經驗的 FreeSWITCH 使用者,那麼大可跳過本章。

安裝FreeSWITCH基本系統

在本文寫作時,最新的版本1.2.0-RC2。FreeSWITCH支援32位及64位的Linux、 Mac OS X、BSD、Solaris、Windows等眾多平臺。某些平臺上有編譯好的安裝包,但本人強烈建議從原始碼進行安裝,因為 FreeSWITCH 更新非常快,而已編譯好的版本通常都比較舊。你可以下載原始碼包,也可以直接從git倉庫中取得最新的程式碼。與其它專案不同的是,其git的主(master)分支程式碼通常比穩定的釋出版更穩定。而且,當你需要技術支援時,開發人員也通常建議你先升級到git中最新的程式碼,再看是不是仍有問題。

Windows使用者可以直接下載安裝檔案 http://files.freeswitch.org/windows/installer/ (再提醒一下,版本比較舊,如果從原始碼安裝的話,需要Visual Studio 2008或2010)。安裝完成執行 c:\freeswitch\freeswitch.exe 便可啟動,其配置檔案都在 c:\freeswitch\conf\目錄下。

以下假定你使用 Linux 平臺,並假定你有 Linux 的基本知識。如何從頭安裝 Linux 超出了本書的範圍,而且,你也可以很容易的從網上找到這樣的資料。一般來說,任何發行套件都是可以的,但是,有些發行套件的核心、檔案系統、編譯環境,LibC 版本會有一些問題。所以,如果你在遇到問題後想獲得社群支援,最好選擇一種大家都熟悉的發行套件。FreeSWITCH 開發者使用的平臺是 CentOS 5.2/5.3(使用CentOS 5.8 也沒有問題,有人也成功地在CentOS 6 上成功安裝部署,但版本並不總是越新越好),社群中也有許多人在使用 Ubuntu 和 Debian,如果你想用於生產環境,建議使用 LTS(Long Term Support) 的版本,即 Ubuntu8.04/10.04/12.04 或 Debian Stable。在安裝之前,我們需要先準備一些環境---FreeSWITCH 可以以普通使用者許可權執行,但為了簡單起見,以下所有操作均用 root 執行(這不是一個好習慣,但在此,讓我們專注於FreeSWITCH而不是Linux):

CentOS:

yum install -y autoconf automake libtool gcc-c++
yum install -y ncurses-devel make zlib-devel libjpeg-devel

Ubuntu:

apt-get -y install build-essential automake autoconf git-core wget libtool
apt-get -y install libncurses5-dev libtiff-dev libjpeg-dev zlib1g-dev

以下三種安裝方式任選其一,預設安裝位置在/usr/local/freeswitch。安裝過程中會下載原始碼目錄,請保留,以便以後升級及安裝配置其它元件。值得一提的是,CentOS預設的軟體倉庫中可能沒有git,如下你需要使用git安裝,則可以先安裝 rpmforge (http://pkgs.repoforge.org/rpmforge-release/),然後再安裝 git。

最快安裝(推薦)

wget http://www.freeswitch.org/eg/Makefile && make install

以上命令會下載一個 Makefile,然後使用 make 執行安裝過程。安裝過程中它會從 Git 倉庫中獲取程式碼,實際上執行的操作跟下一種安裝方式相同。

從 Git 倉庫安裝:

從程式碼庫安裝能讓你永遠使用最新的版本:

git clone git://git.freeswitch.org/freeswitch.git
cd freeswitch
./bootstrap.sh
./configure
make install

這是在在 Linux 上從原始碼安裝軟體的標準過程。首先第1行使用git工具從軟體倉庫中下載最新的原始碼,第3行執行bootstrap.sh初始化一些編譯環境,第4行配置編譯環境,第5行編譯安裝。

解壓縮原始碼包安裝:

wget http://files.freeswitch.org/freeswitch-1.2.rc2.tar.bz2
tar xvjf http://files.freeswitch.org/freeswitch-1.2.rc2.tar.bz2
cd freeswitch-1.2
./configure
make install

與上一種方法不同的是,它不需要執行過bootstrap.sh(打包前已經執行過了,因而不需要automake和autoconf工具),便可以直接配置安裝。

安裝聲音檔案

在以下例子中我們需要一些聲音檔案,而安裝這些聲音檔案也異常簡單。你只需在原始碼目錄中執行:

make sounds-install
make moh-install

以下高質量的聲音檔案可選擇安裝。FreeSWITCH支援8、16、32及48kHz的語音,很少有其它電話系統支援如此多的抽樣頻率(普通電話是8K,更高頻率意味著更好的通話質量)。

make cd-sounds-install
make cd-moh-install

安裝完成後,會顯示一個有用的幫助,

+---------- FreeSWITCH install Complete ----------+
+ FreeSWITCH has been successfully installed.     +
+                                                 +
+       Install sounds:                           +
+       (uhd-sounds includes hd-sounds, sounds)   +
+       (hd-sounds includes sounds)               +
+       ------------------------------------      +
+                make cd-sounds-install           +
+                make cd-moh-install              +
+                                                 +
+                make uhd-sounds-install          +
+                make uhd-moh-install             +
+                                                 +
+                make hd-sounds-install           +
+                make hd-moh-install              +
+                                                 +
+                make sounds-install              +
+                make moh-install                 +
+                                                 +
+       Install non english sounds:               +
+       replace XX with language                  +
+       (ru : Russian)                            +
+       ------------------------------------      +
+                make cd-sounds-XX-install        +
+                make uhd-sounds-XX-install       +
+                make hd-sounds-XX-install        +
+                make sounds-XX-install           +
+                                                 +
+       Upgrade to latest:                        +
+       ----------------------------------        +
+                make current                     +
+                                                 +
+       Rebuild all:                              +
+       ----------------------------------        +
+                make sure                        +
+                                                 +
+       Install/Re-install default config:        +
+       ----------------------------------        +
+                make samples                     +
+                                                 +
+       Additional resources:                     +
+       ----------------------------------        +
+       http://www.freeswitch.org                 +
+       http://wiki.freeswitch.org                +
+       http://jira.freeswitch.org                +
+       http://lists.freeswitch.org               +
+                                                 +
+       irc.freenode.net / #freeswitch            +
+-------------------------------------------------+

至此,已經安裝完了。在Unix類作業系統上,其預設的安裝位置是/usr/local/freeswitch,下文所述的路徑全部相對於該路徑。兩個常用的命令是 bin/freeswitch 和 bin/fs_cli,為了便於使用,建議將這兩個命令做符號連結放到你的搜尋路徑中,如:

ln -sf /usr/local/freeswitch/bin/freeswitch /usr/bin/
ln -sf /usr/local/freeswitch/bin/fs_cli /usr/bin/

接下來就應該可以啟動了,通過在終端中執行freeswitch命令(如果你已做符號連結的話,否則要執行/usr/local/freeswitch/bin/freeswitch)可以將其啟動到前臺,啟動過程中會有許多log輸出,第一次啟動時會有一些錯誤和警告,可以不用理會。啟動完成後會進入到系統控制檯,並顯示類似的提示符“freeswitch@localhost>”(以下簡作 “FS> ”)。通過在控制檯中輸入shutdown命令可以關閉FreeSWITCH。

如果您想將FreeSWITCH啟動到後臺(daemon,服務模式),可以使用freeswitch -nc (No console)。後臺模式沒有控制檯,如果這時想控制FreeSWITCH,可以使用客戶端軟體fs_cli連線。當然,也可以直接在 Linux 提示符下通過 freeswitch -stop 命令關閉。如果不想退出 FreeSWITCH 服務,只退出fs_cli客戶端,則需要輸入 /exit,或Ctrl + D,或者,直接關掉終端視窗。

連線SIP軟電話

FreeSWITCH最典型的應用是作為一個伺服器(它實際上是一個背靠背的使用者代理,B2BUA),並用電話客戶端軟體(一般叫軟電話)連線到它。雖然 FreeSWITCH 支援 IAX、H323、Skype、Gtalk 等眾多通訊協議,但其最主要的協議還是 SIP。支援SIP的軟電話有很多,我最常用的是 X-Lite 和 Zoiper。這兩款軟電話都支援 Linux、Mac OS X 和 Windows平臺,免費使用但是不開源。在 Linux 上你還可以使用 ekiga 軟電話。

強烈建議在同一區域網上的其它機器上安裝軟電話,並確保麥克風和耳機可以正常工作 。當然,如果你沒有多餘的機器做這個實驗,那麼你也可以在同一臺機器上安裝。只是需要注意,軟電話不要佔用 UDP 5060 埠,因為 FreeSWITCH 預設要使用該埠,這是新手常會遇到的一個問題。你可以通過先啟動 FreeSWITCH 再啟動軟電話來避免該問題(如果它們發現5060埠已被佔用,會選擇其它埠),另外有些軟電話允許你修改本地監聽埠[^2-1]。

[^2-1]: 特別注意,如果你是在Linux上,並且在同一臺機器上使用Ekiga的話,肯定會遇到這個問題。你需要手工使用 gconf_editor來更改ekiga使用的埠,當然,也可以改FreeSWITCH的埠,如果你會的話。

通過輸入以下命令可以知道 FreeSWITCH 監聽在哪個IP地址上,記住這個 IP 地址(:5060以前的部分),下面要用到:

netstat -an | grep 5060

udp        0      0 192.168.0.9:5060          0.0.0.0:*                               

FreeSWITCH 預設配置了 1000 ~ 1019 共 20 個使用者,你可以隨便選擇一個使用者進行配置:

在 X-Lite 上點右鍵,選 Sip Account Settings...,點Add新增一個賬號,填入以下引數(Zoiper 可參照配置):

Display Name: 1000
User name: 1000
Password: 1234
Authorization user name: 1000
Domain: 你的IP地址,就是剛才你記住的那個

其它都使用預設設定,點 OK 就可以了。然後點 Close 關閉 Sip Account 設定視窗。這時 X-Lite 將自動向 FreeSWITCH 註冊。註冊成功後會顯示"Ready. Your username is 1000",另外,左側的“撥打電話”(Dial)按鈕會變成綠色的。如下圖。

激動人心的時刻就要來了。輸入“9664”按回車(或按綠色撥打電話按鈕),就應該能聽到保持音樂(MOH, Music on Hold)。如果聽不到也不要氣餒,看一下控制檯上有沒有提示什麼錯誤。如果有“File Not Found”之類的提示,多半是聲音檔案沒有安裝,重新檢視 make moh-install 是否有錯誤。接下來,可以依次試試撥打以下號碼:

------------------
號碼      |   說明
----------------------
9664      |   保持音樂
9196      |   echo,迴音測試 
9195      |   echo,迴音測試,延遲5秒
9197      |   milliwatte extension,鈴音生成 
9198      |   TGML 鈴音生成示例
5000      |   示例IVR
4000      |   聽取語音信箱
33xx      |   電話會議,48K(其中xx可為00-99,下同)
32xx      |   電話會議,32K
31xx      |   電話會議,16K
30xx      |   電話會議,8K
2000-2002 |   呼叫組
1000-1019 |   預設分機號

表一: 預設號碼及說明

詳情見 http://wiki.freeswitch.org/wiki/Default_Dialplan_QRF

另外,也許你想嘗試註冊另外一個SIP使用者並在兩者間通話。最好是在同一個區域網中的另外一臺機器上啟動另一個 X-Lite ,並使用 1001 註冊,註冊完畢後就可以在 1000 上呼叫 1001,或在 1001 上呼叫 1000 。當然,你仍然可以在同一臺機器上做這件事(比方說用Zoiper註冊為1001),需要注意的是,由於你機器上只有一個音效卡,兩者可能會爭用聲音裝置。特別是在Linux上,有些軟體會獨佔聲音裝置。如果同時也有一個USB介面的耳機,那就可以設定不同的軟體使用不同的聲音裝置。

配置簡介

FreeSWITCH配置檔案預設放在 conf/, 它由一系列XML配置檔案組成。最頂層的檔案是freeswitch.xml,系統啟動時它依次裝入其它一些XML檔案並最終組成一個大的XML檔案。

檔案                              |    說明
---------------------------------------------------
vars.xml                          | 一些常用變數
dialplan/default.xml              | 預設的撥號計劃
directory/default/*.xml           | SIP使用者,每使用者一個檔案
sip_profiles/internal.xml         | 一個SIP profile,或稱作一個SIP-UA,監聽在本地IP及埠5060,
                                  | 一般供內網使用者使用
sip_profiles/externa.xml          | 另一個SIP-UA,用作外部連線,埠5080
autoload_configs/modules.conf.xml | 配置當FreeSWITCH啟動時自動裝載哪些模組

新增一個新的SIP使用者

FreeSWITCH預設設定了20個使用者(1000-1019),如果你需要更多的使用者,或者想通過新增一個使用者來學習FreeSWITCH配置,只需要簡單執行以下三步:

  • 在 conf/directory/default/ 增加一個使用者配置檔案
  • 修改撥號計劃(Dialplan)使其它使用者可以呼叫到它
  • 重新載入配置使其生效

如果想新增使用者Jack,分機號是1234。只需要到 conf/directory/default 目錄下,將 1000.xml 拷貝到 1234.xml。開啟1234.xml,將所有1000都改為1234。並把 effective_caller_id_name 的值改為 Jack,然後存檔退出。如:

<variable name="effective_caller_id_name" value="Jack"/>

接下來,開啟 conf/dialplan/default.xml,找到下面一行

<condition field="destination_number" expression="^(10[01][0-9])$">

改為

<condition field="destination_number" expression="^(10[01][0-9]|1234)$">

熟悉正規表示式的人應該知道,“^(10[01][0-9])$”匹配被叫號碼1000-1019。因此我們修改之後的表示式就多匹配了一個1234。FreeSWITCH使用Perl相容的正規表示式(PCRE)。

現在,回到控制檯,或啟動fs_cli,執行reloadxml命令或按快捷F6鍵,使新的配置生效。

找到剛才註冊為1001的那個軟電話(或啟動一個新的,如果你有足夠的機器的話),把1001都改為1234然後重新註冊,則可以與1000相互進行撥打測試了。如果沒有多臺機器,在同一臺機器上執行多個軟電話可能有衝突,這時,也可以直接進在FreeSWITCH控制檯上使用命令進行測試:

FS> sofia status profile internal reg    (顯示多少使用者已註冊)
FS> originate sofia/internal/1000 &echo  (撥打1000並執行echo程式)
FS> originate user/1000 &echo            (同上)
FS> originate user/1000 9999             (相當於在軟電話1000上撥打9999)
FS> originate user/1000 9999 XML default (同上)

其中,echo() 程式一個很簡單的程式,它只是將你說話的內容原樣再放給你聽,在測試時很有用,在本書中,我們會經常用它來測試。

FreeSWITCH用作軟電話

FreeSWITCH也可以簡單的用作一個軟電話,如X-Lite. 雖然相比而言比配置X-Lite略微麻煩一些,但你會從中得到更多好處:FreeSWITCH是開源的,更強大、靈活。關鍵是它是目前我所知道的唯一支援CELT高清通話的軟電話。

FreeSWITCH使用mod_portaudio支援你本地的聲音裝置。該模組預設是不編譯的。到你的原始碼樹下,執行:

make mod_portaudio
make mod_portaudio-install

其它的模組也可以依照上面的方式進行重新編譯和安裝。然後到控制檯中,執行:

FS> load mod_portaudio

如果得到“Cannot find an input device”之類的錯誤可能是你的音效卡驅動有問題。如果是提示“+OK”就是成功了,接著執行:

FS> pa devlist

API CALL [pa(devlist)] output:
0;Built-in Microphone;2;0;
1;Built-in Speaker;0;2;r
2;Built-in Headphone;0;2;
3;Logitech USB Headset;0;2;o
4;Logitech USB Headset;1;0;i

以上是在我筆記本上的輸出,它列出了所有的聲音裝置。其中,3和4最後的“o”和“i”分別代表聲音輸出(out)和輸入(in)裝置。在你的電腦上可能不一樣,如果你想選擇其它裝置,可以使用命令:

FS> pa indev #0
FS> pa outdev #2

以上命令會選擇我電腦上內建的麥克風和耳機。

接下來你就可以有一個可以用命令列控制的軟電話了,酷吧?

FS> pa looptest    (迴路測試,echo)
FS> pa call 9999
FS> pa call 1000
FS> pa hangup

如上所示,你可以呼叫剛才試過的所有號碼。現在假設想從SIP分機1000呼叫到你,那需要修改撥號計劃(Dialplan)。用你喜歡的編輯器編輯以下檔案放到conf/dialplan/default/portaudio.xml

<include>
  <extension name="call me">
    <condition field="destination_number" expression="^(me|12345678)$">
      <action application="bridge" data="portaudio"/>
    </condition>
  </extension>
</include>

然後,在控制檯中按“F6”或輸入以下命令使之生效:

FS> reloadxml

在分機1000上呼叫“me”或“12345678”(你肯定想為自己選擇一個更酷的號碼),然後在控制檯上應該能看到類似“[DEBUG] mod_portaudio.c:268 BRRRRING! BRRRRING! call 1”的輸出(如果看不到的話按“F8”能得到詳細的Log),這說明你的軟電話在振鈴。多打幾個回車,然後輸入“pa answer”就可以接聽電話了。“pa hangup”可以結束通話電話。

當然,你肯定希望在振鈴時能聽到真正的振鈴音而不是看什麼BRRRRRING。好辦,選擇一個好聽一聲音檔案(.wav格式),編輯conf/autoload_configs/portaudio.conf.xml,修改下面一行:

<param name="ring-file" value="/home/your_name/your_ring_file.wav"/>

然後重新載入模組:

FS> reloadxml
FS> reload mod_portaudio

再打打試試,看是否能聽到振鈴音了?

如果你用不慣字元介面,可以看一下FreeSWITCH-Air(http://www.freeswitch.org.cn/download),它為 FreeSWITCH 提供一個簡潔的軟電話的圖形介面。另外,如果你需要高清通話,除需要設定相關的語音編解碼器(codec)外,你還需要有一幅好的耳機才能達到最好的效果。本人使用的是一款USB耳機。

另外兩款基於FreeSWITCH的軟電話是 FSComm^2-2(QT實現) 和 FSClient^2-3(C#實現)。

配置SIP閘道器撥打外部電話

如果你在某個運營商擁有SIP賬號,你就可以配置上撥打外部電話了。該SIP賬號(或提供該賬號的裝置)在 FreeSWITCH 中稱為SIP閘道器(Gateway)。新增一個閘道器只需要在 conf/sip_profiles/external/ 建立一個XML檔案,名字可以隨便起,如gw1.xml。

<gateway name="gw1"> 
    <param name="realm" value="SIP伺服器地址,可以是IP或IP:埠號"/>
    <param name="username" value="SIP使用者名稱"/>
    <param name="password" value="密碼"/>
</gateway>

如果你的SIP閘道器還需要其它引數,可以參閱同目錄下的 example.xml,但一般來說上述引數就夠了。你可以重啟 FreeSWITCH,或者執行以下命令使用之生效。

FS> sofia profile external rescan

顯示一下狀態:

FS> sofia status

如果顯示 gateway gw1 的狀態是 REGED ,則表明正確的註冊到了閘道器上。你可以先用命令試一下閘道器是否工作正常:

FS> originate sofia/gateway/gw1/xxxxxx &echo()

以上命令會通過閘道器 gw1 呼叫號碼 xxxxxx(可能是你的手機號),被叫號碼接聽電話後,FreeSWITCH 會執行 echo() 程式,你就應該能聽到自己的迴音。

從某一分機上撥出

如果閘道器測試正常,你就可以配置從你的SIP軟電話或portaudio撥出了。由於我們是把 FreeSWITCH 當作 PBX 用,我們需要選一個出局字冠。常見的 PBX 一般是內部撥小號,打外部電話就需要加撥 0 或先撥 9 。當然,這是你自己的交換機,你可以用任何你喜歡的數字(甚至是字母)。 繼續修改撥號計劃,建立新XML檔案: conf/dialplan/default/call_out.xml :

<include>
  <extension name="call out">
    <condition field="destination_number" expression="^0(\d+)$">
      <action application="bridge" data="sofia/gateway/gw1/$1"/>
    </condition>
  </extension>
</include>

其中,(\d+)為正規表示式,匹配 0 後面的所有數字並存到變數 $1 中。然後通過 bridge 程式通過閘道器 gw1 打出該號碼。當然,建立該XML後需要在控制檯中執行 reloadxml 使用之生效。

呼入電話處理。

如果你的 SIP 閘道器支援呼入,那麼你需要知道呼入的 DID 。 DID的全稱是 Direct Inbound Dial,即直接呼入。一般來說,呼入的 DID 就是你的 SIP 號碼,如果你不知道,也沒關係,後面你會學會如何得到(如果你等不及,可以先翻到第八章看看)。 編輯以下XML檔案放到 conf/dialplan/public/my_did.xml

<include>
  <extension name="public_did">
    <condition field="destination_number" expression="^(你的DID)$">
      <action application="transfer" data="1000 XML default"/>
    </condition>
  </extension>
</include>

reloadxml 使之生效。上述配置會將來話直接轉接到分機 1000 上。在後面的章節你會學到如何更靈活的處理呼入電話,如轉接到語音選單或語音信箱等。

小結

其實本章涵蓋了從安裝、配置到除錯、使用的相當多的內容,如果你能順利走到這兒,你肯定對 FreeSWITCH 已經受不釋手了。如果你卡在了某處,或某些功能未能實現,也不是你的錯,主要是因為 FreeSWITCH 博大精深,我不能在短短的一章內把所有的方面解釋清楚。在後面的章節中,你會學到更多的基本概念、更加深入地瞭解 FreeSWITCH 的哲學,學到更多的除錯技術和技巧,解決任何問題都會是小菜一碟了。