首頁 > 新聞 > 專家觀點(diǎn) >

《FreeSWITCH: VoIP實(shí)戰(zhàn)》: 一個(gè)在FreeSWITCH中外呼的Lua腳本

2012-08-23 13:42:23   作者:杜金房    來源:FreeSWITCH    評(píng)論:0  點(diǎn)擊:


  一個(gè)在FreeSWITCH中外呼的腳本

  前幾天,一個(gè)朋友問我能否實(shí)現(xiàn)在FS中外呼,然后放一段錄音,我說當(dāng)然能,寫個(gè)簡(jiǎn)單的腳本就行。但后來他說還要知道呼叫是否成功,我說,那就需要復(fù)雜一點(diǎn)了。

  當(dāng)然,這個(gè)應(yīng)用很簡(jiǎn)單,就沒必要使用event_socket那些復(fù)雜的東東。寫了一個(gè)Lua腳本,基本能滿足要求了。

  思路是將待呼號(hào)碼放到一個(gè)文件(number_file_name)中,每個(gè)一行,然后用Lua依次讀每一行,呼通后播放file_to_play,結(jié)果寫到log_file_name中。為保證對(duì)方應(yīng)該后才開始播放,需要ignore_early_media參數(shù),否則,對(duì)方傳回鈴音或彩鈴時(shí)播放就會(huì)開始,而那不是我們想要的。

prefix = "{ignore_early_media=true}sofia/gateway/cnc/"
number_file_name = "/usr/local/freeswitch/scripts/number.txt"
file_to_play = "/usr/local/freeswitch/sounds/custom/8000/sound.wav"
log_file_name = "/usr/local/freeswitch/log/dialer_log.txt"

簡(jiǎn)單起見,包裝一個(gè)函數(shù):

function debug(s)
 freeswitch.consoleLog("notice", s .. "\n")
end

  定義呼叫函數(shù)。freeswitch.Session會(huì)呼叫一個(gè)號(hào)碼,并一直等待對(duì)方應(yīng)答。然后,streamFile播放一段聲音,掛機(jī)。最后,函數(shù)返回掛機(jī)原因 hangup_cause。

function call_number(number)
 dial_string = prefix .. tostring(number);
 
 debug("calling " .. dial_string);
 session = freeswitch.Session(dial_string);

 if session:ready() then
  session:sleep(1000)
  session:streamFile(file_to_play)
  session:hangup()
 end
 -- waiting for hangup              
 while session:ready() do
  debug("waiting for hangup " .. number)
  session:sleep(1000)
 end
   
 return session:hangupCause()
end
 

  實(shí)際的代碼是從這里開始執(zhí)行的。首先打開存放電話號(hào)碼的文件(準(zhǔn)備讀),和呼叫日志(準(zhǔn)備寫,追加)。

  然后是無限循環(huán)(while),每次讀取一行,當(dāng)讀到空行或文件尾時(shí),退出。

  while 循環(huán)中,讀到的每一行實(shí)際上是一個(gè)號(hào)碼,調(diào)用上面定義的call_number進(jìn)行呼叫,并將呼叫結(jié)果寫到log_file中。

number_file = io.open(number_file_name, "r")
log_file = io.open(log_file_name, "a+")

while true do

 line = number_file:read("*line")
 if line == "" or line == nil then break end

 hangup_cause = call_number(line)
 log_file:write(os.date("%H:%M:%S ") .. line .. " " .. hangup_cause .. "\n")
end


  很簡(jiǎn)單,很強(qiáng)大,是吧?

  將腳本存到scripts目錄中(通常是/usr/local/freeswitch/scripts/),起名叫dialer.lua,在FreeSWITCH控制臺(tái)或fs_cli中執(zhí)行:

luarun dialer.lua

  完整的腳本:

   http://fisheye.freeswitch.org/browse/freeswitch-contrib/seven/lua/dialer.lua?hb=true

  另外還有一個(gè) batch_dialer:

  http://fisheye.freeswitch.org/browse/freeswitch-contrib/seven/lua/batch_dialer.lua?hb=true

  FreeSWITCH提供的API:http://wiki.freeswitch.org/wiki/Mod_lua

  Lua語言:http://www.lua.org/

分享到: 收藏

專題