標籤:esc 組成 通道 uri 橋接 define 抽象 放音 監視
Asterisk 1是基於GPLv2協議發布的一款開源電話應用平台。簡單地說,這是一個服務端程式,用於處理電話的撥出、接入以及自訂流程。
一個人使用電話A呼叫另一個使用電話B的人。在此情境下,串連到Asterisk系統的有兩個電話終端,因而分配了兩個通道(1.2)。
圖1.2 兩個通道表示兩條呼叫線路
媒體傳輸使用的是P2P方式!
圖1.3 專用橋接執行個體
圖1.4 通道技術層和抽象通道層
Asterisk組件抽象
Asterisk是一款高度模組化的軟體。其核心程式可由源碼樹上的main/目錄的源碼構建而成。但是核心程式本身作用不大,因為其主要作用是註冊模組。系統還有一些代碼負責串連所有抽象介面,使撥打電話工作起來。這些介面的具體實現是由一些可載入模組在運行時完成註冊的。
預設狀態下,當主程式啟動時,Asterisk會在檔案系統上一個預先指定的模組目錄下找到所有模組,並載入之。選擇這種預設是出於簡便性的考慮。然而,還有一個可更改的設定檔,可具體指定載入哪些模組及其載入順序。系統配置變得有點複雜,但是能指定那些不需要的模組不被載入。這樣做的主要好處就是減少了程式的記憶體佔用,然而還有一些安全性的優點。如果一個模組可從網路接受串連,但實際並不需要用它,那麼最好還是不要載入它。
模組被載入後,它將在Asterisk核心程式中註冊它所有組件抽象的實現。可由模組實現並在Asterisk核心註冊的介面多種多樣。系統允許模組盡量多的註冊各類介面。通常相似的功能組成一個單獨的模組。
Asterisk管理員使用Asterisk撥號對應表(存於/etc/asterisk/extensions.conf檔案)來設定呼叫路由表。撥號對應表是由一系列被稱為擴充規則的呼叫規則群組成的。當有一個撥打電話接入,系統用被叫號碼在撥號對應表中尋找擴充規則,用以處理本次呼叫。(本質:DSL!)舉例說明之前,我們先看一個Asterisk撥號對應表的文法,此撥號對應表用於處理對號碼1234的呼叫。注意,這裡1234這個號碼系信手拈來。共有3個撥號程式被調用:首先,應答呼叫;其次,回放音頻檔案;最後,掛斷呼叫。
; Define the rules for what happens when someone dials 1234.;exten => 1234,1,Answer() same => n,Playback(demo-congrats) same => n,Hangup()
Asterisk的大多數線程可歸類為網路監視線程或通道線程(有時亦稱為PBX線程,因為其主要目的是在通道運行使用者級交換器PBX)。
圖1.7 普通呼叫橋接的元件圖表
迄今為止,Asterisk的架構已有十年以上的曆史。然而,儘管這個行業在不斷髮展,Asterisk的一些東西,如通道的基本概念、使用撥號對應表進行靈活的呼叫處理,仍然支援著複雜電話系統的開發。有一個領域Asterisk的架構還沒有處理的太好,即如何使系統在多伺服器間可伸縮。Asterisk開發社區正在開發一個叫做Asterisk SCF(可伸縮通訊架構)的夥伴項目,目的就是解決延展性的課題。
參考:http://www.ituring.com.cn/article/13057#
開源軟體架構總結之——Asterisk(DSL、組件、多線程)