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) |
***這個函數中沒有${}.它和給一個自變量賦值一樣,我們就賦值給一個函數,是不使用${}封裝的.