Asterisk譯為星号(*)在很多應用中被用做通配符,Astrisk做為PBX系統的完美名稱,原因之一是Asterisk可以連接配接數目龐大的接口類型,包括:
1模拟接接口,如你的電話線或模拟電話.
2數字線路,如T-1和E-1線路
3Voip協定,如SIP和IAX
目前正式版本是IAX2,但是IAX1的所有格式都已經停掉.是以當說到IAX都是特拽IAX2
使用接口配置檔案
1.Zaptel.conf:硬體接口基層配置,我們将建立一個FX0和一個FXS通道.
2.zapata.conf:硬體配置Asterisk的接口.
3.extension.conf:撥号方案檔案.
4.sip.conf:配置SIP協定的檔案
5.iax.conf:配置呼入和呼出IAX通道的檔案
FXO與FXS通信
差別:差別簡單,就在于連接配接的那端提供撥号音.FXO不生成撥号音,而是接收.FXS端口提供撥号音和震鈴電壓,在有呼叫的時候提醒使用者.兩者接口都提供雙向通訊(同時雙方向的通訊傳輸).
如果Asterisk有個相容FXO端口,就可以把電話線接入這端口,可以使用這根電話線呼叫和接收電話呼叫.同理,如果有個FXS端口,可以連接配接一部模拟電話,Asterisk就可以呼叫這部電話,可能也可以呼叫.(端口:通過配置使用的信令進行定義)
FXS卡必須像中心局(CO)進行運轉,使用FXO信令.同理,FXO卡連接配接CO,就意味着它需要像終端進行運轉,使用FXS信令.
Zaptel配置(FXO)
在/etc/zaptel.conf檔案,用于配置硬體,可以定義FXS端口與FXO信令的配置
fxsks=1 ;定義fxs端口采用通道1以ks信令協定
;fxoks=2 ;定義fxo端口采用通道2以ks信令協定
loadzone=us
defaultzone=us
信令協定:Loop start(ls),ground start(gs),kewlstart(ks),使用ks外信令協定,把fxoks中的ks替換ls或gs,Asterisk的模拟電路推薦ks信令協定.
******編輯完zaptel.conf檔案,需要使用/sbin/ztcfg -vv裝載配置到硬體(不須要詳細輸出可以省略-vv);修改信令方法需要重新開機.在編輯sip.conf和iax.conf文檔後,分别需要裝載chan_iax2.so和chan_sip.so
Zapata配置
[trunkgroups] ;定義一個主幹組
; define any trunk groups
[channels] ;硬體通道和他們選項信令方式.
; hardware channels ;硬體通道
; default ;預設
busydetect=yes ;增加這兩行,要不FXO口不能檢測到挂機信号。
busycount=5
usecallerid=yes ;設定來電顯示
hidecallerid=no ;設定去電不隐藏号碼
callwaiting=yes ;設定呼叫等待
threewaycalling=yes ;開啟三方通話(先閃斷,再呼叫第三方,再閃斷,就可以實作三方通話)
transfer=yes ;轉叫前轉(需要三方通話支援)
echocancel=yes ;回聲消除
echotraining=yes ;回音練習(會話前發個聲音,用于測試回聲)
; define channels ;定義通道
context=from-test ; Context内執行指令需要在extensions.conf内定義 [from-test]
signalling=fxs_ks ;FXO通道使用FXS信令
channel => 2 ; PSTN放在端口2上
允許zaptel和其它裝置通過PCI硬體安裝到系統中,編輯udev
[[email protected] asterisk]# vi /etc/udev/rules.d/50-udev.rules
#在末尾添加上以下
KERNEL="zapctl", NAME="zap/ctl"
KERNEL="zaptimer", NAME="zap/timer"
KERNEL="zapchannel", NAME="zap/channel"
KERNEL="zappseudo", NAME="zap/pseudo"
KERNEL="zap[0-9]*", NAME="zap/%n"
Dialplan配置
基本的撥号方案,使用Echo()校驗工作通道雙向通訊;
[from-test]
exten => s,1,Answer()
exten => s,n,Echo()
SIP
SIP(會話初始協定),通常用于VOIP電話,進行呼叫建立,呼叫協商,呼叫結束.它幫助兩個端互相通認,但它不處理媒體;當呼叫建立後,他通過實時傳輸協定(RTP)在電話A到電話B直接傳輸媒體.
SIP和RTP
SIP是一個應用層的信令協定.他使用的端口是5060(通常)進行通信.SIP可以通過UDP和TCP傳輸層協定進行傳輸.Asterisk目前沒有TCP用于傳輸SIP資訊.
RTP用于端點間傳輸媒體(語音),Asterisk中RTP使用大數字的無特權端口(預設10,000到20,000)
SIP優點:普通的被接受和結構靈活.其它的VOIP協定還有H.323,IAX,MGCP.
SIP配置
/etc/asterisk/sip.conf檔案中:
[general]
context=default
srvlookup=yet ;建立一個邏輯和可解析位址的方法,你可以達到這個位址,還可以擷取DNS很多好處
[10000]
username=10000 ;使用者名
type=friend ;可以定義使用者(user)/端(peer)/朋友(friend)
secret=123456 ;認證密碼
record_out=Always;去電錄音Adhoc須要時,Never從不,Always總是
record_in=Never ;來電錄音
callgroup ;呼叫組,預設為"1"
pickupgroup ;代接組
disallow ;不允許編碼
allow ;允許編碼
port=5060 ;端口号
qualify=yes ;監視Asterisk伺服器與電話之間是否延時(預設2,000可達;yes可替換毫秒)
context=default ;指令的地點
host=dynamic ;要求号碼要注冊,以便Asterisk如何找到電話.(static則不需要注冊)
dtmfmode=rfc2833 ;
[email protected]
callerid=test1 <10000>
canreinvite=no ;
使用者戶類型是用于認證呼入呼叫;端類型用于呼出呼叫;朋友類型兩種都用.(這個常用在sip.conf與iax.conf中用到)
IAX
IAX(Inter Aasterisk eXchange)協定通常用于伺服器間通信.IAX和SIP協定最大差別在于媒體(語音)在端點之間傳輸的方式不同.
Asterisk預設情況是在5060端口接收SIP信令,在10000-20000端口接收RTP(媒體)流.而IAX所有的信令和媒體流都通過一個端口4569進行傳輸.這種方式的好處是IAX協定能更适合在NAT相關拓撲的應用.
IAX使用者習慣對進入PBX系統的呼叫進行鑒權和處理.對從PBX系統呼出的呼叫,Asterisk應用IAX的iax.conf檔案的端點進入(條目)對遠端進行鑒權)
通過iax.conf設定進行呼叫的鑒權和處理:
[general] ;至少需要一個主要段落,主要定義IAX協定的相關設定.
jitterbuffer=no
register => remote_number:[email protected] ;注冊到遠端伺服器上,告訴伺服器目前位置(網際網路位置)在哪
[REC_SERVER]
type=user ;用user來定義呼入呼叫的類型
context=incoming ;進行呼入呼叫鑒定
auth=rsa
inkeys= ;公鑰,是Asterisk标準
通過extensions.conf設定一個incoming的context:
[incoming]
exten => remote_number,1,Dial(SIP/number) ;撥打遠端号碼時(呼入)轉移到number(内部)号碼上
--------以上是IAX入局配置,下面配置出局IAX連接配接--------
在iax.conf設定呼出條目
[REMOTE_SERVER]
type=peer ;用peer定義呼出類型
host=my.receiving.server.ca ;接收伺服器域名或IP位址
username=number ;接收伺服器認證使用者(賬戶号碼)
secret=password ;接收伺服器認證密碼(賬戶密碼)
qualify=yes ;不時檢查遠端的伺服器是否響應用
disallow=all ;用于複位原來設定的所有編碼資訊
allow=gsm ;支援gsm編碼
allow=libc ;支援libc編碼
allow=g726 ;支援持g726編碼
****使用disallow複位原來設定的所有編碼資訊.再重新設定支援的編碼,優先級從高到低
在extensions.conf設定
[to_remove]
exten => remove_number,1,Dial(IAX2/REMOVE_SERVER/number)
撥号方案文法
Asterisk的撥号方案在檔案extensions.conf中定義(/etc/asterisk/extensions.con)
extensions.conf(四部分:context,extension,priorities,application)
context:用于對extensions組命名,把撥号方案的不同部分進行分離,免得交織在一起.
表示方法是把名字放在[]的中間,名字隻能用a~z,A~Z,0~9,以及連字号和下劃線組成(空格不在允許的字元裡面,context中不要使用空格).如:[context1],[incoming],[default];所有放在context定義的之後的指令都是這個context一部分,直到下一個context定義的開始.
context的一個重要用途就是加強安全性.如果沒有仔細設計撥号方案,可能會造成别人盜用你的系統的不良後果.
extensions:extensions是asterisk要執行的指令,由來電或通道上所撥數字來觸發.可以定義電話分機
extension的文法是單詞exten後面跟着一個由等号和大于号組成的箭頭,如:exten => extension的名字
一個完整的extension由三部分組成:
extensions的名字或号碼
priority(每個extension可以有多個步驟,步驟的編号稱作priority)
應用(或者指令),針對呼叫完成一些動作
這三個部分用英文逗号分開,如:
exten => name,priority,application()
priorities:每個extension都可以有幾個步驟,稱作priorities。如:
exten=>50001,1,Answer() #編号為1的priority,執行接聽電話
exten=>50001,2,Hangup() #編号為2的priority,然後挂電話
必須確定priority從1開始并且連續的編号
application:動作,比如:播放聲音,接受音頻撥号輸入或者挂斷電話等.
Application
Answer(),Playback()和Hangup()應用
Answer()應用于接聽正在響鈴通道,它不需要任何參數.
Playback()應用在通道上播放事先錄制好的語音檔案.指定一個檔案名(不帶擴充名),可以使用絕對路徑與相對路徑.
Hangup()應用在于挂斷一個正在活動的通道.
Background(),Goto()應用
Background()它也播放事先錄制好的語音檔案,但它等待按鍵,然後執行對應extension.
防止Background()後超出按鍵範圍,使用i來解決問題.
防止Background長時間沒有選擇,使用t來決解問題.
Goto()應用使得在撥号方案的不同部分有序的轉移非常容易.
Goto()應用有三個參量分别是context,extension,和priority.即Goto(context,extension,priority)
Dial()應用
Dial()有4個參量,
第一個是:呼叫的被叫地(傳輸技術/遠地資源)如:SIP/50000或Zap/1.可以同時撥打多個通道如:
exten => 601,1,Dial(Zap/1&SIP/50000&IAX/60000)
第二個是:逾時,機關"秒".給定逾時參量Dial會一直對被叫地進行呼叫,直到逾時後才放棄,如果沒有給定,将直到接聽或主叫挂機,如果呼叫在逾時前接聽,通道就被橋接,撥号完成
補充:如果逾時後被叫地沒有應答,則會繼續Dial()的extension下一個priority.如果被叫地通道忙,Dial()将轉到priority n+101(n是Dial()被調用的priority),如果存在的話,将能夠處理被叫地忙的方式接叫未接電話.
第三個是:可選擇參量,它會可以影響到Dial()的行為,如:
exten => 601,1,Dial(SIP/50000,30,Ttwr)
其中T表示允許主叫使用者按"#"轉接呼叫;t表示允許被叫使用者按"#"轉接呼叫;r表示為被叫使用者産生振鈴聲;w使用者按"*"鍵開始錄音.
最後一個是:URL參量.如:
exten => 601,1,Dial(SIP/[email protected])
exten => 602,1,Dial(Zap/1/5732381)
任何參量都可以為空如:
exten => 601,1,Dial(SIP/60000,,T)
或
exten => 601,1,Dial(SIP/60000)
綜合上面舉個例子:
[test]
exten => s,1,Answer()
exten => s,2,Background(enter-ext-of-person)
exten => 601,1,Dial(Zap/1,30,Ttrw)
exten => 601,2,Playback(vm-nobodyavail)
exten => 601,3,Hangup()
exten => 601,102,Playback(tt-allbusy)
exten => 601,103,Hangup()
exten => 602,1,Dial(SIP/50000,30,Ttrw)
exten => 602,2,Playback(vm-nobodyavail)
exten => 602,3,Hangup()
exten => 602,102,Playback(tt-allbusy)
exten => 602,103,Hangup( )
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(test,s,1)
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup()
Extension,不能多于80個字元,也不能少于1個字元(601/602)
------2007-01-05-修改
變量
在撥号方案中使用變量可以減少打字、增加清晰度,也有助于在撥号方案中加入邏輯.
這裡的變量有全局變量,通道變量和環境變量.
全局變量:
全局變量應該在extensions.conf檔案的開始利用[globals]這個context定義或利用 SetGlobalVar()應用.如:
[globals]
80000=Zap/1
或
[internal]
exten => 123,1,SetGlobalVar(80000=Zap/1)
通道變量
通道變量與特定的呼叫相關的變量,通道變量隻能在目前呼叫存在其間定義,并隻能用于參與該呼叫的通道.通道變量使用 Set()應用來設定.如:
exten => 601,1,Set(80000=Zap/1)
環境變量
環境變量是一種在 Asterisk 中通路作業系統環境變量的方法.這些變量以${ENV(var)}形式引用,其中的 var 是所要引用的作業系統環境變量.
綜合上面舉例:
[globals]
PSTN=Zap/1
TEST=SIP/80000
[test]
exten => s,1,Answer()
exten => s,2,Background(enter-ext-of-person)
exten => 101,1,Dial(${PSTN},10)
exten => 101,2,Playback(vm-nobodyavail)
exten => 101,3,Hangup()
exten => 101,102,Playback(tt-allbusy)
exten => 101,103,Hangup()
exten => 102,1,Dial(${TEST},10)
exten => 102,2,Playback(vm-nobodyavail)
exten => 102,3,Hangup()
exten => 102,102,Playback(tt-allbusy)
exten => 102,103,Hangup()
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(incoming,s,1)
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup()
[default]
exten => 101,1,Dial(${PSTN},,r)
exten => 102,1,Dial(${TEST},,r)
模式比對
模式比對
使用模式及比對是用不同的字母和符号來代表可能要比對的數字.模式總是用一個下劃線 (_) 開始,它告訴Asterisk 要做模式比對,這不是一個 extension 名字.(這意味着不能使用下劃線作為 extension 名字的開始字元.)
模式比對文法
在下劃線之後,可以使用一個或者多個下面列出來的字元:
X:比對 0-9 的任何數字;
Z:比對 1-9 的任何數字;
N:比對 2-9 的任何數字;
.(句号)通配符,比對一個或多個字元;
[15-7]:比對1,5,6,7;
使用${EXTEN}通道變量:Asterisk會把通道變量${EXTEN}設定為所撥的數字.通過sayDigits()檢測撥到号碼内容如:
exten => _9XXXXXXX,1,SayDigits(${EXTEN})
;SayDigits()應用會把所撥的8位extension讀出來
exten => _9XXXXXXX,1,SayDigits(${EXTEN:1})
;隻讀出來後7位數,其中"1"表示不撥前面1位數
exten => _9XXXXXXX,1,SayDigits(${EXTEN:-1})
;隻讀出來最後1位,其中"1"表示隻撥出最後1位數
去話撥号(PSTN)
舉例:按"9"後撥打外線,去電時,去除"9";加放"ignorepat => 9"是為了使按完"9"後還可以聽到撥号音;加入"Congestion()"應用是挂機或忙的時候播放快忙音(擁擠聲音).
---本地去話撥号---
[outbound-local]
ignorepat => 9
exten => _9NXXXXXX,1,Dial(Zap/1/${EXTEN:1})
exten => _9NXXXXXX,2,Congestion()
exten => _9NXXXXXX,102,Congestion()
---再加入緊急電話撥号---
exten => 9119,1,Dial(Zap/1/119)
exten => 119,1,Dial(Zap/1/119)
exten => 9110,1,Dial(Zap/1/110)
exten => 110,1,Dial(Zap/1/110)
---長途電話撥号---
[outbound-long]
exten => _90NXXNXXXXXX,1,Dial(Zap/1/${EXTEN:1})
exten => _90NXXNXXXXXX,2,Congestion()
exten => _90NXXNXXXXXX,102,Congestion()
Includes
Asterisk通過Includes實作在一個context中使用另一個context.格式:includes => context
[internal]
include => outbound-local
include => outbound-long
exten => _80XXX,1,Dial(SIP/${EXTEN},30,r)
exten => _80XXX,2,Playback(vm-nobodyavail)
exten => _80XXX,3,Hangup()
exten => _80XXX,102,Playback(tt-allbusy)
exten => _80XXX,103,Hangup()
表達式和可變操作
表達式
表達式是變量,運算符和數值的聯合,當你把它們組合到一起就會得到一個表達式結果.在Asterisk 中,表達式總是以$符合作為開始,以方括号“[]”來擴住表達式.如:
$[expression]
$[${COUNT} + 1]
$[${COUNT} / 2]
;引用變量,必須把這個變量名用花括号"{}"括起來,而且在前面加上美元符号"$" 标示出來
運算符
布爾型運算符
expr1 | expr2("|"或運算):如果expr1的值是真值,那麼運算符将賦expr1的值,否則将賦expr2的值.
expr1 & expr2("&"與運算):如果兩個表達式的值都為true,運算符将指派為expr1,否則指派為0.
expr1{=,>,>=,<,<=,|=}expr2:如果自變量都是整數,這些運算符将得到一個整數的比較結果;否則,它們将得到字元串的結果.如果給定的關系是正确地,這個結果是1,否則就是0.
數學運算符
expr1{+, -}expr2:運算符能得到整數自變量的加法或者減法地結果.
expr1{*,/,%}expr2:運算符能分别得到整數自變量的乘法,除法或是餘數的結果.
正規表達式運算符
expr1:expr2:運算符比對 expr2到expr1,這裡的expr2必須是一個正規表達式.
***Asterisk 的分析程式非常簡單,是以在你輸入時,在運算符和其他數值之間至少需要一個空格.
撥号方案函數
撥号方案函數可以使你增加更多的功能到你的表達式中.
文法
基本文法:FUNCTION_NAME(argument).如果要引用函數的值,和引用變量的值一樣,用美元符号“ $” 加上花括号“{}” 括起函數表達式.如:
${FUNCTION_NAME(argument)}
函數也可以嵌套封裝其他的函數,如:
${FUNCTION_NAME(${FUNCTION_NAME(argument)})}
撥号方案函數
函數常常用來連接配接set()應用,來取得或者指派一個變量的值.舉個例子,計算一下一個字元串的長度,并讀出這個長度;
exten=>123,1,set(TEST=example) ;指派example變量給TEST
exten=>123,2,saynumber(${LEN(${TEST})}) ;計算出變量TEST長度,并讀出長度數
結果是:7
如果我們要設定一個動态通道的逾時,應該用TIMEOUT()函數.這個函數可以接受以下三個中的一個做為自變量,分别是absolute,digit和response.他們對應的應用是AbsoluteTimeout(),DigitTimeout()和ResponseTimeout().用 timeout()函數,設定數字的逾時,我們可以set()函數, 如:
exten=>s,1,set(TIMEOUT(digit)=30)
***這個函數中沒有${}.它和給一個自變量指派一樣,我們就指派給一個函數,是不使用${}封裝的.
本文來自CSDN部落格,轉載請标明出處:http://blog.csdn.net/JieenRo/archive/2008/05/04/2378695.aspx