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