• <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實(shí)戰》:嵌入式腳本

    2012-08-22 11:06:12   作者:杜金房    來(lái)源:FreeSWITCH   評論:0  點(diǎn)擊:


      什么是嵌入式腳本?

      其實(shí)前面我們學(xué)到的 XML dialplan 已經(jīng)體現了其非凡的配置能力,它配合 FreeSWITCH 提供的各種 App 也可以認為是一種腳本。當然,畢竟 XML 是一種描述語(yǔ)言,功能還有限。FreeSWITCH 通過(guò)嵌入其它語(yǔ)言的解析器支持很多流行的編程語(yǔ)言。

      一般來(lái)說(shuō),編程語(yǔ)言分為兩種:編譯型語(yǔ)言(如C)和解釋型語(yǔ)言(如 javascript,perl 等)。使用解釋型語(yǔ)言編寫(xiě)出來(lái)的腳本不需要編譯,因而非常靈活方便。典型地,FreeSWITCH 支持的語(yǔ)言有:

    • Lua
    • Javascript
    • Python
    • Perl
    • Java

      其它腳本語(yǔ)言如 Php, Ruby 以前是支持的,由于它們有內存及性能問(wèn)題,且沒(méi)有志愿者維護,現在已經(jīng)被列為 Unsupported 了。

      應用場(chǎng)景

      一般來(lái)說(shuō),這些嵌入式腳本主要用于寫(xiě) IVR,即主要用來(lái)控制一路通話(huà)的呼叫流程。雖然它們也可以控制多路通話(huà)(在后面我們也會(huì )講到這樣的例子,但這不是他們擅長(cháng)的功能。

       當然,這里說(shuō)的一路通話(huà)不是說(shuō)它們只能控制唯一一路通話(huà)。以 Lua 為例,你可以把呼叫路由到一個(gè) lua 腳本,當有電話(huà)進(jìn)來(lái)時(shí),FreeSWITCH 會(huì )為每一路通話(huà)啟動(dòng)一個(gè)線(xiàn)程,控制每一路通話(huà)的 lua 腳本則在相應的線(xiàn)程內執行,互不干擾。Java 語(yǔ)言需要 Java 的虛擬機環(huán)境,比這個(gè)要復雜些。

      Lua

      這是一門(mén)小眾語(yǔ)言,聽(tīng)起來(lái),它可能不像其它語(yǔ)言(如 Java)那樣“如雷貫耳”,但由于其優(yōu)雅的語(yǔ)法及小巧的身段受到很多開(kāi)發(fā)者的青睞,尤其是在游戲領(lǐng)域(我相信有很多人知道它是緣于2010年一則新聞中說(shuō)一個(gè)14歲的少年用它編出了 iPhone 上的名為 Bubble Ball 的游戲,該游戲下載量曾一度超過(guò)史上最流行的“憤怒的小鳥(niǎo)”)。

      在 FreeSWITCH 中,Lua 模塊是默認加載的。在所有嵌入式腳本語(yǔ)言中,它是最值得推薦的語(yǔ)言。首先它非常輕量級,mod_lua.so 經(jīng)過(guò)減肥(strip)后只有272K;另外,它的語(yǔ)法也是相的的簡(jiǎn)單。有人做過(guò)對比說(shuō),在嵌入式的腳本語(yǔ)言里,如果 Python 得 2 分,Perl 拿 4,Javascript 得 5, 則 Lua 語(yǔ)言可得 10 分。可見(jiàn)一斑。

      另外, Lua 模塊的文檔也是最全的。寫(xiě)其它語(yǔ)言的程序好多時(shí)候都需要參照 Lua 模塊的文檔。

      語(yǔ)法簡(jiǎn)介

       Lua 語(yǔ)言的注釋為 “--” 開(kāi)頭(單行),或 “--[[ ]]”(多行)。

      Lua 變量不需要類(lèi)型聲明

      Lua 支持類(lèi)似面向對象的編程,所有對象都是一個(gè) Table(Lua 中獨有的概念)。

      Lua 支持尾遞歸、閉包。

      詳細的資料請參閱有關(guān)資料,底線(xiàn)是 -- 如果你會(huì )其它編程語(yǔ)言,在 30 分鐘內就能學(xué)會(huì )它。

      將電話(huà)路由到 Lua 腳本

      在 dialplan XML 中,使用

       <action application="lua" data="test.lua"/>

      便可將進(jìn)入 dialplan 的電話(huà)交給 lua 腳本接管。腳本的默認路徑是安裝路徑的 scripts/ 目錄下,當然你也可以指定絕對路徑,如 /tmp/test.lua。需要注意在 windows 下目錄分隔符是用 "\" ,所以有時(shí)候需要兩個(gè),如“c:\test\test.lua”。

      Session 相關(guān)函數

      FreeSWITCH 會(huì )自動(dòng)生成一個(gè) session 對象(實(shí)際上是一個(gè) table),因而可以使用 Lua 面象對象的特性編程,如以下腳本放播放歡迎聲音(來(lái)自 Hello Lua) 。

     -- answer the call
     session:answer();

     -- sleep a second
     session:sleep(1000);

     -- play a file
     session:streamFile("/tmp/hello-lua.wav");

     -- hangup
     session:hangup();

      大部分跟 session 有關(guān)的函數是跟 FreeSWITCH 中的 App 是一一對應的,如上面的 answer()、hangup() 等,特別的, streamFile() 對應 playback() App 。如果沒(méi)有對應的函數,也可以通過(guò) session:execute() 來(lái)執行相關(guān)的 App,如 session:execute("playback", "/tmp/sound.wav") 等價(jià)于 session:streamFile("/tmp/sound.wav")。

      需要注意,lua 腳本執行完畢后默認會(huì )掛斷電話(huà),所以上面的 Hello Lua 例子中不需要明確的 session:hangup()。如果想在 lua 腳本執行完畢后繼續執行 dialplan 中的后續流程,則需要在腳本開(kāi)始處執行

      session:setAutoHangup(false)

      如下列場(chǎng)景,test.lua 執行完畢后(假設沒(méi)有 session:hangup(),主叫也沒(méi)有掛機),如果沒(méi)有 setAutoHangup(false),則后續的 playback 動(dòng)作得不到執行。

     <extension name="eavesdrop">
          <condition field="destination_number" expression="^1234$">
               <action application="answer"/>
               <action application="lua" data="test.lua"/>
               <action application="playback" data="lua-script-complete.wav"/>
          </condition>
     </extension>

      更多的函數可以參考相關(guān)的 wiki 文檔:http://wiki.freeswitch.org/wiki/Mod_lua

    分享到: 收藏

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 隆林| 南雄市| 江山市| 读书| 荔浦县| 永定县| 商城县| 福建省| 盘山县| 常德市| 石棉县| 浦东新区| 冀州市| 思南县| 喀喇沁旗| 黑水县| 高碑店市| 无锡市| 定南县| 水城县| 盖州市| 望城县| 元阳县| 蒲城县| 墨江| 建昌县| 南城县| 柳江县| 广宁县| 北碚区| 郸城县| 鸡西市| 达日县| 枝江市| 东光县| 来安县| 芦山县| 栾川县| 缙云县| 黔江区| 宝鸡市| http://444 http://444 http://444 http://444 http://444 http://444