LUA_API

此篇文章記錄我學習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對象誊涯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挡毅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暴构,更是在濱河造成了極大的恐慌跪呈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件取逾,死亡現(xiàn)場離奇詭異耗绿,居然都是意外死亡,警方通過查閱死者的電腦和手機砾隅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門误阻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晴埂,你說我怎么就攤上這事究反。” “怎么了儒洛?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵精耐,是天一觀的道長。 經(jīng)常有香客問我琅锻,道長卦停,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任恼蓬,我火速辦了婚禮沫浆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滚秩。我一直安慰自己,他們只是感情好淮捆,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布郁油。 她就那樣靜靜地躺著本股,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桐腌。 梳的紋絲不亂的頭發(fā)上拄显,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音案站,去河邊找鬼躬审。 笑死,一個胖子當著我的面吹牛蟆盐,可吹牛的內(nèi)容都是我干的承边。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼石挂,長吁一口氣:“原來是場噩夢啊……” “哼博助!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹愚,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤富岳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拯腮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窖式,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年动壤,在試婚紗的時候發(fā)現(xiàn)自己被綠了萝喘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狼电,死狀恐怖蜒灰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肩碟,我是刑警寧澤强窖,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站削祈,受9級特大地震影響翅溺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜髓抑,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一咙崎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨拍,春花似錦褪猛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碳却。三九已至,卻和暖如春笑旺,著一層夾襖步出監(jiān)牢的瞬間昼浦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工筒主, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留关噪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓乌妙,卻偏偏與公主長得像使兔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冠胯,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Lua API Reference 關(guān)于 本頁面提供Lua的FreeSWITCH API文檔火诸。 API Sessi...
    5djindoudou閱讀 12,070評論 0 4
  • 開篇 今天來簡單了解一下 Lua 的函數(shù)調(diào)用:lua_call。 解析 函數(shù)調(diào)用協(xié)議 void lua_call ...
    碼上說閱讀 5,277評論 0 1
  • 開篇 本節(jié)了解一下 lua_Alloc 這個 API荠察。由于它不是函數(shù)置蜀,而只是一個類型定義,因此不會分析得很詳盡透徹...
    碼上說閱讀 3,043評論 1 1
  • 本系列不會講 Lua 的基礎(chǔ)語法悉盆,由于Lua的輕便簡潔盯荤,讀者自行搜索了解,很快就可以入門焕盟。本節(jié)開始秋秤,將直接進入 L...
    碼上說閱讀 1,955評論 0 1
  • 開篇 上一節(jié)分析了 lua_arith 的大部分代碼,由于篇幅原因脚翘,留到本節(jié)將繼續(xù)講解剩余的部分: 解析 現(xiàn)在我們...
    碼上說閱讀 814評論 0 1