首页 > 新闻 > 专家观点 >

《FreeSWITCH: VoIP实战》: 一个在FreeSWITCH中外呼的Lua脚本

2012-08-23 13:42:23   作者:杜金房    来源:FreeSWITCH    评论:0  点击:


  一个在FreeSWITCH中外呼的脚本

  前几天,一个朋友问我能否实现在FS中外呼,然后放一段录音,我说当然能,写个简单的脚本就行。但后来他说还要知道呼叫是否成功,我说,那就需要复杂一点了。

  当然,这个应用很简单,就没必要使用event_socket那些复杂的东东。写了一个Lua脚本,基本能满足要求了。

  思路是将待呼号码放到一个文件(number_file_name)中,每个一行,然后用Lua依次读每一行,呼通后播放file_to_play,结果写到log_file_name中。为保证对方应该后才开始播放,需要ignore_early_media参数,否则,对方传回铃音或彩铃时播放就会开始,而那不是我们想要的。

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"

简单起见,包装一个函数:

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

  定义呼叫函数。freeswitch.Session会呼叫一个号码,并一直等待对方应答。然后,streamFile播放一段声音,挂机。最后,函数返回挂机原因 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
 

  实际的代码是从这里开始执行的。首先打开存放电话号码的文件(准备读),和呼叫日志(准备写,追加)。

  然后是无限循环(while),每次读取一行,当读到空行或文件尾时,退出。

  while 循环中,读到的每一行实际上是一个号码,调用上面定义的call_number进行呼叫,并将呼叫结果写到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


  很简单,很强大,是吧?

  将脚本存到scripts目录中(通常是/usr/local/freeswitch/scripts/),起名叫dialer.lua,在FreeSWITCH控制台或fs_cli中执行:

luarun dialer.lua

  完整的脚本:

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

  另外还有一个 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/

分享到: 收藏

专题