asterisk基础知识
vim~/.bashrc
運(yùn)行調(diào)試asterisk
1. 運(yùn)行調(diào)試常用命令
./asterisk & 在后臺(tái)啟動(dòng)asterisk
./asterisk –vvvc 啟動(dòng)asterisk并盡量多的在控制臺(tái)顯示調(diào)試信息
./asterisk –r 連接asterisk控制臺(tái)
set verbose 9999 設(shè)置打印詳細(xì)信息
2.asterisk控制臺(tái)下常用命令CLI
sip reload 重新加載sip配置信息
sip set debug設(shè)置顯示更多的sip信息
sip set debug off關(guān)閉顯示更多的sip信息
sip show channels 顯示所有活動(dòng)的SIP通道
sip show peers 顯示所有已定義的SIP peer
dialplan show 顯示撥號(hào)方案
dialplan reload重新加載撥打方案
stop gracefully 優(yōu)雅地停止asterisk
stop now 立即停止運(yùn)行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 顯示所有的應(yīng)用,比如Dial, Radius, Hangup,Answer等
core show channels 顯示所有的通話頻道
core show codecs 顯示所有支持的編解碼器
core show functions 顯示所有的功能函數(shù)
在asterisk源碼目錄下運(yùn)行makemenuselect可以進(jìn)入模塊選擇頁(yè)面,在里面可以選擇和去除一些模塊。
看完這些目錄之后,對(duì)其大體的功能也可能會(huì)有點(diǎn)認(rèn)識(shí),還是從啟動(dòng)服務(wù)器還是聊起。啟動(dòng)服務(wù)器方法很多,我們按照手冊(cè)中的描述選取一種
Asterisk –cvvvv具體參數(shù)含義請(qǐng)參考手冊(cè)
也可以通過運(yùn)行 /usr/sbin/safe_asterisk 來運(yùn)行。
我們下文的描述就會(huì)基于這個(gè)簡(jiǎn)單的拓?fù)湔归_討論,這兒的tel都是sip電話,我們假定tel1號(hào)碼為808,tel2號(hào)碼為830,現(xiàn)在的簡(jiǎn)單需求就是我808能夠打通830,實(shí)現(xiàn)雙向通話。開始配置前,先了解主要配置文件的作用。
/etc/asterisk/asterisk.conf 主要配置文件,
/etc/zaptel.conf 硬件接口的基本層. 修改這個(gè)配置文件要用modprobe裝載LinuxKernel使用模塊.
/etc/asterisk/zapata.conf 為硬件配置Asterisk的接口.
/etc/asterisk/extensions.conf 撥號(hào)方案.
/etc/asterisk/sip.conf SIP協(xié)議配置文件
/etc/asterisk/iax.conf 呼入和呼出IAX通道
/etc/asterisk/extensions.conf 撥號(hào)方案配置文件
/etc/asterisk/moduprobe.conf 加載模塊配置文件
撥號(hào)方案語(yǔ)法
Asterisk的撥號(hào)方案在文件extensions.conf中定義(/etc/asterisk/extensions.con)
extensions.conf(四部分:context,extension,priorities,application)
context:用于對(duì)extensions組命名,把撥號(hào)方案的不同部分進(jìn)行分離,免得交織在一起.
表示方法是把名字放在[]的中間,名字只能用a~z,A~Z,0~9,以及連字號(hào)和下劃線組成(空格不在允許的字符里面,context中不要使用空格).如:[context1],[incoming],[default];所有放在context定義的之后的指令都是這個(gè)context一部分,直到下一個(gè)context定義的開始.
context的一個(gè)重要用途就是加強(qiáng)安全性.如果沒有仔細(xì)設(shè)計(jì)撥號(hào)方案,可能會(huì)造成別人盜用你的系統(tǒng)的不良后果.
extensions:extensions是asterisk要執(zhí)行的指令,由來電或通道上所撥數(shù)字來觸發(fā).可以定義電話分機(jī)
extension的語(yǔ)法是單詞exten后面跟著一個(gè)由等號(hào)和大于號(hào)組成的箭頭,如:exten => extension的名字
一個(gè)完整的extension由三部分組成:
|
extensions的名字或號(hào)碼 priority(每個(gè)extension可以有多個(gè)步驟,步驟的編號(hào)稱作priority) |
應(yīng)用(或者命令),針對(duì)呼叫完成一些動(dòng)作
這三個(gè)部分用英文逗號(hào)分開,如:
| exten => name,priority,application() |
priorities:每個(gè)extension都可以有幾個(gè)步驟,稱作priorities。如:
|
exten=>50001,1,Answer() #編號(hào)為1的priority,執(zhí)行接聽電話 exten=>50001,2,Hangup() #編號(hào)為2的priority,然后掛電話 |
必須確保priority從1開始并且連續(xù)的編號(hào)
application:動(dòng)作,比如:播放聲音,接受音頻撥號(hào)輸入或者掛斷電話等.
Application
Answer(),Playback()和Hangup()應(yīng)用
Answer()應(yīng)用于接聽正在響鈴?fù)ǖ?它不需要任何參數(shù).
Playback()應(yīng)用在通道上播放事先錄制好的語(yǔ)音文件.指定一個(gè)文件名(不帶擴(kuò)展名),可以使用絕對(duì)路徑與相對(duì)路徑.
Hangup()應(yīng)用在于掛斷一個(gè)正在活動(dòng)的通道.
Background(),Goto()應(yīng)用
Background()它也播放事先錄制好的語(yǔ)音文件,但它等待按鍵,然后執(zhí)行對(duì)應(yīng)extension.
防止Background()后超出按鍵范圍,使用i來解決問題.
防止Background長(zhǎng)時(shí)間沒有選擇,使用t來決解問題.
Goto()應(yīng)用使得在撥號(hào)方案的不同部分有序的轉(zhuǎn)移非常容易.
Goto()應(yīng)用有三個(gè)參量分別是context,extension,和priority.即Goto(context,extension,priority)
Dial()應(yīng)用
Dial()有4個(gè)參量,
第一個(gè)是:呼叫的被叫地(傳輸技術(shù)/遠(yuǎn)地資源)如:SIP/50000或Zap/1.可以同時(shí)撥打多個(gè)通道如:
| exten => 601,1,Dial(Zap/1&SIP/50000&IAX/60000) |
第二個(gè)是:超時(shí),單位"秒".給定超時(shí)參量Dial會(huì)一直對(duì)被叫地進(jìn)行呼叫,直到超時(shí)后才放棄,如果沒有給定,將直到接聽或主叫掛機(jī),如果呼叫在超時(shí)前接聽,通道就被橋接,撥號(hào)完成
補(bǔ)充:如果超時(shí)后被叫地沒有應(yīng)答,則會(huì)繼續(xù)Dial()的extension下一個(gè)priority.如果被叫地通道忙,Dial()將轉(zhuǎn)到priority n+101(n是Dial()被調(diào)用的priority),如果存在的話,將能夠處理被叫地忙的方式接叫未接電話.
第三個(gè)是:可選擇參量,它會(huì)可以影響到Dial()的行為,如:
| exten => 601,1,Dial(SIP/50000,30,Ttwr) |
其中T表示允許主叫用戶按"#"轉(zhuǎn)接呼叫;t表示允許被叫用戶按"#"轉(zhuǎn)接呼叫;r表示為被叫用戶產(chǎn)生振鈴聲;w用戶按"*"鍵開始錄音.
最后一個(gè)是: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) |
綜合上面舉個(gè)例子:
|
[test] |
Extension,不能多于80個(gè)字符,也不能少于1個(gè)字符(601/602)
------2007-01-05-修改
變量
在撥號(hào)方案中使用變量可以減少打字、增加清晰度,也有助于在撥號(hào)方案中加入邏輯.
這里的變量有全局變量,通道變量和環(huán)境變量.
全局變量:
全局變量應(yīng)該在extensions.conf文件的開始利用[globals]這個(gè)context定義或利用 SetGlobalVar()應(yīng)用.如:
|
[globals] 80000=Zap/1 或 [internal] exten => 123,1,SetGlobalVar(80000=Zap/1) |
通道變量
通道變量與特定的呼叫相關(guān)的變量,通道變量只能在當(dāng)前呼叫存在其間定義,并只能用于參與該呼叫的通道.通道變量使用 Set()應(yīng)用來設(shè)置.如:
| exten => 601,1,Set(80000=Zap/1) |
環(huán)境變量
環(huán)境變量是一種在 Asterisk 中訪問操作系統(tǒng)環(huán)境變量的方法.這些變量以${ENV(var)}形式引用,其中的 var 是所要引用的操作系統(tǒng)環(huán)境變量.
綜合上面舉例:
|
[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) |
模式匹配
模式匹配
使用模式及匹配是用不同的字母和符號(hào)來代表可能要匹配的數(shù)字.模式總是用一個(gè)下劃線 (_) 開始,它告訴Asterisk 要做模式匹配,這不是一個(gè) extension 名字.(這意味著不能使用下劃線作為 extension 名字的開始字符.)
模式匹配語(yǔ)法
在下劃線之后,可以使用一個(gè)或者多個(gè)下面列出來的字符:
|
X:匹配 0-9 的任何數(shù)字; Z:匹配 1-9 的任何數(shù)字; N:匹配 2-9 的任何數(shù)字; .(句號(hào))通配符,匹配一個(gè)或多個(gè)字符; [15-7]:匹配1,5,6,7; |
使用${EXTEN}通道變量:Asterisk會(huì)把通道變量${EXTEN}設(shè)置為所撥的數(shù)字.通過sayDigits()檢測(cè)撥到號(hào)碼內(nèi)容如:
|
exten => _9XXXXXXX,1,SayDigits(${EXTEN}) ;SayDigits()應(yīng)用會(huì)把所撥的8位extension讀出來 exten => _9XXXXXXX,1,SayDigits(${EXTEN:1}) ;只讀出來后7位數(shù),其中"1"表示不撥前面1位數(shù) exten => _9XXXXXXX,1,SayDigits(${EXTEN:-1}) ;只讀出來最后1位,其中"1"表示只撥出最后1位數(shù) |
去話撥號(hào)(PSTN)
舉例:按"9"后撥打外線,去電時(shí),去除"9";加放"ignorepat => 9"是為了使按完"9"后還可以聽到撥號(hào)音;加入"Congestion()"應(yīng)用是掛機(jī)或忙的時(shí)候播放快忙音(擁擠聲音).
|
---本地去話撥號(hào)--- [outbound-local] ignorepat => 9 exten => _9NXXXXXX,1,Dial(Zap/1/${EXTEN:1}) exten => _9NXXXXXX,2,Congestion() exten => _9NXXXXXX,102,Congestion() ---再加入緊急電話撥號(hào)--- 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) ---長(zhǎng)途電話撥號(hào)--- [outbound-long] exten => _90NXXNXXXXXX,1,Dial(Zap/1/${EXTEN:1}) exten => _90NXXNXXXXXX,2,Congestion() exten => _90NXXNXXXXXX,102,Congestion() |
Includes
Asterisk通過Includes實(shí)現(xiàn)在一個(gè)context中使用另一個(gè)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() |
表達(dá)式和可變操作
表達(dá)式
表達(dá)式是變量,運(yùn)算符和數(shù)值的聯(lián)合,當(dāng)你把它們組合到一起就會(huì)得到一個(gè)表達(dá)式結(jié)果.在Asterisk 中,表達(dá)式總是以$符合作為開始,以方括號(hào)“[]”來擴(kuò)住表達(dá)式.如:
|
$[expression] $[${COUNT} + 1] $[${COUNT} / 2] ;引用變量,必須把這個(gè)變量名用花括號(hào)"{}"括起來,而且在前面加上美元符號(hào)"$" 標(biāo)示出來 |
運(yùn)算符
布爾型運(yùn)算符
expr1 | expr2("|"或運(yùn)算):如果expr1的值是真值,那么運(yùn)算符將賦expr1的值,否則將賦expr2的值.
expr1& expr2("&"與運(yùn)算):如果兩個(gè)表達(dá)式的值都為true,運(yùn)算符將賦值為expr1,否則賦值為0.
expr1{=,>,>=,<,<=,|=}expr2:如果自變量都是整數(shù),這些運(yùn)算符將得到一個(gè)整數(shù)的比較結(jié)果;否則,它們將得到字符串的結(jié)果.如果給定的關(guān)系是正確地,這個(gè)結(jié)果是1,否則就是0.
數(shù)學(xué)運(yùn)算符
expr1{+, -}expr2:運(yùn)算符能得到整數(shù)自變量的加法或者減法地結(jié)果.
expr1{*,/,%}expr2:運(yùn)算符能分別得到整數(shù)自變量的乘法,除法或是余數(shù)的結(jié)果.
正則表達(dá)式運(yùn)算符
expr1:expr2:運(yùn)算符匹配 expr2到expr1,這里的expr2必須是一個(gè)正則表達(dá)式.
***Asterisk 的分析程序非常簡(jiǎn)單,因此在你輸入時(shí),在運(yùn)算符和其他數(shù)值之間至少需要一個(gè)空格.
撥號(hào)方案函數(shù)
撥號(hào)方案函數(shù)可以使你增加更多的功能到你的表達(dá)式中.
語(yǔ)法
基本語(yǔ)法:FUNCTION_NAME(argument).如果要引用函數(shù)的值,和引用變量的值一樣,用美元符號(hào)“ $” 加上花括號(hào)“{}” 括起函數(shù)表達(dá)式.如:
| ${FUNCTION_NAME(argument)} |
函數(shù)也可以嵌套封裝其他的函數(shù),如:
| ${FUNCTION_NAME(${FUNCTION_NAME(argument)})} |
撥號(hào)方案函數(shù)
函數(shù)常常用來連接set()應(yīng)用,來取得或者賦值一個(gè)變量的值.舉個(gè)例子,計(jì)算一下一個(gè)字符串的長(zhǎng)度,并讀出這個(gè)長(zhǎng)度;
|
exten=>123,1,set(TEST=example) ;賦值example變量給TEST exten=>123,2,saynumber(${LEN(${TEST})}) ;計(jì)算出變量TEST長(zhǎng)度,并讀出長(zhǎng)度數(shù) 結(jié)果是:7 |
如果我們要設(shè)置一個(gè)動(dòng)態(tài)通道的超時(shí),應(yīng)該用TIMEOUT()函數(shù).這個(gè)函數(shù)可以接受以下三個(gè)中的一個(gè)做為自變量,分別是absolute,digit和response.他們對(duì)應(yīng)的應(yīng)用是AbsoluteTimeout(),DigitTimeout()和ResponseTimeout().用 timeout()函數(shù),設(shè)置數(shù)字的超時(shí),我們可以set()函數(shù), 如:
| exten=>s,1,set(TIMEOUT(digit)=30) |
***這個(gè)函數(shù)中沒有${}.它和給一個(gè)自變量賦值一樣,我們就賦值給一個(gè)函數(shù),是不使用${}封裝的.
很多東西都是初學(xué)時(shí)遇到的問題,當(dāng)時(shí)記錄在印象筆記。
現(xiàn)在粘貼復(fù)制過來,如有侵權(quán),私信我,盡快刪除
總結(jié)
以上是生活随笔為你收集整理的asterisk基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我又踩坑了!如何为HttpClient请
- 下一篇: recvfrom超时设置