運行 FreeSWITCH


我建了一個 Freeswitch 內核研究 交流群, 45211986, 歡迎加入, 另外,提供基於SIP的通信服務器及客戶端解決方案。

 

 

讀到本章,你應該對 FreeSWITCH 有了一個比較全面的了解,迫切地想實驗它強大的功能了。讓我們從最初的運行開始,一步一步進入 FreeSWITCH 的神秘世界。

命令行參數

一般來說,FreeSWITCH 不需要任何命令行參數就可以啟動,但在某些情況下,你需要以一些特殊的參數啟動。在此,僅作簡單介紹。如果你知道是什么意思,那么你就可以使用,如果不知道,多半你用不到。

使用 freeswitch -help 或 freeswitch --help 會顯示以下信息:

-nf                    -- no forking
-u [user]              -- 啟動后以非 root 用戶 user 身份運行
-g [group]             -- 啟動后以非 root 組 group 身份運行
-help                  -- 顯示本幫助信息
-version               -- 顯示版本信息
-waste                 -- 允許浪費內存,FreeSWITCH 僅需 240K 的棧空間
                          你可以使用 ulimit -s 240 限制棧空間使用,或使用該選擇忽略警告信息
-core                  -- 出錯時進行內核轉儲
-hp                    -- 以高優先級運行
-vg                    -- 在 valgrind 下運行,調試內存泄露時使用
-nosql                 -- 不使用 SQL,show channels 類的命令將不能顯示結果
-heavy-timer           -- 更精確的時鍾。可能會更精確,但對系統要求更高
-nonat                 -- 如果路由器支持 uPnP 或 NAT-PMP,則 FreeSWITCH 
                          可以自動解決 NAT 穿越問題。如果路由器不支持,則該選項可以使啟動更快
-nocal                 -- 關閉時鍾核准。FreeSWTICH 理想的運行環境是 1000 Hz 的內核時鍾
                          如果你的內核時鍾小於 1000 Hz 或在虛擬機上,可以嘗試關閉該選項
-nort                  -- 關閉實時時鍾
-stop                  -- 關閉 FreeSWTICH,它會在 run 目錄中查找 PID文件
-nc                    -- 啟動到后台模式,沒有控制台
-c                     -- 啟動到控制台,默認
-conf [confdir]        -- 指定其它的配置文件所在目錄,須與 -log、 -db 合用
-log [logdir]          -- 指定其它的日志目錄
-run [rundir]          -- 指定其它存放 PID 文件的運行目錄
-db [dbdir]            -- 指定其它數據庫目錄
-mod [moddir]          -- 指定其它模塊目錄
-htdocs [htdocsdir]    -- 指定其它 HTTP 根目錄
-scripts [scriptsdir]  -- 指定其它腳本目錄

系統啟動腳本

在學習調試階段,你可以啟動到前台,而系統真正運行時,你可以使用 -nc 參數啟動到后台,然后通過查看 log/freeswitch.log 跟蹤系統運行情況(你可以用 tail -f 命令實時跟蹤,我一般使用 less)。

一般情況下,啟動到前台更容易調試,但你又不想在每次關閉 Terminal 時停止 FreeSWITCH,那么,你可以借助 screen 來實現。

在真正的生產系統上,你需要它能跟系統一起啟動。在 *nix 系統上,啟動腳本一般放在 /etc/init.d/。你可以在系統源代碼目錄下找到不同系統啟動腳本 debian/freeswitch.init 及 build/freeswitch.init.*,參考使用。在 Windows 上,你也可以注冊為 Windows 服務,參見附錄中的 FAQ。

控制台與命令客戶端

系統不帶參數會啟動到控制台,在控制台上你可以輸入各種命令以控制或查詢 FreeSWITCH 的狀態。試試輸入以下命令:

version           -- 顯示當前版本
status            -- 顯示當前狀態
sofia status      -- 顯示 sofia 狀態
help              -- 顯示幫助

