Asterisk權威指南/第二章 Asterisk架構
Asterisk和其他傳統的PBX完全不同,因為Asterisk的撥號計劃以同樣的方式處理所有的入局信道(incoming channels)。
傳統的PBX在邏輯上區分工作站信道(連接電話機)和電話局信道(連接到外部世界)。這意味著,你不可能無縫地在一個工作站埠配置一個外部網關。同樣,傳統PBX也很難實現對離站(off-site,不在座位上或外出辦事)資源的訪問,比如前台如果外出辦事就什麼事都做不了,因為她哪怕能打電話回公司,也是不能訪問內部資源的。
Asterisk在內部不區分工作站信道和電話局信道,而是一律統稱信道。有很多種信道類型(驅動不同),但Asterisk撥號計劃以不加區別(接口一致)的方式處理這些信道,也就是說,一個內部用戶可能位於電話局埠,但撥號計劃可以把他當成在工作站埠一樣。如果你沒有用過傳統PBX,可能還體會不到Asterisk這種方式的強大和靈活。下圖顯示了兩種架構的區別。
模塊
編輯Asterisk是基於模塊構建的。一個模塊提供特定的功能,是一個可裝載的組件,比如信道驅動(chan_sip.so),或者一項可以連接到外部技術的資源(func_odbc.so)。Asterisk按照/etc/asterisk/modules.conf配置文件裝載模塊。後面我們會討論各個模塊的使用。這裡我們只會介紹模塊的概念,以及模塊的各種類型。
運行一個不加載任何模塊的Asterisk也是有可能的,儘管它什麼都做不了。你只有理解了Asterisk模塊化的特點,才能充分理解Asterisk的架構。
Note:你可以啟動一個沒有加載任何模塊的Asterisk,然後手工在控制台一個個地添加;這種方法一般用於性能調優,可以保證僅加載所需要的模塊。
Asterisk模塊類型包括:
- 應用程式(即撥號計劃中的命令)
- 橋接模塊
- 呼叫詳單記錄模塊
- 信道事件日誌模塊
- 信道驅動
- 編碼解碼器
- 格式解釋器
- 撥號計劃函數
- PBX模塊
- 資源模塊
- 附加模塊
- 測試模塊
接下來我們會列出分屬各個類型的所有模塊,他們的用途,以及我們所認為的受歡迎程度和重要程度(有一些很常用,但有一些不太有用,僅僅是為了兼容而保留)。這些模塊的細節會在本書中陸續介紹,根據各自的情況,有些會被全面的討論,有些則根本不會涉及。
下面這些術語反映了我們對各個模塊的看法:
- 不重要
- 這個模塊是個老古董。如果你要使用它,就不要指望能在社區中得到很好的支持。
- 不可靠
- 新設計的或者試驗性的模塊,不要用於生產環境。
- 很有用
- 很時新,有人維護,受歡迎而且被推薦。
- 可以用
- 能夠用,但用得不多,可能不完整。不推薦。
- 不好說
- 新出現的模塊,時間短,完整性和受歡迎程度都不太好說。
- 已廢棄
- 已經被更好的模塊取代了。
- 有局限
- 有局限性,不能滿足要求。
- 很重要
- 必須的。
應用程式
編輯應用程式用於撥號計劃中,能夠處理呼叫流程。比如Dial()就是一個很重要的應用程式,負責建立出局連接。
名稱 | 用途 | 評價 |
---|---|---|
app_adsiprog | 給兼容模擬電話加載模擬顯示服務接口(ADSI)腳本。 | 不重要 |
app_alarmreceiver | 支持接受警報設備的報告。 | 不重要 |
app_amd | 檢測電話答錄機。 | 不穩定 |
app_authenticate | 比較雙音多頻(DTMF)輸入和一個給定的字符串(通常是密碼)。 | 很有用 |
app_cdr | 寫CDR記錄。 | 很有用 |
app_celgenuserevent | 為CEL產生用戶自定義事件。 | 不好說 |
app_chanisavail | 檢測信道的狀態。 | 不穩定 |
app_channelredirect | 強制另一個信道進入撥號計劃的另一個地方。 | 很有用 |
app_chanspy | 允許一個信道收聽另一個信道。 | 很有用 |
app_confbridge | 電話會議(新版)。 | 不好說 |
app_controlplayback | 播放提示,並提供快進和倒帶功能。 | 很有用 |
app_dahdibarge | 允許在DAHDI信道中插話。(已廢棄,見app_chanspy) | 已廢棄 |
app_dahdiras | 在DAHDI信道上建立RAS伺服器。 | 不重要 |
app_db | 訪問Asterisk內置的伯克利資料庫。(已廢棄,見func_db) | 已廢棄 |
app_dial | 把信道連接起來。(例如,打電話) | 很重要 |
app_dictate | 播放一段錄音,並提供開始/停止功能。 | 很有用 |
app_directed_pickup | 應答另外一部分機上的呼叫。 | 很有用 |
app_directory | 給出voicemail.conf中的姓名列表。 | 很有用 |
app_disa | 提供撥號音並接受DTMF輸入。 | 很有用 |
app_dumpchan | 在Asterisk控制台列印信道變量。 | 很有用 |
app_echo | 回放從信道中收到的語音。 | 很有用 |
app_exec | 包含Exec(),TryExec()和ExecIf()。根據條件執行應用程式。 | 很有用 |
app_externalivr | 類似於AGI,但是異步的。 | 很有用 |
app_fax | 提供SendFax()和ReceiveFax() | 很有用 |
app_festival | 「文本-轉-語音」引擎。 | 可以用 |
app_flash | 在信道上執行一次瞬間掛機 | 很有用 |
app_followme | 根據followme.conf文件執行找到我/跟隨我功能。 | 很有用 |
app_forkcdr | 在當前呼叫上開始一條新的CDR記錄。 | 可以用 |
app_getcpeid | 獲得ADSI CPE ID。 | 不重要 |
app_ices | 把音頻發送到一個icecast伺服器。 | 可以用 |
app_image | 向可以支持的設備上傳輸圖像。 | 有局限 |
app_ivrdemo | 開發者的示例應用程式。 | 不重要 |
app_jack | 使用JACK音頻連接工具包共享音頻。 | 很有用 |
app_macro | 觸發撥號計劃宏。(已廢棄,見GoSub()) | 已廢棄 |
app_meetme | 多方會議。 | 很有用 |
app_milliwatt | 產生1004赫茲的音頻,以測試模擬電路。 | 很有用 |
app_minivm | 提供基本的函數,使得你可以構造自己的語音信箱。 | 可以用 |
app_mixmonitor | 兩頭錄音,然後合併。 | 很有用 |
app_morsecode | 產生莫爾斯電碼。 | 可以用 |
app_mp3 | 用mpg123播放mp3。 | 不重要 |
app_nbscat | 獲得NBS音頻。 | 不重要 |
app_originate | 允許發起一次呼叫。 | 很有用 |
app_osplookup | 執行OSP查找。 | 可以用 |
app_page | 尋呼。 | 很有用 |
app_parkandannounce | 自動播報保持的電話。 | 可以用 |
app_playback | 播放音頻文件,不接受輸入。 | 很有用 |
app_playtones | 播放按鍵音。 | 很有用 |
app_privacy | 如果沒有收到CallerID,就要求輸入用戶號碼。 | 不重要 |
app_queue | 提供自動呼叫分配。 | 很有用 |
app_read | 要求用戶輸入,並把輸入存入變量。 | 很有用 |
app_readexten | 要求用戶輸入,並把當前呼叫轉移到指定分機和上下文。 | 可以用 |
app_readfile | 把文件內容存入一個信道變量。(已廢棄,見func_env中的FILE()) | 已廢棄 |
app_record | 把收到的音頻存入文件。 | 很有用 |
app_rpt | 使用音效卡。(TODO:什麼是rpt項目,不懂。) | 有局限 |
app_sayunixtime | 已指定的格式播放時間。 | 很有用 |
app_senddtmf | 向呼叫者傳輸DTMF音頻。 | 很有用 |
app_sendtext | 向兼容的信道發送文本。 | 不重要 |
app_setcallerid | 在信道上設置CallerID。(已廢棄,見func_callerid) | 已廢棄 |
app_skel | 開發者的示例應用程式。 | 很有用 |
app_sms | 在支持的地區發送SMS消息。 | 有局限 |
app_softhangup | 請求關閉信道。 | 很有用 |
app_speech_utils | 語音識別。 | 很有用 |
app_stack | 提供GoSub()等堆疊相關的操作。 | 很重要 |
app_system | 執行作業系統命令。 | 很有用 |
app_talkdetect | 類似於app_background,但允許收到音頻後中斷播放。 | 很有用 |
app_test | C/S測試應用程式。 | 可以用 |
app_transfer | 在當前信道上執行轉移。 | 很有用 |
app_url | 向被呼叫信道傳遞URI。 | 有局限 |
app_userevent | 在AMI中產生一個定製事件。 | 很有用 |
app_verbose | 在CLI中產生一個定製時間。 | 很有用 |
app_voicemail | 提供語音信箱功能。 | 很重要 |
app_waitforring | (TODO:不明白) | 不重要 |
app_waitforsilence | 包括WaitForSilent()和WaitForNoise();監聽入局信道,有超時限制。 | 很有用 |
app_waituntil | 等待一個指定的Linux時間(從1970第一秒開始的計數值)到來。 | 很有用 |
app_while | 包括While(),EndWhile()等,用於循環。 | 很有用 |
app_zapateller | 播放特殊音調,以阻止電話推銷者。 | 可以用 |
橋接模塊
編輯橋接模塊是Asterisk 1.8的新功能;他們以新的方式執行信道之間的橋接。他們每一個都提供不同的特性,用於不同的橋接需求。這些模塊只用於app_confbridge。
名稱 | 用途 | 評價 |
---|---|---|
bridge_builtin_features | 當使用內置用戶特性(在features.conf中定義)時,執行橋接。 | 不好說 |
bridge_multiplexed | 執行複雜的多路轉發,用於大型會議室。 | 不好說 |
bridge_simple | 執行簡單的「信道-到-信道」橋接。 | 不好說 |
bridge_softmix | 執行簡單的多路轉發,用於大型會議室。(TODO:不明白和bridge_multiplexed的區別) | 不好說 |
電話詳單記錄模塊
編輯CDR模塊是為了讓各種形式的話單記錄更方便。你可以把CDR存入文件、資料庫、RADIUS、或syslog。
註:CDR不是為了計費而設計的。計費功能應該使用CEL。
名稱 | 用途 | 評價 |
---|---|---|
cdr_adaptive_odbc | 通過ODBC寫CDR,允許添加自定義欄位。 | 很有用 |
cdr_csv | 把CDR寫入CSV文件。 | 可以用 |
cdr_custom | 和cdr_csv一樣,但允許添加自定義欄位。 | 很有用 |
cdr_manager | 把CDR輸出到AMI接口。 | 很有用 |
cdr_odbc | 通過ODBC寫CDR。 | 可以用 |
cdr_pgsql | 把CDR寫到PostgreSQL。 | 很有用 |
cdr_radius | 把CDR寫到RADIUS。 | 可以用 |
cdr_sqlite | 把CDR寫到sqlite2資料庫。(已廢棄,見cdr_sqlite3_custom) | 已廢棄 |
cdr_sqlite3_custom | 把CDR寫到sqlite3資料庫,允許添加自定義欄位。 | 很有用 |
cdr_syslog | 把CDR寫到syslog。 | 很有用 |
cdr_tds | 把CDR寫到Microsoft SQL或Sybase資料庫,需要老版tds。 | 可以用 |
Web接口中會有一些和CDR相關的報告功能。
信道事件日誌模塊
編輯信道事件日誌可以完整記錄所有的呼叫活動。這也意味著你需要更小心地規劃擬撥號計劃,畢竟它不可能自動開始工作。Asterisk的CEL模塊如下:
名稱 | 用途 | 評價 |
---|---|---|
cel_custom | 寫到磁碟文件。 | 很有用 |
cel_manager | 寫到AMI。 | 很有用 |
cel_odbc | 寫到ODBC。 | 很有用 |
cel_pgsql | 寫到PostgreSQL。 | 很有用 |
cel_radius | 寫到RADIUS。 | 可以用 |
cel_sqlite3_custom | 寫到sqlite3。 | 很有用 |
cel_tds | 寫到Microsoft SQL或Sybase,需要老版tds。 | 可以用 |
信道驅動
編輯沒有信道驅動,Asterisk就不可能建立呼叫。每種協議或信道類型都有自己特定的信道驅動。信道模塊可以看做是通往Asterisk核心的網管。Asterisk的信道驅動如下:
名稱 | 用途 | 評價 |
---|---|---|
chan_agent | 為Queue()提供坐席信道。 | 很有用 |
chan_alsa | 提供到高級Linux聲音架構(ALSA)的連接。 | 很有用 |
chan_bridge | 僅供ConfBridge()內部使用。 | 很重要 |
chan_console | 提供到portaudio的連接。 | 不好說 |
chan_dahdi | 提供到DAHDI接口卡的連接。 | 很有用 |
chan_gtalk | 提供到Google Talk的連接。 | 可以用 |
chan_h323 | 提供H.323連接。(已廢棄,見chan_ooh323) | 已廢棄 |
chan_iax2 | 提供IAX2連接。 | 很有用 |
chan_jingle | 提供jingle連接。 | 可以用 |
chan_local | 把一部分撥號計劃當成信道。 | 很有用 |
chan_mgcp | 提供媒體網管控制協議(MGCP)連接。 | 可以用 |
chan_misdn | 連接到支持mISDN的ISDN卡。 | 有局限 |
chan_multicast_rtp | 連接到RTP多播流。 | 很有用 |
chan_nbs | 網絡廣播聲音(NBS)連接。 | 不重要 |
chan_oss | 開放聲音系統驅動。 | 很有用 |
chan_phone | LInux電話接口驅動,相當老。 | 不重要 |
chan_sip | 會話啟動協議。 | 很重要 |
chan_skinny | 思科瘦客戶端控制協議(SCCP)。 | 可以用 |
chan_unistim | 北電Unistim協議。 | 可以用 |
chan_usbradio | CM108 USB無線電接口卡。 | 可以用 |
chan_vpb | Voicetronix信道。 | 不重要 |
編碼解碼器
編輯編碼解碼器允許Asterisk轉換不同呼叫之間的音頻格式。如果一個呼叫來自PRI電路(使用G.711編碼),需要連接到一個SIP壓縮信道(使用G.729,SIP支持的編碼之一),那麼相應的編碼解碼器就會執行所需的轉換。
註:如果編碼解碼需要複雜的算法,大量的轉碼工作會對CPU造成負擔。有些像Sangoma和Digium廠商的卡會提供硬體解碼編碼。
名稱 | 用途 | 評價 |
---|---|---|
codec_adpcm | 自適應差分脈碼調製解調 | 不重要 |
codec_alaw | 全世界PSTN(除了美國、加拿大)採用脈衝編碼調製的A-law算法。 | 很重要 |
codec_a_mu | A-law到Mu-law的轉換。 | 很有用 |
codec_dahdi | 使用Digium硬體解碼。(需要Digium轉碼卡) | 很重要 |
codec_g722 | 寬頻帶音頻編碼解碼。 | 很有用 |
codec_g726 | (TODO:不懂,大概類似於codec_adpcm) | 不重要 |
codec_gsm | 全球移動通訊系統。 | 很有用 |
codec_ilbc | 網際網路低比特率編碼解碼。 | 不重要 |
codec_lpc10 | 線性預測編碼生硬合成器。 | 不重要 |
codec_resample | 8-bit和16-bit間帶符號線性採樣。 | 可以用 |
codec_speex | speex編碼。 | 可以用 |
codec_ulaw | 用於美國、加拿大的 脈衝編碼調製的Mu-law算法。 | 很重要 |
格式解釋器
編輯格式解釋器調用編碼解碼器的功能,但他們操作文件而不是信道。如果你錄製了一段GSM音頻,要播放到其他非GSM信道,就需要一個格式解釋器。
如果你錄製成了多種格式(GSM,WAV),當某個信道需要該音頻時,Asterisk會選擇一個轉換代價最小的格式。
名稱 | 用途 | 評價 |
---|---|---|
format_g723 | G.723 .g723 | 不重要 |
format_g726 | G.726 .g726 | 不重要 |
format_g729 | G.729 .g729 | 很有用 |
format_gsm | RPE-LTP (original GSM codec) .gsm | 可以用 |
format_h263 | H.263—video .h263 | 可以用 |
format_h264 | H.264—video .h264 | 可以用 |
format_ilbc | Internet Low Bitrate Codec .ilbc | 不重要 |
format_jpeg | Graphic file .jpeg .jpg | 不重要 |
format_ogg_vorbis | Ogg container .ogg | 可以用 |
format_pcm | Various Pulse-Coded Modulation formats: .alaw, .al, .alw, .pcm, .ulaw, .ul, .mu, .ulw, .g722, .au | 很有用 |
format_siren14 | G.722.1 Annex C (14 kHz) .siren14 | 不好說 |
format_siren7 | G.722.1 (7 kHz) .siren7 | 不好說 |
format_sln16 | 16-bit signed linear .sln16 | 不好說 |
format_sln | 8-bit signed linear .sln .raw | 很有用 |
format_vox | .vox | 不重要 |
format_wav | .wav | 很有用 |
format_wav_gsm | GSM audio in a WAV container .WAV, .wav49 | 可以用 |
撥號計劃函數
編輯撥號計劃函數是對撥號計劃應用程式的補充,提供了一些有用的增強功能,比如字符串處理、日期時間轉換、ODBC連接性等。
名稱 | 用途 | 評價 |
---|---|---|
func_aes | 加密、解密AES字符串。 | 很有用 |
func_audiohookinherit | 允許呼叫轉移後仍被錄音。 | 很有用 |
func_base64 | 編碼、解碼base-64字符串。 | 可以用 |
func_blacklist | 讀、寫astdb中的黑名單。 | 很有用 |
func_callcompletion | 存取信道的呼叫完成配置參數。 | 不好說 |
func_callerid | 存取CallerID。 | 很有用 |
func_cdr | 存取CDR變量。 | 很有用 |
func_channel | 存取信道信息 | 很有用 |
func_config | 包括AST_CONFIG();從配置文件讀取變量。 | 可以用 |
func_connectedline | 改變已連接的信道信息(需要電話的支持)。 | 不好說 |
func_curl | 使用curl訪問URL。 | 很有用 |
func_cut | 對字符串切片或者切塊。 | 很有用 |
func_db | 提供astdb函數。 | 很有用 |
func_devstate | 獲得設備狀態。 | 很有用 |
func_dialgroup | 創建一個同時撥號組。 | 很有用 |
func_dialplan | 驗證指定的撥號計劃目標是否存在。 | 很有用 |
func_enum | 執行ENUM查找。 | 很有用 |
func_env | 包括FILE(),STAT(),ENV()。執行作業系統動作。 | 很有用 |
func_extstate | 返回指定的分機狀態。 | 很有用 |
func_global | 存取全局變量。 | 很有用 |
func_groupcount | 存取一個組的信道數。 | 很有用 |
func_iconv | 字符編碼轉換。 | 可以用 |
func_lock | 包括LOCK(),UNLOCK(),TRYLOCK();用於撥號計劃中的競爭控制。 | 很有用 |
func_logic | 邏輯判斷函數,包括ISNULL(),SET(),EXISTS(),IF(),IFTIME(),IMPORT() | 很有用 |
func_math | 數學函數,包括MATH(),INC(),DEC() | 很有用 |
func_md5 | 生成MD5指紋。 | 很有用 |
func_module | 檢測模塊是否已經裝載。 | 可以用 |
func_odbc | 訪問ODBC。 | 很有用 |
func_pitchshift | 修改音頻流的音調。 | 很有用 |
func_rand | 生成一個隨機數。 | 很有用 |
func_realtime | 在Asterisk實時架構中執行查找。 | 很有用 |
func_redirecting | 獲取本次呼叫的轉發信息。 | 很有用 |
func_sha1 | 生成SHA1指紋。 | 很有用 |
func_shell | 執行shell命令,並返回結果。 | 很有用 |
func_speex | 執行聲音調優。 | 很有用 |
func_sprintf | 字符串格式化。 | 很有用 |
func_srv | 執行SRV查找。 | 很有用 |
func_strings | 字符串處理函數。 | 很有用 |
func_sysinfo | 獲取系統信息,例如內存,交換空間和CPU負荷等。 | 很有用 |
func_timeout | 存取信道的超時時間。 | 很有用 |
func_uri | 把字符串做URI安全編碼。 | 很有用 |
func_version | 獲取Asterisk版本信息。 | 可以用 |
func_vmcount | 獲取語音信箱的消息數。 | 很有用 |
func_volume | 設置信道音量。 | 很有用 |
PBX模塊
編輯PBX模塊提供增強的控制和配置機制。
名稱 | 用途 | 評價 |
---|---|---|
pbx_ael | 提供AEL支持。(很少有人用,如果不想用傳統的撥號計劃配置文件的話,大多數人會選擇AMI+AGI) | 可以用 |
pbx_config | 用於解釋extensions.conf,最傳統、用得最多的撥號計劃語言。 | 很有用 |
pbx_dundi | 執行遠程Asterisk數據查找。 | 很有用 |
pbx_loopback | 類似於撥號計劃的include,有點過時。 | 不重要 |
pbx_lua | 支持使用lua編寫撥號計劃。 | 很有用 |
pbx_realtime | 提供Asterisk實時架構相關的功能。 | 很有用 |
pbx_spool | 和Asterisk外呼文件有關,提供外呼連接池。 | 很有用 |
資源模塊
編輯資源模塊用於集成外部資源。例如res_odbc用於訪問ODBC資料庫連接。
名稱 | 用途 | 評價 |
---|---|---|
res_adsi | 提供ADSI。(儘管大多數ADSI功能Asterisk是不用的,但語音信箱用到這個資源) | 很重要 |
res_ael_share | 為pbx_ael提供共享程序。(如果你使用AEL的話,這個模塊就很重要。) | 很重要 |
res_agi | 提供Asterisk網管接口。 | 很有用 |
res_ais | 使用注入OpenAIS一類的AIS實現, 提供分布式消息等待指示和設備狀態通知。 | 很有用 |
res_calendar | 提供日曆系統的集成。 | 很有用 |
res_calendar_caldav | 提供CalDAV特定的能力。 | 很有用 |
res_calendar_exchange | 提供微軟Exchange的特定能力。 | 很有用 |
res_calendar_icalendar | 提供蘋果/谷歌的iCalendar特定能力。 | 很有用 |
res_clialiases | 創建CLI別名。 | 很有用 |
res_clioriginate | 從CLI發起一次呼叫。 | 可以用 |
res_config_curl | 使用curl拉取配置信息。 | 很有用 |
res_config_ldap | 從LDAP拉取配置信息。 | 可以用 |
res_config_odbc | 從ODBC拉取配置信息。 | 很有用 |
res_config_pgsql | 從PostgreSQL拉取配置信息。 | 可以用 |
res_config_sqlite | 從SQLite拉取配置信息。 | 可以用 |
res_convert | 使用CLI執行文件編碼轉換。 | 可以用 |
res_crypto | 提供加密功能。 | 很有用 |
res_curl | 為其他curl模塊提供公共服務。 | 很有用 |
res_fax | 為其他fax模塊提供公共服務。 | 很有用 |
res_fax_spandsp | 為使用spandsp的傳真功能提供外掛程式。 | 很有用 |
res_http_post | 為Asterisk的HTTP伺服器提供POST上傳功能。 | 可以用 |
res_jabber | 提供Jabber/XMPP資源。 | 很有用 |
res_limit | 允許調整Asterisk進程的系統限制。 | 可以用 |
res_monitor | 提供呼叫錄音資源。 | 很有用 |
res_musiconhold | 提供等待音樂(MOH)功能。 | 很重要 |
res_mutestream | 提供音頻流的禁音和放音功能。 | 不好說 |
res_odbc | 為其他ODBC模塊提供公共功能。 | 很有用 |
res_phoneprov | (TODO:提供來自Asterisk HTTP 伺服器的電話?不懂。) | 不好說 |
res_pktccops | 提供PacketCable COPS資源。 | 不好說 |
res_realtime | 為Asterisk實時架構(ARA)提供CLI命令。 | 很有用 |
res_rtp_asterisk | 提供RTP。 | 很重要 |
res_rtp_multicast | 提供多播RTP。 | 不好說 |
res_security_log | 啟用安全日誌。 | 不好說 |
res_smdi | 通過SMDI協議提供語音信箱通知。 | 有局限 |
res_snmp | 向SNMP管理的網絡提供系統狀態信息。 | 可以用 |
res_speech | 通用語音識別API。 | 有局限 |
res_timing_dahdi | 通過DAHDI核心接口提供時鐘。 | 很有用 |
res_timing_kqueue | 通過某些作業系統的特性提供時鐘。 | 不好說 |
res_timing_pthread | 使用標準pthread API提供時鐘;不是很有效率,但移植性好。 | 很有用 |
res_timing_timerfd | 通過新版Linux核心的timerfd API提供時鐘。 | 很有用 |
附加模塊
編輯附加模塊是社區開發的模塊,用法和版權條款都和Asterisk的主代碼不一樣。它們位於不同的目錄,預設是不會編譯和安裝的。要啟用這些模塊就要使用menuselect構建配置工具。
名稱 | 用途 | 評價 |
---|---|---|
app_mysql | 在撥號計劃中執行MySQL查詢。(已廢棄,見func_odbc) | 已廢棄 |
app_saycountpl | 用波蘭語播報計數。(已廢棄,已經集成到say.conf中) | 已廢棄 |
cdr_mysql | 在MySQL中記錄CDR。(我們推薦cdr_adaptive_odbc) | 可以用 |
chan_mobile | 允許手機通過藍芽接聽或撥打電話。 | 有局限 |
chan_ooh323 | 支持H.323協議。 | 可以用 |
format_mp3 | 支持播放MP3文件。 | 可以用 |
res_config_mysql | 使用MySQL資料庫作為實時配置後端。 | 很有用 |
測試模塊
編輯測試模塊被Asterisk開發團隊用來驗證新代碼。它們會被頻繁地添加或修改,對你沒什麼用,除非你要開發Asterisk。
如果你是Asterisk開發者,你也許會對Asterisk測試套件有興趣,你可以執行自動測試並將結果反饋給Asteisk項目。通過不斷地添加測試用例,Asterisk可以防止代碼腐爛。通過添加你自己的測試用例,升級的時候會更有把握些。
更多信息可以參考:
- http://blogs.asterisk.org/2010/04/29/installing-the-asterisk-test-suite/
- http://svn.asterisk.org/svn/testsuite/asterisk/trunk/README.txt
- #asterisk-testing@'Freenode IRC network'
文件結構
編輯Asterisk是一個複雜的系統,由很多資源組成。這些資源以不同的方式使用文件系統。既然Linux在這一點上很靈活,那就很有必要搞清楚什麼數據存在什麼地方(比如語音信箱文件、日誌文件等)。
配置文件
編輯Asterisk配置文件包括extensions.conf,sip.conf,modules.conf,以及各種信道、資源、模塊和函數用到的參數定義文件。這些文件一般位於/etc/asterisk,在做Asterisk的配置和管理工作時你經常會進到這個目錄。
模塊
編輯Asterisk的模塊一般會安裝到/usr/lib/asterisk/modules目錄。你一般不用關心這個目錄;但你知道模塊在什麼地方有時候也很有用。例如,如果你升級Asterisk,並且用menuselect構建配置工具選擇了不同的模塊,老的(不兼容)模塊又沒有刪除,安裝腳本會提示警告信息。 應該從modules目錄中刪除 這些老的模塊文件 。要麼手工刪除,要麼調用make uninstall。
資源庫
編輯有些模塊是需要外部數據源的。例如,等待音樂(MOH)就需要音樂文件才能播放。系統的語音提示也需要存儲到硬碟的某個地方。/var/lib/asterisk就是存放系統語音提示、AGI腳本、等待音樂(MOH)和其他資源文件的地方。
spool
編輯spool是Linux作業系統的一種任務緩衝和資源共享機制。例如,Linux的列印任務和待發郵件都是先寫到spool然後在處理的。對Asterisk來說,spool用來存儲臨時性數據,諸如語音消息,呼叫錄音,呼叫文件等。Asterisk的spool文件位於/var/spool/asterisk目錄。
日誌
編輯Asterisk能夠產生幾種不同的日誌文件。/var/log/asterisk是存放CDR,CEL,調試(debug)日誌,隊列日誌,消息,錯誤和其他輸出的地方。這個目錄對調試、排錯至關重要。
撥號計劃
編輯撥號計劃是Asterisk的核心。所有接入Asterisk的信道都要經過撥號計劃。撥號計劃包含呼叫流腳本,處理所有呼叫。
有三種方式可以編寫撥號計劃:
使用傳統的撥號計劃語法:/etc/asterisk/extensions.conf
使用Asterisk擴展邏輯(AEL)語言:/etc/asterisk/extensions.ael
使用LUA腳本語言:/etc/asterisk/extensions.lua
本書後面會有幾章專門介紹撥號計劃語法(這也是用得最多的方式)。一旦你學會了這種語法,你可以考慮選擇轉向AEL或者LUA,看你自己。
硬體
編輯Asterisk可以和各種技術通訊。一般來說,這種通訊是基於某種網絡連接的;當然,和傳統的電信網絡通訊(像PSTN)是需要特殊硬體的。
很多公司生產這種硬體,比如Digium(Asterisk的贊助商、所有人和主要開發者), Sangoma, Rhino, OpenVox,Pika,Voicetronix,Junghanns,Dialogic,Xorcom,beroNet,還有很多其他的。我們推薦Digium和Sangoma,當然其他廠商的產品可能更適合你的需求。
大多數硬體都是針對Digium Asteirsk硬體設備接口(DAHDI)設計的。這些硬體會有不同的安裝要求和文件位置。
在「第七章 外部連接性」中,我們會更詳細地討論DAHDI;當然,我們也會僅限於DAHDI的討論。你在安裝硬體的時候應該參考廠商的文檔。
Asterisk版本
編輯Asterisk的發布方案在過去幾年中已經經歷了幾個來回了,本節的目的是為了幫助你理解版本號的含義。需要注意的是1.6.x系列的版本策略的變化,它跟所有其他的Asterisk版本都不一樣(從1.0到1.8,包括可以預見的未來)
以前的版本方案
編輯當我們只有Asterisk 1.2和Asterisk 1.4的時候,所有的開發工作都在主線上進行,1.2分支和1.4分支上只進行缺陷修復。Asterisk 1.2已經被標記為EOF(End of Life),不會再進行任何缺陷修復和安全更新。在1.6.x之前,所有的缺陷修復只會在1.4上進行。
由於所有的開發工作都在主線上進行,除非創建1.6分支,否則人們不可能得到新特性和新功能。也不是完全不可能,主要是由於主線上可能發生任何變化,要在生產環境上部署主線的話就要求管理員非常精通Asterisk(C原始碼級的精通)。
為了減輕管理員的壓力,也為了用戶儘快用上新特性(等幾個月而不是等幾年),一個新的版本方案建立了。1.6分支實際上變成了一個系列1.6.0,1.6.1,1.6.2,等等……,每添加一個新特性就升一個小版本號。目標是每3、4個月就能得到一個新版本,為管理員提供一個更短更清晰的升級路線。如果你需要新特性的話,只需要等上幾個月就可以了。
這些分支的標籤看起來就會像這樣: 1.6.0.1 -- 1.6.0.2 -- 1.6.0.3 -- 1.6.0.4 -- etc. 1.6.1.1 -- 1.6.1.2 -- 1.6.1.3 -- 1.6.1.4 -- etc. 1.6.2.1 -- 1.6.2.2 -- 1.6.2.3 -- 1.6.2.4 -- etc.
圖示如下:
所以到目前為止,我們有了這樣一些分支:1.2,1.4,1.6.0,1.6.1,1.6.2(沒有分支1.6)。在這些分支中,我們又創建標籤,比如1.2.14,1.4.30,1.6.0.12,和1.6.2.15。
很不幸,並不是像我們想的那樣每3、4個月就出一個小版本:至少也要6-8個月。不僅如此,1.6.x這種版本方案也有自己的問題。人們很困惑,不知道應該運行那個版本。(TODO)
現在的版本方案
編輯開發團隊從1.6.x系列中吸取了教訓。出發點是好的,但實施起來完全不是那麼回事。所以,1.8的版本方案又變回去了,和1.2、1.4一樣。
雖然開發團隊仍然想儘快提供新特性使用(目前的目標定在一年一次),並且認識到對一個穩定的版本提供長期支持也很重要。你可以認為1.4是一個長期支持版本(LTS),1.6.x系列可以看作是1.4的一部分。然後1.8是下一個長期支持版本(包括四年的缺陷修復和五年的安全更新)。
(TODO)
結束語
編輯Asterisk由很多技術構成,其中很多自身就很複雜。所以,理解Asterisk的架構是很重要的。當然,Asterisk的設計還是很優秀的,在我們看來,它很好地平衡了複雜度和靈活性。