• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
     首頁 > 新聞 > 專家觀點 >

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

    2012-08-23 13:42:23   作者:杜金房    來源:FreeSWITCH    評論:0  點擊:


      一個在FreeSWITCH中外呼的腳本

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

      當然,這個應用很簡單,就沒必要使用event_socket那些復雜的東東。寫了一個Lua腳本,基本能滿足要求了。

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

    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"

    簡單起見,包裝一個函數(shù):

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

      定義呼叫函數(shù)。freeswitch.Session會呼叫一個號碼,并一直等待對方應答。然后,streamFile播放一段聲音,掛機。最后,函數(shù)返回掛機原因 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
     

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

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

      while 循環(huán)中,讀到的每一行實際上是一個號碼,調(diào)用上面定義的call_number進行呼叫,并將呼叫結(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


      很簡單,很強大,是吧?

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

    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/

    分享到: 收藏

    專題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 汤阴县| 临泉县| 黄龙县| 潮安县| 万源市| 昌吉市| 奇台县| 蒲江县| 兖州市| 安仁县| 宝山区| 泾源县| 上思县| 娄烦县| 纳雍县| 灌云县| 洛浦县| 红桥区| 旌德县| 新津县| 崇明县| 湖口县| 芦山县| 茶陵县| 华坪县| 台北县| 辛集市| 五河县| 临海市| 鄱阳县| 德化县| 兴安盟| 无极县| 阿克苏市| 金坛市| 大兴区| 清苑县| 寻甸| 亚东县| 措美县| 高青县| http://444 http://444 http://444 http://444 http://444 http://444