為了調試方便,FreeSWITCH 還在 conf/autoload_configs/switch.conf.xml 中定義了一些控制台快捷鍵。你可以通過F1-F12來使用它們(不過,在某些操作系統上,有些快捷鍵可能與操作系統的相沖突,那你就只直接輸入這些命令或重新定義他們了)。

<cli-keybindings>
  <key name="1" value="help"/>
  <key name="2" value="status"/>
  <key name="3" value="show channels"/>
  <key name="4" value="show calls"/>
  <key name="5" value="sofia status"/>
  <key name="6" value="reloadxml"/>
  <key name="7" value="console loglevel 0"/>
  <key name="8" value="console loglevel 7"/>
  <key name="9" value="sofia status profile internal"/>
  <key name="10" value="sofia profile internal siptrace on"/>
  <key name="11" value="sofia profile internal siptrace off"/>
  <key name="12" value="version"/>
</cli-keybindings>

FreeSWITCH 是 Client-Server結構,不管 FreeSWITCH 運行在前台還是后台,你都可以使用客戶端軟件 fs_cli 連接 FreeSWITCH.

fs_cli 是一個類似 Telnet 的客戶端(也類似於 Asterisk 中的 asterisk -r命令),它使用 FreeSWITCH 的 ESL(Event Socket Library)庫與 FreeSWITCH 通信。當然,需要加載模塊 mod_event_socket。該模塊是默認加載的。

正常情況下,直接輸入 bin/fs_cli 即可連接上,並出現系統提示符。如果出現:

[ERROR] libs/esl/fs_cli.c:652 main() Error Connecting [Socket Connection Error]

這樣的錯誤,說明 FreeSWITCH 沒有啟動或 mod_event_socket 沒有正確加載,請檢查TCP端口8021端口是否處於監聽狀態或被其它進程占用。

fs_cli 也支持很多命令行參數,值得一提的是 -x 參數,它允許執行一條命令后退出,這在編寫腳本程序時非常有用(如果它能支持管道會更有用,但是它不支持):

bin/fs/_cli -x "version"
bin/fs/_cli -x "status"

其它的參數都可以通過配置文件來實現,在這里就不多說了。可以參見:http://wiki.freeswitch.org/wiki/Fs_cli

使用fs_cli,不僅可以連接到本機的 FreeSWITCH,也可以連接到其它機器的 FreeSWITCH 上(或本機另外的 FreeSWITCH 實例上),通過在用戶主目錄下編輯配置文件.fs_cli_conf(注意前面的點“.”),可以定義要連接的多個機器:

[server1]
host     => 192.168.1.10
port     => 8021
password => secret_password
debug    => 7

[server2]
host     => 192.168.1.11
port     => 8021
password => someother_password
debug    => 0

注意:如果要連接到其它機器,要確保 FreeSWITCH 的 Event Socket 是監聽在真實網卡的 IP 地址上,而不是127.0.0.1。另外,在UNIX中,以點開頭的文件是隱藏文件,普通的ls 命令是不能列出它的,可以使用 ls -a

一旦配置好,就可以這樣使用它:

bin/fs_cli server1
bin/fs_cli server2

在 fs_cli 中,有幾個特殊的命令,它們是以 “/” 開頭的,這些命令並不直接發送到 FreeSWITCH,而是先由 fs_cli 處理。/quit、/bye、/exit、Ctrl + D 都可以退出 fs_cli;/help是幫助。

其它一些 “/”開頭的指令與 Event Socket 中相關的命令相同,如:

/event       -- 開啟事件接收
/noevents    -- 關閉事件接收
/nixevent    -- 除了特定一種外,開啟所有事件
/log         -- 設置 log 級別,如 /log info 或 /log debug 等 
/nolog       -- 關閉 log
/filter      -- 過濾事件

另外,一些“重要”命令不能直接在 fs_cli 中執行,如 shutdown 命令,在控制台上可以直接執行,但在 fs_cli中,需要執行 fsctl shutdown。

除此之外,其它命令都與直接在 FreeSWITCH 控制台上執行是一樣的。它也支持快捷鍵,最常用的快捷鍵是 F6(reloadxml)、F7(關閉 log輸出)、F8(開啟 debug 級別的 log 輸出)。

