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()