天天看點

asterisk撥号方案設計

Playback()和Background()的差別:

建構互動式Asterisk系統的關鍵是Background()應用。與Playback()相同的是,它也播放事先錄制好的語音檔案;

與Playback()不同的是,當主叫方按下電話鍵(1個或者多個)的時候,會中斷語音的播放,轉到所按數字對應的extension。

例如:主叫方按下5,Asterisk停止播放語音,把呼叫的控制發送給extension 5 的第一個priority。

Background()應用通常用于建立語音菜單(也稱作自動話務員或者電話樹)。

很多公司使用語音菜單來引導主叫方到适當的分機,以免接待員每一個電話。

Background()的文法與Playback()類似:

exren => 123456,1,Background(hello-world)

Asterisk帶有很多專業錄制的語音檔案,他們在預設的語音檔案目錄内(通常是/var/lib/asterisk/sounds/)

一段撥打10086,然後提示請撥分機号碼的撥号方案(我模拟的撥打10086的情景):

先來配置:

sip.conf

[9901]

type=friend

host=dynamic

secret=123

context=demotest2

[9902]

type=friend

secret=123

host=dynamic

context=demotest2

extensions.conf

[globals]

;下面這行是錯誤代碼,[globals]中不能使用${EXTEN}

;MY=SIP/${EXTEN}

[demotest1]

;下面這行也有問題,MY本來就是錯的

;exten => _99.,1,Dial(MY,5)

;下面這行是對的

exten => _99.,1,Dial(SIP/${EXTEN},5)

exten => _99.,2,SayDigits(${EXTEN})

exten => _99.,5,Playback(vm-nobodyavail)

;等待10s,使用Wait(10)

;exten => _99X.,n,Wait(10)

;挂斷

exten => _99X.,n,Hangup()

實作有三種方法

方法一

這個方法的缺陷是:當vm-enter-num-to-call.gsm播放完畢之前必須按下分機号,否則出錯。

[demotest2]

exten = 10086,1,Background(vm-enter-num-to-call)

exten = 1,1,Playback(digits/1)

exten = 1,2,Goto(demotest2,10086,1):

exten = 10,1,Playback(digits/10)

exten = 10,2,Goto(demotest1,10086,1)

exten = 11,1,Playback(digits/11)

exten = 11,2,Goto(10086,1)

exten = 12,1,Playback(digits/12)

exten = 12,2,Dial(SIP/9901)

exten = i,1,Playback(pbx-invalid)

exten = i,2,Goto(10086,1)

exten = t,1,Playback(vm-goodbye)

exten = t,2,Hangup()

方法二:

這種方法的特點是使用WaitExten()等待使用者輸入。

[demotest2]

exten = 10086,1,Playback(vm-enter-num-to-call)

exten = 10086,n,WaitExten()

exten = 1,1,Playback(digits/1)

exten = 1,2,Goto(demotest2,10086,1):

exten = 10,1,Playback(digits/10)

exten = 10,2,Goto(demotest1,10086,1)

exten = 11,1,Playback(digits/11)

exten = 11,2,Goto(10086,1)

exten = 12,1,Playback(digits/12)

exten = 12,2,Dial(SIP/9901)

exten = i,1,Playback(pbx-invalid)

exten = i,2,Goto(10086,1)

exten = t,1,Playback(vm-goodbye)

exten = t,2,Hangup()

方法三:

這種方法是最簡單的,代碼最少。read是一個相當重要的應用,很多時候都會用到它。

[demotest2]

;exten => 10086,1,Read(digit,vm-enter-num-to-call,11,,3,5)

;exten = _X.,1,Playback(digits/${EXTEN})

;exten => 10086,n,Dial(SIP/${digit})

;exten => 10086,n,NoOp("===${HANGUPCAUSE}===")

;exten => 10086,n,GotoIf($[${HANGUPCAUSE}=20]?1)

;exten => 10086,n,Hangup()

繼續閱讀