首頁 > 新聞 > 專家觀點 >

《FreeSWITCH: VoIP實戰(zhàn)》: 運行 FreeSWITCH

2012-08-15 13:55:53   作者:杜金房   來源:FreeSWITCH    評論:0  點擊:


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

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

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

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

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

  發(fā)起呼叫

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

  originate user/alice &echo

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

  呼叫字符串

  上面的例子中,user/alice 稱為呼叫字符串,或呼叫 URL。user 是一種特殊的呼叫字符串。我們先來復(fù)習(xí)一下第四章的場景。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 根據(jù) Contact 字段知道 alice 的 SIP 地址 sip:alice@192.168.4.4:5090。當(dāng)使用 originate 呼叫 user/alice 這個地址時,F(xiàn)reeSWITCH 便查找本地數(shù)據(jù)庫,向 alice 的地址 sip:alice@192.168.4.4:5090 發(fā)送 INVITE 請求(實際的呼叫字符串是由用戶目錄中的 dial-string 參數(shù)決定的)。

  API 與 APP

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

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

  originate user/alice &park()                                    

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

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

  originate user/alice &hold()              

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

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

  或者,直接錄音:

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

  以上的例子實際上都只是建立一個 Channel,相當(dāng)于 FreeSWITCH 作為一個 UA 跟 alice 通話。它是個一條腿(one leg,只有a-leg)的通話。在大多數(shù)情況下,F(xiàn)reeSWITCH 都是做為一個 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。

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

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

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

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

  命令行幫助

   在本章的最后,我們來學(xué)習(xí)一個如何使用 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]
....

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

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

  小結(jié)

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

分享到: 收藏

專題