其它一些 “/”開(kāi)頭的指令與 Event Socket 中相關(guān)的命令相同,如:
/event -- 開(kāi)啟事件接收
/noevents -- 關(guān)閉事件接收
/nixevent -- 除了特定一種外,開(kāi)啟所有事件
/log -- 設置 log 級別,如 /log info 或 /log debug 等
/nolog -- 關(guān)閉 log
/filter -- 過(guò)濾事件
另外,一些“重要”命令不能直接在 fs_cli 中執行,如 shutdown 命令,在控制臺上可以直接執行,但在 fs_cli中,需要執行 fsctl shutdown。
除此之外,其它命令都與直接在 FreeSWITCH 控制臺上執行是一樣的。它也支持快捷鍵,最常用的快捷鍵是 F6(reloadxml)、F7(關(guān)閉 log輸出)、F8(開(kāi)啟 debug 級別的 log 輸出)。
在 *nix上,兩者都通過(guò) libeditline 支持命令行編輯功能。可以通過(guò)上、下箭頭查看命令歷史。
發(fā)起呼叫
可以在 FreeSWITCH 中使用 originate 命令發(fā)起一次呼叫,如果用戶(hù) 1000 已經(jīng)注冊,那么:
originate user/alice &echo
上述命令在呼叫 1000 這個(gè)用戶(hù)后,便執行 echo 這個(gè)程序。echo 是一個(gè)回音程序,即它會(huì )把任何它“聽(tīng)到”的聲音(或視頻)再返回(說(shuō))給對方。因此,如果這時(shí)候用戶(hù) 1000 接了電話(huà),無(wú)論說(shuō)什么都能聽(tīng)到自己的聲音。
呼叫字符串
上面的例子中,user/alice 稱(chēng)為呼叫字符串,或呼叫 URL。user 是一種特殊的呼叫字符串。我們先來(lái)復習一下第四章的場(chǎng)景。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 這個(gè)地址時(shí),FreeSWITCH 便查找本地數據庫,向 alice 的地址 sip:alice@192.168.4.4:5090 發(fā)送 INVITE 請求(實(shí)際的呼叫字符串是由用戶(hù)目錄中的 dial-string 參數決定的)。
API 與 APP
在上面的例子中,originate 是一個(gè)命令(Command),它用于控制 FreeSWITCH 發(fā)起一個(gè)呼叫。FreeSWITCH 的命令不僅可以在控制臺上使用,也可以在各種嵌入式腳本、Event Socket (fs_cli 就是使用了 ESL庫)或 HTTP RPC 上使用,所有命令都遵循一個(gè)抽像的接口,因而這些命令又稱(chēng) API Commands。
echo() 則是一個(gè)程序(Application,簡(jiǎn)稱(chēng) APP),它的作用是控制一個(gè) Channel 的一端。我們知道,一個(gè) Channel 有兩端,在上面的例子中,alice 是一端,別一端就是 echo()。電話(huà)接通后相當于 alice 在跟 echo() 這個(gè)家伙在通話(huà)。另一個(gè)常用的 APP 是 park()
originate user/alice &park()
我們初始化了一個(gè)呼叫,在 alice 接電話(huà)后對端必須有一個(gè)人在跟也講話(huà),否則的話(huà),一個(gè) Channel 只有一端,那是不可思議的。而如果這時(shí) FreeSWITCH 找不到一個(gè)合適的人跟 alice 通話(huà),那么它可以將該電話(huà)“掛起”,park()便是執行這個(gè)功能,它相當于一個(gè) Channel 特殊的一端。
park() 的用戶(hù)體驗不好,alice 不知道要等多長(cháng)時(shí)間才有人接電話(huà),由于她聽(tīng)不到任何聲音,實(shí)際上她在奇怪電話(huà)到底有沒(méi)有接通。相對而言,另一個(gè)程序 hold()則比較友好,它能在等待的同時(shí)播放保持音樂(lè )(MOH, Music on Hold)。
originate user/alice &hold()
當然,你也可以直接播放一個(gè)特定的聲音文件:
originate user/alice &playback(/root/welcome.wav)
或者,直接錄音:
originate user/alice &record(/root/voice_of_alice.wav)
以上的例子實(shí)際上都只是建立一個(gè) Channel,相當于 FreeSWITCH 作為一個(gè) UA 跟 alice 通話(huà)。它是個(gè)一條腿(one leg,只有a-leg)的通話(huà)。在大多數情況下,FreeSWITCH 都是做為一個(gè) B2BUA 來(lái)橋接兩個(gè) UA 進(jìn)行通話(huà)話(huà)的。在 alice 接聽(tīng)電話(huà)以后,bridge()程序可以再啟動(dòng)一個(gè) UA 呼叫 bob:
originate user/alice &bridge(user/bob)
終于,alice 和 bob 可以通話(huà)了。我們也可以用另一個(gè)方式建立他們之音的通話(huà):
originate user/alice &park()
originate user/bob &park()
show channels
uuid_bridge <alice_uuid> <bob_uuid>
在這里,我們分別呼叫 alice 和 bob,并把他們暫時(shí) park 到一個(gè)地方。通過(guò)命令 show channels 我們可以知道每個(gè) Channel 的 UUID,然后使用 uuid_bridge 命令將兩個(gè) Channel 橋接起來(lái)。與上一種方式不同,上一種方式實(shí)際上是先橋接,再呼叫 bob。
上面,我們一共學(xué)習了兩條命令(API),originate 和 uuid_bridge。以及幾個(gè)程序(APP) - echo、park、bridge等。細心的讀者可以會(huì )發(fā)現,uuid_bridge API 和 bridge APP 有些類(lèi)似,我也知道他們一個(gè)是先呼叫后橋接,另一個(gè)是先橋接后呼叫,那么,它們到底有什么本質(zhì)的區別呢?
簡(jiǎn)單來(lái)說(shuō),一個(gè) APP 是一個(gè)程序(Application),它作為一個(gè) Channel 一端與另一端的 UA 進(jìn)行通信,相當于它工作在 Channel 內部;而一個(gè) API 則是獨立于一個(gè) Channel 之外的,它只能通過(guò) UUID 來(lái)控制一個(gè) Channel(如果需要的話(huà))。
這就是 API 與 APP 最本質(zhì)的區別。通常,我們在控制臺上輸入的命令都是 API;而在 dialplan 中執行的程序都是 APP(dialplan 中也能執行一些特殊的 API)。大部分公用的 API 都是在 mod_commands 模塊中加載的;而 APP 則在 mod_dptools 中,因而 APP 又稱(chēng)為撥號計劃工具(Dialplan Tools)。某些模塊(如 mod_sofia)有自己的的 API 和 APP。
某些 APP 有與其對應的 API,如上述的 bridge/uuid_bridge,還有 transfer/uuid_transfer、playback/uuid_playback等。UUID 版本的 API 都是在一個(gè) Channel 之外對 Channel 進(jìn)行控制的,它們應用于不能參與到通話(huà)中卻又想對正在通話(huà)的 Channel做點(diǎn)什么的場(chǎng)景中。例如 alice 和 bob 正在暢聊,有個(gè)壞蛋使用 uuid_kill 將電話(huà)切斷,或使用 uuid_broadcast 給他們廣播惡作劇音頻,或者使用 uuid_record 把他們談話(huà)的內容錄音等。
命令行幫助
在本章的最后,我們來(lái)學(xué)習一個(gè)如何使用 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]
....
其中,用尖括號(< >)括起來(lái)的表示要輸入的參數,而用方括號([ ])括起來(lái)的則表示可選項,該參數可以有也可以沒(méi)有。用豎線(xiàn)(|)分開(kāi)的參數列表表示“或”的關(guān)系,即只能選其一。
FreeSWITCH 的命令參數沒(méi)有統一的解析函數,而都是由命令本身的函數負責解析的,因而不是很規范,不同的命令可能有不同的風(fēng)格。所以使用時(shí),除使用幫助信息外,最好還是查閱一下 Wiki 上的幫助(http://wiki.freeswitch.org/wiki/Mod_commands),那里大部分命令都有相關(guān)的例子。關(guān)于 APP,則可以參考 http://wiki.freeswitch.org/wiki/Mod_dptools。本書(shū)的附錄中也有相應的中文參考。
小結
本章介紹了如何啟動(dòng)與控制 FreeSWTICH,并提到了幾個(gè)常用的命令。另外,本章還著(zhù)重講述了 APP 與 API 的區別,搞清楚這些概念對后面的學(xué)習是很有幫助的。