asterisk基础知识
vim~/.bashrc
運行調試asterisk
1. 運行調試常用命令
./asterisk & 在后臺啟動asterisk
./asterisk –vvvc 啟動asterisk并盡量多的在控制臺顯示調試信息
./asterisk –r 連接asterisk控制臺
set verbose 9999 設置打印詳細信息
2.asterisk控制臺下常用命令CLI
sip reload 重新加載sip配置信息
sip set debug設置顯示更多的sip信息
sip set debug off關閉顯示更多的sip信息
sip show channels 顯示所有活動的SIP通道
sip show peers 顯示所有已定義的SIP peer
dialplan show 顯示撥號方案
dialplan reload重新加載撥打方案
stop gracefully 優雅地停止asterisk
stop now 立即停止運行asterisk
module show 顯示所有已加載模塊
module loadcdr_radius.so加載模塊cdr_radius.so
module reload cdr_radius.so 重新加載模塊cdr_radius.so
module unload cdr_radius.so 卸載模塊cdr_radius.so
core show applications 顯示所有的應用,比如Dial, Radius, Hangup,Answer等
core show channels 顯示所有的通話頻道
core show codecs 顯示所有支持的編解碼器
core show functions 顯示所有的功能函數
在asterisk源碼目錄下運行makemenuselect可以進入模塊選擇頁面,在里面可以選擇和去除一些模塊。
看完這些目錄之后,對其大體的功能也可能會有點認識,還是從啟動服務器還是聊起。啟動服務器方法很多,我們按照手冊中的描述選取一種
Asterisk –cvvvv具體參數含義請參考手冊
也可以通過運行 /usr/sbin/safe_asterisk 來運行。
我們下文的描述就會基于這個簡單的拓撲展開討論,這兒的tel都是sip電話,我們假定tel1號碼為808,tel2號碼為830,現在的簡單需求就是我808能夠打通830,實現雙向通話。開始配置前,先了解主要配置文件的作用。
/etc/asterisk/asterisk.conf 主要配置文件,
/etc/zaptel.conf 硬件接口的基本層. 修改這個配置文件要用modprobe裝載LinuxKernel使用模塊.
/etc/asterisk/zapata.conf 為硬件配置Asterisk的接口.
/etc/asterisk/extensions.conf 撥號方案.
/etc/asterisk/sip.conf SIP協議配置文件
/etc/asterisk/iax.conf 呼入和呼出IAX通道
/etc/asterisk/extensions.conf 撥號方案配置文件
/etc/asterisk/moduprobe.conf 加載模塊配置文件
撥號方案語法
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() exten => 602,1,Dial(Zap/1/5732381) |
任何參量都可以為空如:
|
exten => 601,1,Dial(SIP/60000,,T) 或 exten => 601,1,Dial(SIP/60000) |
綜合上面舉個例子:
|
[test] |
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) |
***這個函數中沒有${}.它和給一個自變量賦值一樣,我們就賦值給一個函數,是不使用${}封裝的.
很多東西都是初學時遇到的問題,當時記錄在印象筆記。
現在粘貼復制過來,如有侵權,私信我,盡快刪除
總結
以上是生活随笔為你收集整理的asterisk基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我又踩坑了!如何为HttpClient请
- 下一篇: recvfrom超时设置