您的位置:首页 > 其它

asterisk拨号方案设计

2016-04-13 13:39 316 查看
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: