freeswitch的初步瞭解

1.fs的總體結構

freeswitch由一個穩定的核心Core以及一些外圍模塊組成。

內部使用線程模型來處理併發請求,每個連接都在單獨的線程中處理,不同的線程間通過Mutex互斥訪問共享資源,並通過消息和異步事件等方式進行通信,這種架構能處理很高的併發,能均勻分佈到多顆CPU或單CPU的多個核心。

絕大部分應用都是在外圍模塊中實現的。

1) 核心

    core包含了關鍵的數據結構和複雜的代碼,狀態機,數據庫等,這些代碼只出現在覈心中,並保持了最大限度的抽象和重用。

    外圍模塊只能通過核心代碼提供的公共程序接口調用核心的功能,最大限度保證了系統整體的穩定

    1.數據庫

        內部隊列,哈希表存儲數據

        也是用外部關係型數據庫存儲數據

        通過show calls,show channels等都可以直接從數據庫中讀取內容並顯示

        freeswitch使用核心數據庫(/var/lib/freeswitch/db/core.db)來記錄系統的接口,任務以及當前通道,通話等實時數據

    2.公共應用程序接口(Public API)

        這些API被外圍的模塊調用,

        例如,當freeswitch外圍的Endpoint模塊收到一個呼入請求時,該模塊就可以調用核心的函數爲呼叫生成新的Session,此後,該呼叫的生命週期就由該Session管理

    3.接口

        Endpoint,Codec等

        這些接口對同類型的邏輯或功能實體進行了抽象,但沒有具體實現,具體的實現一般由外圍的模塊負責

        外圍模塊可以選擇實現其中一個或多個接口,並向核心層註冊這些接口。

    4.事件 Event

        除了使用API以及接口回調方式外,freeswitch也使用消息和事件機制進行進程間和模塊間通信。

        在freeswitch外部,可以通過訂閱相關事件。



        訂閱所有事件

        /event plain ALL

        訂閱某類事件

        /event plain CHANNEL_ANSWER

2) 接口實現

    Endpoint: 終結freeswitch的地方,再往外就超出freeswitch控制,它主要包含了不同呼叫控制協議的接口,這使得freeswitch可以與衆多不同的電話系統進行通信

    Dialplan: 提供查找電話路由功能

    Chatplan: 類似於Dialplan,不同的是Chatplan主要對文本消息進行路由

    APP:       freeswitch提供了App使複雜的任務變得異常簡單,實際上所有的通話都是在與一個或多個app的交互

    FSAPI:     簡稱API,一種高度抽象的輸入、輸出機制,可以在外部使用

    XML接口:  支持多種獲取XML的方式,可以從本地的配置文件或數據庫讀取

    Codec:     支持最廣泛的Codec,G711,G722,GSM,iLBC。。。。

    語言識別: 支持語音自動識別,以及文本、語音轉換

    格式文件: 支持不同格式的聲音回放,錄音。wav,mp3等

    日誌:    可以寫到控制檯,日誌文件,系統日誌

    定時器:   最理想的工作時鐘頻率是1000Hz

    嵌入式語言:  通過swig可支持多種嵌入式語言控制呼叫流程,如Lua,Javascript,Perl等

    Event Socket:   可以使用任何語言,通過TCP Socket控制呼叫流程

2.fs的目錄結構

bin     可執行程序

db      系統數據庫

htdoc   http server根目錄

lib     庫文件

mod     可加載模塊

run     運行目錄,存放freeswitch運行時pid

sounds  聲音文件,playback默認的尋找路徑

grammar 語法,用於ASR

include 頭文件

log     日誌,cdr等

recording   錄音

scripts 嵌入式腳本

storage 語音留言的錄音

conf    配置文件

3.fs的配置文件

配置文件有許多XML文件組成,系統裝載時,XML解析器會將所有XML組織在一起,並讀入內存,組成一個大的XML文檔,稱爲XML註冊表

1) freeswitch.xml

    1.將所有的配置文件粘到一起

        X-PRE-PROCESS,預處理命令,用於設置變量或裝入其他配置文件

    2.freeswitch.xml.fsxml

        是freeswitch內部XML的一個內存鏡像

        它是動態生成的,用戶不應該手動編輯,對調試非常有用

    3.X-PRE-PROCESS,它的作用是將data參數指定的文件內容包含到當前文件中                         在加載階段只對其進行簡單的替換,而不是語法分析,因此對它加註釋沒有效果

    4.解決方法,破壞X-PRE-PROCESS的定義                                                           <X-PRE-PROCESS cmd="include" data="vars.xml" />                                         <xX-PRE-PROCESS cmd="include" data="vars.xml" />                                        由於FreeSwitch不認識xX-PRE-PROCESS,因此它會自動忽略該行

2) vars.xml

    1.通過X-PRE-PROCESS指令定義了一些全局變量,

        <X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}" />

    2.使用X-PRE-PROCESS設置的變量都稱爲全局變量,它們在FreeSwitch運行期間永遠都是有效的          局部變量: 在一個呼叫的生命週期中才有效,

        全局變量以$${var}表示,臨時變量以${var}表示

    3.覆蓋

        由於這些變量是在vars.xml加載前設置的,因此可以在vars.xml中覆蓋它們

        <X-PRE-PROCESS cmd="set" data="local_ip_v4=192.168.4.64}" />

3) autoload_config

    模塊級的配置文件,每個模塊對應一個配置文件。

    文件一般是“模塊名.conf.xml”

    1) sofia.conf.xml

        文件名並不重要,可以改成其他名字,只要擴展名是xml就可以

        重要的是configuration的name屬性

    2) mod_sofia在啓動時,會向XML註冊表中查找name爲"sofia.conf"的configuration

    3) global_settings標籤定義了一些全局參數

    4) profiles標籤可以通過X-PRE-PROCESS指令裝入其他的配置文件

4.fs的用戶目錄

用戶目錄決定了那些用戶可以註冊到freeswitch上

1) 用戶目錄默認的配置文件

    default.xml

    在default目錄中,每個用戶都對應一個文件



2) 用戶組,組中用戶不需要完整XML節點,可以是一個已存在用戶的"指針"

    <group name="sales">

        <users>

            <user id="1000" type="pointer" />

            <user id="1001" type="pointer" />

            <user id="1002" type="pointer" />

        </users>

    </group>

    使用用戶組可以方便的支持羣呼,代接之類的業務

5.fs的呼叫相關概念

Bob與Alice通話

    Bob向Freeswitch發起呼叫, Freeswitch啓動另一個UA呼叫Alice, 兩者通話



    Freeswitch同時呼叫Bob和Alice,然後橋接, 兩者通話

1) 來去話

    Freeswitch作爲一個B2BUA去呼叫Alice, 就稱爲去話

    無論是去話還是來話, 每次呼叫,Freeswitch都會啓動一個Session,控制整個呼叫,一直持續到通話結束

    每個Session控制着一個Channel,Channel是一對UA間通信的實體,相當於一條腿,有一個唯一的UUID

    通話時, Freeswitch將兩個Channel橋接到一起, 使雙方可以通話, 這兩路通話在邏輯上組成一個通話,成爲一個Call

2) 回鈴音

    A與B不在同一臺服務器,中間經過兩臺交換機中轉

    A呼叫B, B開始振鈴,

    A端可聽到回鈴音

3) 全局變量和局部變量

    全局變量

        使用X-PRE-PROCESS定義, 使用$${var}引用,這些變量全局有效

    局部變量

        在Dialplan, Application或Directory設置, 可以被動態改變, 僅在Channel的生命週期有效

6.fs小結

穩定的核心及外圍的可加載模塊組成

核心經過精心設計及嚴格測試,保證了穩定性

外圍模塊保證了擴展性

核心與模塊通過Public API通信

模塊間通過Event通信,消除了模塊耦合, 進一步增加了可伸縮性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章