在 *nix上,兩者都通過 libeditline 支持命令行編輯功能。可以通過上、下箭頭查看命令歷史。

發起呼叫

可以在 FreeSWITCH 中使用 originate 命令發起一次呼叫,如果用戶 1000 已經注冊,那么:

originate user/alice &echo

上述命令在呼叫 1000 這個用戶后,便執行 echo 這個程序。echo 是一個回音程序,即它會把任何它“聽到”的聲音(或視頻)再返回(說)給對方。因此,如果這時候用戶 1000 接了電話,無論說什么都能聽到自己的聲音。

呼叫字符串

上面的例子中,user/alice 稱為呼叫字符串,或呼叫 URL。user 是一種特殊的呼叫字符串。我們先來復習一下第四章的場景。FreeSWITCH UA 的地址為 192.168.4.4:5050,alice UA 的地址為 192.168.4.4:5090,bob UA 的地址為 192.168.4.4:26000。若 alice 已向 FreeSWITCH 注冊,在 FreeSWITCH 中就可以看到她的注冊信息:

freeswitch@du-sevens-mac-pro.local> sofia status profile internal reg


Registrations:
=============================================================================================
Call-ID:        ZTRkYjdjYzY0OWFhNDRhOGFkNDUxMTdhMWJhNjRmNmE.
User:           alice@192.168.4.4
Contact:        "Alice" <sip:alice@192.168.4.4:5090;rinstance=a86a656037ccfaba;transport=UDP>
Agent:          Zoiper rev.5415
Status:         Registered(UDP)(unknown) EXP(2010-05-02 18:10:53)
Host:           du-sevens-mac-pro.local
IP:             192.168.4.4
Port:           5090
Auth-User:      alice
Auth-Realm:     192.168.4.4
MWI-Account:    alice@192.168.4.4

=============================================================================================

FreeSWITCH 根據 Contact 字段知道 alice 的 SIP 地址 sip:alice@192.168.4.4:5090。當使用 originate 呼叫 user/alice 這個地址時,FreeSWITCH 便查找本地數據庫,向 alice 的地址 sip:alice@192.168.4.4:5090 發送 INVITE 請求(實際的呼叫字符串是由用戶目錄中的 dial-string 參數決定的)。

API 與 APP

在上面的例子中,originate 是一個命令(Command),它用於控制 FreeSWITCH 發起一個呼叫。FreeSWITCH 的命令不僅可以在控制台上使用,也可以在各種嵌入式腳本、Event Socket (fs_cli 就是使用了 ESL庫)或 HTTP RPC 上使用,所有命令都遵循一個抽像的接口,因而這些命令又稱 API Commands。

echo() 則是一個程序(Application,簡稱 APP),它的作用是控制一個 Channel 的一端。我們知道,一個 Channel 有兩端,在上面的例子中,alice 是一端,別一端就是 echo()。電話接通后相當於 alice 在跟 echo() 這個家伙在通話。另一個常用的 APP 是 park()

originate user/alice &park()                                     

我們初始化了一個呼叫,在 alice 接電話后對端必須有一個人在跟也講話,否則的話,一個 Channel 只有一端,那是不可思議的。而如果這時 FreeSWITCH 找不到一個合適的人跟 alice 通話,那么它可以將該電話“掛起”,park()便是執行這個功能,它相當於一個 Channel 特殊的一端。

park() 的用戶體驗不好,alice 不知道要等多長時間才有人接電話,由於她聽不到任何聲音,實際上她在奇怪電話到底有沒有接通。相對而言,另一個程序 hold()則比較友好,它能在等待的同時播放保持音樂(MOH, Music on Hold)。

originate user/alice &hold()               

當然,你也可以直接播放一個特定的聲音文件:

originate user/alice &playback(/root/welcome.wav)                                     

或者,直接錄音:

originate user/alice &record(/root/voice_of_alice.wav)                                     

