|
什么是嵌入式腳本? 一般來說,編程語言分為兩種:編譯型語言(如C)和解釋型語言(如 javascript,perl 等)。使用解釋型語言編寫出來的腳本不需要編譯,因而非常靈活方便。典型地,F(xiàn)reeSWITCH 支持的語言有:
其它腳本語言如 Php, Ruby 以前是支持的,由于它們有內(nèi)存及性能問題,且沒有志愿者維護,現(xiàn)在已經(jīng)被列為 Unsupported 了。 應用場景 當然,這里說的一路通話不是說它們只能控制唯一一路通話。以 Lua 為例,你可以把呼叫路由到一個 lua 腳本,當有電話進來時,F(xiàn)reeSWITCH 會為每一路通話啟動一個線程,控制每一路通話的 lua 腳本則在相應的線程內(nèi)執(zhí)行,互不干擾。Java 語言需要 Java 的虛擬機環(huán)境,比這個要復雜些。 Lua 在 FreeSWITCH 中,Lua 模塊是默認加載的。在所有嵌入式腳本語言中,它是最值得推薦的語言。首先它非常輕量級,mod_lua.so 經(jīng)過減肥(strip)后只有272K;另外,它的語法也是相的的簡單。有人做過對比說,在嵌入式的腳本語言里,如果 Python 得 2 分,Perl 拿 4,Javascript 得 5, 則 Lua 語言可得 10 分。可見一斑。 另外, Lua 模塊的文檔也是最全的。寫其它語言的程序好多時候都需要參照 Lua 模塊的文檔。 語法簡介 Lua 變量不需要類型聲明 Lua 支持類似面向對象的編程,所有對象都是一個 Table(Lua 中獨有的概念)。 Lua 支持尾遞歸、閉包。 詳細的資料請參閱有關資料,底線是 -- 如果你會其它編程語言,在 30 分鐘內(nèi)就能學會它。 將電話路由到 Lua 腳本 <action application="lua" data="test.lua"/> 便可將進入 dialplan 的電話交給 lua 腳本接管。腳本的默認路徑是安裝路徑的 scripts/ 目錄下,當然你也可以指定絕對路徑,如 /tmp/test.lua。需要注意在 windows 下目錄分隔符是用 "\" ,所以有時候需要兩個,如“c:\test\test.lua”。 Session 相關函數(shù) -- answer the call -- sleep a second -- play a file -- hangup 大部分跟 session 有關的函數(shù)是跟 FreeSWITCH 中的 App 是一一對應的,如上面的 answer()、hangup() 等,特別的, streamFile() 對應 playback() App 。如果沒有對應的函數(shù),也可以通過 session:execute() 來執(zhí)行相關的 App,如 session:execute("playback", "/tmp/sound.wav") 等價于 session:streamFile("/tmp/sound.wav")。 需要注意,lua 腳本執(zhí)行完畢后默認會掛斷電話,所以上面的 Hello Lua 例子中不需要明確的 session:hangup()。如果想在 lua 腳本執(zhí)行完畢后繼續(xù)執(zhí)行 dialplan 中的后續(xù)流程,則需要在腳本開始處執(zhí)行 session:setAutoHangup(false) 如下列場景,test.lua 執(zhí)行完畢后(假設沒有 session:hangup(),主叫也沒有掛機),如果沒有 setAutoHangup(false),則后續(xù)的 playback 動作得不到執(zhí)行。 <extension name="eavesdrop"> 非 Session 函數(shù) freeswitch.consoleLog("NOTICE", "Hello lua log!\n") 另外一個是 freeswitch.API,它允許你執(zhí)行任意 API,如 api = freeswitch.API(); 獨立的 Lua 腳本 數(shù)據(jù)庫 另一種連接數(shù)據(jù)庫的方式是直接使用 freeswitch.Dbh。它可以直接通過 FreeSWITCH 內(nèi)部的數(shù)據(jù)庫連接句柄來連接 sqlite 數(shù)據(jù)庫或任何支持 ODBC 的數(shù)據(jù)庫。下面是一個來自 FreeSWITCH wiki 的例子。 local dbh = freeswitch.Dbh("dsn","user","pass") -- when using ODBC assert(dbh:connected()) -- exits the script if we didn't connect properly dbh:test_reactive("SELECT * FROM my_table", dbh:query("INSERT INTO my_table VALUES(1, 'foo')") -- populate the table dbh:query("SELECT id, name FROM my_table", function(row) dbh:query("UPDATE my_table SET name = 'changed'") dbh:release() -- optional Javascript 通過加載 mod_spidermonkey 模塊可以使用 js 解析器,模塊 mod_spidermonkey_odbc 則支持在 Javascript 腳本中連接 ODBC 數(shù)據(jù)庫。 除語法不同外,用法上與 Lua 類似,如使用 javascript (它是一個APP) 執(zhí)行一個 session 相關的腳本,或 jsrun (它是一個API)執(zhí)行一個非 session 相關的腳本。 其它腳本語言 |
|
|
來自: hginvent > 《freeswitch》