此篇文章記錄我學習freeswitch中l(wèi)ua腳本跪解,從官網(wǎng)搬運api并且補充官網(wǎng)沒有給出的解釋。
一签孔、常用與session有關(guān)的函數(shù)
·getVariable叉讥。取得通道變量的值,如:
local moh = session:getVariable("hold_music")
local dest_number = session:getVariable("context")
local dest_number = session:getVariable("destination_number")
local cid_name = session:getVariable("caller_id_name")
local cid_number = session:getVariable("caller_id_number")
local ani = session:getVariable("ani")
local uuid = session:getVariable("uuid")
·getUUID骏啰。取得當前Session的UUID节吮,下列兩行是等價的:
local uuid = session:get_uuid();
local uuid = session:getVariable("uuid")
·setVariable。設置通道變量判耕,等價于Dialplan App里的set:
session:setVariable("varname", "varval")
·hangup透绩。掛斷當前通話:
session:hangup();
--也可以同時指定掛斷原因,如以下函數(shù)將在掛斷時向?qū)Ψ椒祷赜脩裘Γ?session:hangup("USER_BUSY")
·session:hangupCause 您可以找到接通的電話的掛機原因和/或發(fā)起的電話未完成的原因壁熄。
-- 發(fā)起外呼
obSession = freeswitch.Session("sofia/192.168.0.4/1002")
-- Check to see if the call was answered
if obSession:ready() then
-- Do something good here
else -- This means the call was not answered ... Check for the reason
local obCause = obSession:hangupCause()
freeswitch.consoleLog("info", "obSession:hangupCause() = " .. obCause )
if ( obCause == "USER_BUSY" ) then -- SIP 486
-- For BUSY you may reschedule the call for later
elseif ( obCause == "NO_ANSWER" ) then
-- Call them back in an hour
elseif ( obCause == "ORIGINATOR_CANCEL" ) then -- SIP 487
-- May need to check for network congestion or problems
else
-- Log these issues
end
end
·ready帚豪。檢查Session是否可正常使用,如果已經(jīng)掛機就會返回false草丧。在寫腳本時狸臣,如果有循環(huán),一定需要經(jīng)常檢測session:ready()是否為true昌执,否則Session掛機后Lua腳本可能仍然在死循環(huán)地運行烛亦。
while (session:ready() == true) do
-- do something here
end
·streamFile:放音,相當于Dialplan App里的playback懂拾。
session:streamFile("/tmp/test.wav")
--也可以通過session:execute()函數(shù)來執(zhí)行相關(guān)的App煤禽,
--如
session:execute("playback","/tmp/sound.wav")
與
session:streamFile("/tmp/sound.wav")
是等價的
·recordFile:錄音,相當于Dialplan App里的record岖赋,參數(shù)是:file_name [,max_len_secs] [,silence_threshold] [,silence_secs]
其中檬果,各參數(shù)含義如下:
·file_name:錄音文件名。
·max_len_secs:錄音最長的秒數(shù)唐断。
·silence_threashold:一個聲音閾值选脊,如果聲音小于該值,就認為是靜音。
·silence_secs:如果靜音時長大于一定秒數(shù),則停止錄音仔沿。
例如,以下函數(shù)將對當前的Channel錄音角寸,并存放到/tmp/test_record.wav中:
session:recordFile("/tmp/test_record.wav")
·read菩混。類似于Dialplan App中的read,用于播放一個聲音并獲取DTMF扁藕。它的5個參數(shù)與read含義相同:<min digits><max digits><file to play><inter-digit timeout><terminators>
digits = session:read(15, 18, "/tmp/input-id-card.wav", "5000", "#");
session:("log", "INFO ID Card Number: ".. digits .."\n");
讀者可以發(fā)現(xiàn)Lua中的read比Dialplan App中的read少了一個參數(shù)沮峡。由于session:read()能返回值,因此那個參數(shù)就不需要了亿柑,實際收到的DTMF會返回到本例的digits變量中邢疙。
·playAndGetDigits。與Dialplan App中的play_and_get_digits類似望薄,它的參數(shù)格式是:
<min_digits>, <max_digits>, <max_attempts>, <timeout>, <terminators>,<prompt_audio_files>,<input_error_audio_files>,<digit_regex>, [variable_name], [digit_timeout],[transfer_on_failure])
其中疟游,大部分參數(shù)都很直觀,也跟play_and_get_digits中類似痕支。其中timeout是收齊所有號的超時值颁虐,而digit_timeout是允許的兩次按鍵之音的時間間隔最大值,最后transfer_on_failure指明如果失敗后是否轉(zhuǎn)到Dialplan中的一個Extension上去卧须,它的格式應該是一個Dialplan三要素的格式串另绩,如“failed XML dialplan”。
digits = session:playAndGetDigits(15, 18, 3, 10000, "#",
"/tmp/input-id-card.wav", "/tmp/invalid_num.wav",
"^\\d{15}|\\d{17}[0-9\\*]$")
session:execute("log", "INFO ID Card Number: ".. digits .."\n");
·setInputCallback花嘶。在放音或錄音時笋籽,用戶按下的DTMF可以用于觸發(fā)一些功能。所以在這些狀態(tài)下椭员,Lua 支持如果收到DTMF等外部輸入時车海,則調(diào)用相關(guān)的回調(diào)函數(shù)。setInputCallback的作用就是設置(安裝)一個回調(diào)函數(shù)隘击。
01 function onInputCBF(s, type, obj, arg)
02 if (type == "dtmf") then
03 freeswitch.consoleLog("INFO",
04 "Got DTMF: " .. obj.digit .. " Duration: " .. obj.duration .. "\\n")
05 if (obj.digit == "3") then
06 return 'break'
07 end
08 end
09 return ''
10 end
11 session:setInputCallback('onInputCBF', '');
12 session:streamFile("local_stream://moh");
其中侍芝,第1行,我們定義了一個回調(diào)函數(shù)onInputCBF埋同,并在第11行使用setInput-Callback將該函數(shù)綁定到該 Session上竭贩。第12行執(zhí)行streamFile實現(xiàn)一直不停地播放等待音樂。當用戶按下話機上的鍵時莺禁,F(xiàn)reeSWITCH就會回 調(diào)上面指定的回調(diào)函數(shù)。下面我們來看一下該函數(shù)的內(nèi)容窄赋∮炊回調(diào)函數(shù)一共有4個參數(shù),在這里我們只關(guān)注type和obj兩個參數(shù)忆绰。在此浩峡,由于我們的回調(diào)函數(shù)是由DTMF觸發(fā)的,因此這里的type值為“dtmf”错敢。obj是一個Table翰灾,它的兩個Key分別是digit和duration缕粹,分別表示DTMF的鏈值和時長。
上面的例子中第2行測試該回調(diào)是否是由DTMF引起纸淮,如果是平斩,就打印相關(guān)DTMF信息。在第5行測試如果用戶按 了3的話咽块,就返回break绘面。返回break會停止當前正在執(zhí)行的App(在這里我們正在播放保持音樂),如果后面沒有 其他腳本語句的話侈沪,Lua App就會退出揭璃。如果返回空值(空字符串,如第9行)亭罪,則它什么也不做瘦馍。
如果我們順序按1、2应役、3情组,則上面例子在控制臺上的輸出結(jié)果如下:
[INFO] switch_cpp.cpp:1288 Got DTMF: 1
[INFO] switch_cpp.cpp:1288 Got DTMF: 2
[INFO] switch_cpp.cpp:1288 Got DTMF: 3
除DTMF外,回調(diào)還可能由其他的輸入引起扛吞,如在進行語音識別的時候識別到相關(guān)關(guān)鍵詞.
`session:say
播放預先錄制的聲音文件呻惕,包括數(shù)字,日期滥比,貨幣等內(nèi)容亚脆。請參閱撥號計劃工具say中有關(guān)于say的app信息。
參數(shù):<lang><say_type><say_method>
session:say("12345", "en", "number", "pronounced");
其中:常用參數(shù)
session:say("9999", "zh", "number", "pronounced"); --zh 表示中文語音包盲泛,en表示英文語音包
session:say("192.168.52.35", "zh", "ip_address", "iterated"); -- number表示讀數(shù)字濒持,ip_address表示ip地址,name_spelled表示讀文字
session:say("AAABBB", "zh", "name_spelled", "iterated"); -- pronounced表示讀計數(shù)量寺滚,比如99讀成九十九柑营,iterated表示逐字讀,99就成九九
二村视、非session函數(shù)和獨立的Lua腳本
Lua腳本中也可以使用跟Session不相關(guān)的函數(shù)官套,最典型的是freeswitch.consoleLog(),其用于輸出日志蚁孔,如
freeswitch.consoleLog("NOTICE", "Hello lua log!\n")
另外一個是freeswitch.API()奶赔,允許你在Lua中執(zhí)行任意API,如:
api = freeswitch.API()
reply = api:execute("version", "")
freeswitch.consoleLog("INFO", "Got reply:\n\n" .. reply .. "\n")
上面Lua腳本可以直接在FreeSWITCH控制臺上執(zhí)行杠氢,如果將上述腳本保存到/tmp/a.lua中站刑,則輸出結(jié)果為:
freeswitch> lua /tmp/a.lua
2013-09-16 16:20:31.363305 [INFO] switch_cpp.cpp:1288 Got reply:
FreeSWITCH Version 1.5.6b+git~20130914T180606Z~60f5dec57e (git 60f5dec 2013-09-14 18:06:06Z)
除此之外,其他的非Session函數(shù)還有freeswitch.bridge()鼻百、freeswitch.email()等绞旅,在此就不多介紹了摆尝。非Session函數(shù)一般運行在獨立的Lua腳本中。獨立的Lua腳本可以直接在控制臺終端上執(zhí)行(使用luarun)因悲, 這種腳本大部分可用于執(zhí)行一些非Session相關(guān)的功能(因為這里面沒有Session)堕汞。讀到這里讀者已經(jīng)了解到 了,Lua是一個App囤捻,而luarun是一個API臼朗。 我們剛剛講到的a.lua就是一個典型的可獨立運行的Lua腳本。獨立運行的Lua腳本跟在Dialplan中用Lua App運行的不同蝎土,前者不會自動獲得一個session對象(Table)视哑。當然,獨立運行的腳本也可以自行創(chuàng)建session對象誊涯。