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

《FreeSWITCH 1.2》:外部命令FreeSWITCH

2014-04-29 13:52:35   作者:   來(lái)源:CTI論壇   評(píng)論:0  點(diǎn)擊:


  FreeSWITCH 事件系統(tǒng)是FreeSWITCH最有趣的模塊之一。用戶已經(jīng)學(xué)習(xí)了如何使用各種靜態(tài)配置維護(hù)和腳本語(yǔ)言來(lái)配合FreeSWITCH工作。事件系統(tǒng)實(shí)現(xiàn)了對(duì)FreeSWITCH實(shí)時(shí)動(dòng)態(tài)的控制。使用了事件系統(tǒng)才使得FreeSWITCH變得更加有趣。

  事件系統(tǒng)支持外部的程序作為一個(gè)監(jiān)聽者來(lái)監(jiān)聽系統(tǒng)正在執(zhí)行的的任何任務(wù)。通過(guò)外部監(jiān)聽的方式可以支持一個(gè)實(shí)時(shí)的互動(dòng),通信軟交換系統(tǒng)的電話可以通過(guò)外部的軟件或者已經(jīng)進(jìn)行對(duì)接。在FreeSWITCH環(huán)境中,幾乎所有發(fā)生的指令可以生成一系列的事件信息。外部實(shí)體可以檢測(cè)到這些事件。類似于在平臺(tái)信息隊(duì)列軟件使用的publish/subscribe(或 "pub-sub")系統(tǒng),這些事件機(jī)制已經(jīng)調(diào)整來(lái)滿足FreeSWITCH 事件系統(tǒng)的需求。

  事件系統(tǒng)是雙向工作的:支持外部的程序來(lái)監(jiān)聽事件,然后外部程序可以對(duì)FreeSWITCH發(fā)送事件。用戶可以通過(guò)自己的程序來(lái)實(shí)時(shí)地接收和發(fā)送事件。這樣的組合方式可以實(shí)現(xiàn)大部分用戶可以想象到的方式對(duì)FreeSWITCH進(jìn)行外部控制。

  在這一章節(jié),我們將討論以下內(nèi)容:

  · 事件系統(tǒng)的基本概要

  · 事件系統(tǒng)的架構(gòu)

  · 訪問(wèn)事件套接字

  · 事件套接字庫(kù)

  · 在PHP中使用ESL實(shí)例

  · 使用事件系統(tǒng)創(chuàng)建一個(gè)會(huì)議管理員

  概要

  事件系統(tǒng)是FreeSWITCH的神經(jīng)中樞,支持本地軟件或外部軟件訂閱在軟交換系統(tǒng)中正在發(fā)生的任務(wù)流。在FreeSWITCH中,執(zhí)行任何的任務(wù)會(huì)生成一個(gè)事件。接收一個(gè)新的電話呼叫會(huì)導(dǎo)致一個(gè)事件。結(jié)束一個(gè)呼叫同樣也導(dǎo)致一個(gè)事件發(fā)生。對(duì)硬盤寫入系統(tǒng)的日志會(huì)導(dǎo)致一個(gè)事件。甚至于講話或者靜音也會(huì)導(dǎo)致一個(gè)事件。每個(gè)事件變成了事件流的一個(gè)部分,事件流可以觸發(fā)一個(gè)事件類型,事件類別和各種事件信息。對(duì)端軟件可以監(jiān)聽這些事件,通過(guò)事件執(zhí)行相應(yīng)的任務(wù),例如,通過(guò)TCP 套接字連接發(fā)送文本流。

  事件通過(guò)另外一種方式對(duì)FreeSWITCH提供一個(gè)功能擴(kuò)展。事件不同于鉤子或模塊(在實(shí)時(shí)環(huán)境中,這些會(huì)影響處理和呼叫控制)。事件提供一個(gè)異步機(jī)制(或非阻塞/隊(duì)列)來(lái)維持系統(tǒng)的任務(wù)跟蹤。這些事件通過(guò)其他軟件生成。在實(shí)際環(huán)境中,用戶可以通過(guò)外部程序來(lái)控制系統(tǒng)中多個(gè)任務(wù)活動(dòng)。

  在這樣的例子中,用戶系統(tǒng)可能突然有一個(gè)呼叫高峰,這個(gè)環(huán)境高峰可能生成新的事件。用戶可以通過(guò)web瀏覽器來(lái)處理這些事件,但是瀏覽器不能馬上應(yīng)對(duì)這個(gè)呼叫量。使用隊(duì)列事件系統(tǒng),用戶可以等待瀏覽器提高處理能力,來(lái)應(yīng)對(duì)此時(shí)的呼叫量,避免核心軟交換引擎的阻塞(自己阻塞呼叫)。

  在這個(gè)章節(jié),我們將討論事件系統(tǒng)幾個(gè)不同的方面-從外部程序接收和處理事件和對(duì)FreeSWITCH發(fā)送事件。我們涵蓋的模塊包括,從外部啟用事件系統(tǒng),生成的事件類型和對(duì)事件類型調(diào)用的方法。最后,我們將了解一個(gè)實(shí)例使用場(chǎng)景和代碼來(lái)幫助用戶開啟一個(gè)使用環(huán)境,通過(guò)自己的程序來(lái)控制FreeSWITCH。

  事件系統(tǒng)架構(gòu)

  FreeSWITCH中的事件子系統(tǒng)支持以下兩個(gè)方面的功能,一個(gè)是最大化的處理設(shè)計(jì),另外一個(gè)是事件優(yōu)先級(jí)設(shè)計(jì),優(yōu)先級(jí)取決于事件類型和事件系統(tǒng)加載結(jié)果。在FreeSWITCH的事件系統(tǒng)中包含兩個(gè)層次的處理。第一層提供一個(gè)內(nèi)部事件處理路由和一個(gè)吸納FreeSWITCH自身內(nèi)部事件的接口。第二層是一個(gè)模塊架構(gòu),提供客戶端對(duì)事件的訪問(wèn)。通過(guò)兩個(gè)功能單元的分割獨(dú)立,實(shí)現(xiàn)了publish/subscribe風(fēng)格的事件系統(tǒng)。

  在內(nèi)部的事件層,F(xiàn)reeSWITCH 提供了核心功能來(lái)處理發(fā)生在系統(tǒng)級(jí)別和通道級(jí)別的事件。系統(tǒng)的任何部分包括模塊可以發(fā)布或廣播事件。目前有兩個(gè)核心類型事件-系統(tǒng)事件和日志事件。核心子系統(tǒng)部分或模塊可以生成系統(tǒng)事件。他們包括從系統(tǒng)內(nèi)部定時(shí)器心跳到會(huì)議子系統(tǒng)事件,例如會(huì)議一方加入或者離開會(huì)議室。每次一個(gè)日志寫入到FreeSWITCH日志文件時(shí),系統(tǒng)會(huì)生成一個(gè)

  日志事件。這些子系統(tǒng)實(shí)際上由三個(gè)事件隊(duì)列組成,每個(gè)隊(duì)列有自己的線程和優(yōu)先級(jí)。如果一個(gè)隊(duì)列被填滿以后,系統(tǒng)將自動(dòng)跳到下一個(gè)隊(duì)列,直到全部事件系統(tǒng)被填滿。當(dāng)呼叫或者系統(tǒng)功能處于處理狀態(tài)時(shí),后端的線程會(huì)生成事件,這些事件保存到內(nèi)存中等待內(nèi)部的訂閱者來(lái)調(diào)用。一旦訂閱的模塊或子系統(tǒng)提取了信息,這個(gè)事件信息將被消滅。通過(guò)這樣的方式,事件系統(tǒng)的拓展性得到了提升,已經(jīng)使用的事件立即清除,這樣當(dāng)事件用戶等待提取隊(duì)列事件時(shí)不會(huì)導(dǎo)致呼叫被阻塞。

  FreeSWITCH使用它的模塊架構(gòu)可以支持通過(guò)外部軟件來(lái)處理事件。一個(gè)事件處理模塊可以訂閱內(nèi)部事件信息,對(duì)其進(jìn)行格式化,然后發(fā)送到外部程序。這樣的模塊稱之為事件處理event handlers。FreeSWITCH沒有綁定很多的event Handlers,但是這些event handlers功能非常豐富,處理能力強(qiáng)大。我們將再次回顧這些模塊,學(xué)習(xí)如何使用這些模塊。

  未完待續(xù)······

分享到: 收藏

專題