非 Session 函數(shù)
Lua 腳本中也可以使用跟 sesion 不相關的函數(shù),最典型的是 freeswitch.consoleLog(),用于輸出日志,如:
freeswitch.consoleLog("NOTICE", "Hello lua log!\n")
另外一個是 freeswitch.API,它允許你執(zhí)行任意 API,如
api = freeswitch.API();
reply = api:executeString("sofia", "status");
獨立的 Lua 腳本
獨立的 Lua 腳本可以直接在控制臺終端上(使用 luarun)執(zhí)行,這種腳本大部分可用于執(zhí)行一些非 Session 相關的功能,后面我們會講到相關例子。
數(shù)據(jù)庫
在 Lua 中,可以使用 LuaSQL 連接各種關系型數(shù)據(jù)庫,但據(jù)說 LuaSQL 與某些版本的數(shù)據(jù)庫驅動結合有內(nèi)存泄漏問題,配置起來也比較復雜。
另一種連接數(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
-- 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
相對于 Lua, 大家可能對 Javascript 更熟悉一些。Javascript 是 Web 瀏覽器上最主流的編程語言,它最早是設計出來用于配合 HTML 渲染頁面用的,近幾年由于 Node.js 的發(fā)展使它在服務器端的應用也已發(fā)揚光大。它遵循 EMCAScript 標準。
通過加載 mod_spidermonkey 模塊可以使用 js 解析器,模塊 mod_spidermonkey_odbc 則支持在 Javascript 腳本中連接 ODBC 數(shù)據(jù)庫。
除語法不同外,用法上與 Lua 類似,如使用 javascript (它是一個APP) 執(zhí)行一個 session 相關的腳本,或 jsrun (它是一個API)執(zhí)行一個非 session 相關的腳本。
其它腳本語言
其它腳本語言的使用也類似,讀者可參照使用。值得一提的是,F(xiàn)reeSWITCH 有一個 mod_managed 模塊支持 Windows .NET 架構下的語言(F#, VB.NET, C#, IronRuby, IronPython, JScript.NET),通過 mono 也可以支持其它平臺(如 Linux )。