Asterisk 中 background 使用要注意的地方

exten => s,1,background(voice_file)

exten =>1,1,playback(choice1)

exten => 1,2,hungup()

exten => i,1,playback(wrongchoice)

exten =>1,2,goto(s,1)

exten => t,1,play(timeout)

exten =>t,2,hungup()

一直以来都认为,当没有按键的时候,会自动进入t,谁知道,原来不是这样的。

background之后,会自动进入s,2 步,但是由于s,2没有了,所以就自动挂掉了。

查了资料才知道,要执行t,必须得先在background之后设置超时时间,可以在这里改成:

exten => s,1,background(voice_file)

exten => s,2,set(TIME(response)=10)  //在这里设定为十秒

exten =>s,3,WaitExten(2)     //在这里再跳回2再次设置,如果不这样的话,就自动挂掉了。

                因为还没有到时间去执行t.

exten =>1,1,playback(choice1)

exten => 1,2,hungup()

exten => i,1,playback(wrongchoice)

exten =>1,2,goto(s,1)

exten => t,1,play(timeout)

exten =>t,2,hungup()

关于BackGround的在宏内的使用时,要特别注意:

     如下方案:

     [default]

     exten => s,1,Macro(exeBG)

     exten => 1,1,Noop(Press 1)

     exten => 2,1,Noop(Press 2)

     [macro-exeBG]

     exten => s,1,BackGround(file1)

     exten => s,n,WaitExten(10)

     exten => 1,1,Noop(macro 1)

     exten => 2,1,Noop(macro 2)

     如上方案,如果用户响应的按键为1时,是不会转到[macro-exeBG]中的1那里的,而是会转到[default]中的1,即打印出Press 1.

     如果希望转到[macro-exeGB],必须在BackGround中加入一个参数,参数值就是整个宏的名称,即:

  [macro-exeBG]

     exten => s,1,BackGround(file1,,,macro-exeGB)

     exten => s,n,WaitExten(10)

     exten => 1,1,Noop(macro 1)

     exten => 2,1,Noop(macro 2)

     这样的话,才会转到宏内对应的响应的按键那里。

  不过,就我而言,我比较喜欢用Read来响应用户的按键,可以为响应按键单独写一个宏,   如下:

   [macro-FuncPressDigit]      ;播放提示音,并输入一个数字键
;入口: ${ARG1},即{IR1}等待时长
;       ${ARG2},即{SR1}要播报的文件
;出口: ${IR1} ,10输入了*号,11超时没输入

exten => s,1,Read(IR1,${ARG2},1,,,${ARG1})
exten => s,n,GoToIf($[${LEN(${IR1})}=0]?10)        ;表示超时没有输入
exten => s,n,GoToIf($["${IR1}"="*"]?20)                ;输入了*号
exten => s,n,Noop(${IR1})

exten => s,10,Set(IR1=11)                    ;超时
exten => s,20,Set(IR1=10)                    ;输入了*号时,设置为10

猜你喜欢

转载自hwzyyx.iteye.com/blog/764012