以上的例子實際上都只是建立一個 Channel,相當於 FreeSWITCH 作為一個 UA 跟 alice 通話。它是個一條腿(one leg,只有a-leg)的通話。在大多數情況下,FreeSWITCH 都是做為一個 B2BUA 來橋接兩個 UA 進行通話話的。在 alice 接聽電話以后,bridge()程序可以再啟動一個 UA 呼叫 bob:

originate user/alice &bridge(user/bob)

終於,alice 和 bob 可以通話了。我們也可以用另一個方式建立他們之音的通話:

originate user/alice &park()
originate user/bob &park()
show channels
uuid_bridge <alice_uuid> <bob_uuid>

在這里,我們分別呼叫 alice 和 bob,並把他們暫時 park 到一個地方。通過命令 show channels 我們可以知道每個 Channel 的 UUID,然后使用 uuid_bridge 命令將兩個 Channel 橋接起來。與上一種方式不同,上一種方式實際上是先橋接,再呼叫 bob。

上面,我們一共學習了兩條命令(API),originate 和 uuid_bridge。以及幾個程序(APP) - echo、park、bridge等。細心的讀者可以會發現,uuid_bridge API 和 bridge APP 有些類似,我也知道他們一個是先呼叫后橋接,另一個是先橋接后呼叫,那么,它們到底有什么本質的區別呢?

簡單來說,一個 APP 是一個程序(Application),它作為一個 Channel 一端與另一端的 UA 進行通信,相當於它工作在 Channel 內部;而一個 API 則是獨立於一個 Channel 之外的,它只能通過 UUID 來控制一個 Channel(如果需要的話)。

這就是 API 與 APP 最本質的區別。通常,我們在控制台上輸入的命令都是 API;而在 dialplan 中執行的程序都是 APP(dialplan 中也能執行一些特殊的 API)。大部分公用的 API 都是在 mod_commands 模塊中加載的;而 APP 則在 mod_dptools 中,因而 APP 又稱為撥號計划工具(Dialplan Tools)。某些模塊(如 mod_sofia)有自己的的 API 和 APP。

某些 APP 有與其對應的 API,如上述的 bridge/uuid_bridge,還有 transfer/uuid_transfer、playback/uuid_playback等。UUID 版本的 API 都是在一個 Channel 之外對 Channel 進行控制的,它們應用於不能參與到通話中卻又想對正在通話的 Channel做點什么的場景中。例如 alice 和 bob 正在暢聊,有個壞蛋使用 uuid_kill 將電話切斷,或使用 uuid_broadcast 給他們廣播惡作劇音頻,或者使用 uuid_record 把他們談話的內容錄音等。

命令行幫助

在本章的最后,我們來學習一個如何使用 FreeSWITCH 的命令行幫助。

使用 help 命令可以列出所有命令的幫助信息。某些命令,也有自己的幫助信息,如 sofia:

freeswitch@du-sevens-mac-pro.local> sofia help

USAGE:
--------------------------------------------------------------------------------
sofia help
sofia profile <profile_name> [[start|stop|restart|rescan] 
    [reloadxml]|flush_inbound_reg [<call_id>] [reboot]|[register|unregister]
....

其中,用尖括號(< >)括起來的表示要輸入的參數,而用方括號([ ])括起來的則表示可選項,該參數可以有也可以沒有。用豎線(|)分開的參數列表表示“或”的關系,即只能選其一。

FreeSWITCH 的命令參數沒有統一的解析函數,而都是由命令本身的函數負責解析的,因而不是很規范,不同的命令可能有不同的風格。所以使用時,除使用幫助信息外,最好還是查閱一下 Wiki 上的幫助(http://wiki.freeswitch.org/wiki/Mod_commands),那里大部分命令都有相關的例子。關於 APP,則可以參考http://wiki.freeswitch.org/wiki/Mod_dptools。本書的附錄中也有相應的中文參考。

小結

本章介紹了如何啟動與控制 FreeSWTICH,並提到了幾個常用的命令。另外,本章還着重講述了 APP 與 API 的區別,搞清楚這些概念對后面的學習是很有幫助的。


免責聲明!

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



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