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可以防止代碼腐爛。通過添加你自己的測試用例,升級的時候會更有把握些。

更多信息可以參考:


文件結構[編輯]

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.

圖示如下:

Asterisk ver

所以到目前為止,我們有了這樣一些分支: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的設計還是很優秀的,在我們看來,它很好地平衡了複雜度和靈活性。