天天看點

asterisk

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

繼續閱讀