非 Session 函數(shù)
Lua 腳本中也可以使用跟 sesion 不相關(guān)的函數(shù),最典型的是 freeswitch.consoleLog(),用于輸出日志,如:
freeswitch.consoleLog("NOTICE", "Hello lua log!\n")
另外一個(gè)是 freeswitch.API,它允許你執(zhí)行任意 API,如
api = freeswitch.API();
reply = api:executeString("sofia", "status");
獨(dú)立的 Lua 腳本
獨(dú)立的 Lua 腳本可以直接在控制臺(tái)終端上(使用 luarun)執(zhí)行,這種腳本大部分可用于執(zhí)行一些非 Session 相關(guān)的功能,后面我們會(huì)講到相關(guān)例子。
數(shù)據(jù)庫(kù)
在 Lua 中,可以使用 LuaSQL 連接各種關(guān)系型數(shù)據(jù)庫(kù),但據(jù)說(shuō) LuaSQL 與某些版本的數(shù)據(jù)庫(kù)驅(qū)動(dòng)結(jié)合有內(nèi)存泄漏問(wèn)題,配置起來(lái)也比較復(fù)雜。
另一種連接數(shù)據(jù)庫(kù)的方式是直接使用 freeswitch.Dbh。它可以直接通過(guò) FreeSWITCH 內(nèi)部的數(shù)據(jù)庫(kù)連接句柄來(lái)連接 sqlite 數(shù)據(jù)庫(kù)或任何支持 ODBC 的數(shù)據(jù)庫(kù)。下面是一個(gè)來(lái)自 FreeSWITCH wiki 的例子。
local dbh = freeswitch.Dbh("dsn","user","pass") -- when using ODBC
-- OR --
-- local dbh = freeswitch.Dbh("core:my_db") -- when using sqlite
assert(dbh:connected()) -- exits the script if we didn't connect properly
dbh:test_reactive("SELECT * FROM my_table",
"DROP TABLE my_table",
"CREATE TABLE my_table (id INTEGER(8), name VARCHAR(255))")
dbh:query("INSERT INTO my_table VALUES(1, 'foo')") -- populate the table
dbh:query("INSERT INTO my_table VALUES(2, 'bar')") -- with some test data
dbh:query("SELECT id, name FROM my_table", function(row)
stream:write(string.format("%5s : %s\n", row.id, row.name))
end)
dbh:query("UPDATE my_table SET name = 'changed'")
stream:write("Affected rows: " .. dbh:affected_rows() .. "\n")
dbh:release() -- optional
Javascript
相對(duì)于 Lua, 大家可能對(duì) Javascript 更熟悉一些。Javascript 是 Web 瀏覽器上最主流的編程語(yǔ)言,它最早是設(shè)計(jì)出來(lái)用于配合 HTML 渲染頁(yè)面用的,近幾年由于 Node.js 的發(fā)展使它在服務(wù)器端的應(yīng)用也已發(fā)揚(yáng)光大。它遵循 EMCAScript 標(biāo)準(zhǔn)。
通過(guò)加載 mod_spidermonkey 模塊可以使用 js 解析器,模塊 mod_spidermonkey_odbc 則支持在 Javascript 腳本中連接 ODBC 數(shù)據(jù)庫(kù)。
除語(yǔ)法不同外,用法上與 Lua 類(lèi)似,如使用 javascript (它是一個(gè)APP) 執(zhí)行一個(gè) session 相關(guān)的腳本,或 jsrun (它是一個(gè)API)執(zhí)行一個(gè)非 session 相關(guān)的腳本。
其它腳本語(yǔ)言
其它腳本語(yǔ)言的使用也類(lèi)似,讀者可參照使用。值得一提的是,F(xiàn)reeSWITCH 有一個(gè) mod_managed 模塊支持 Windows .NET 架構(gòu)下的語(yǔ)言(F#, VB.NET, C#, IronRuby, IronPython, JScript.NET),通過(guò) mono 也可以支持其它平臺(tái)(如 Linux )。