我正在编写一个 IVR 菜单,我需要允许我的用户在通信期间随时按 0 退出。以下是我的做法:
exten => 0,1,Playback(good-bye)
exten => 0,2,Playback(beep)
exten => 0,3,Hangup
但是,这样做,当用户在播放某些文件或进行其他操作时按零时,他/她无法退出,就像他/她没有按零一样。我希望我足够清楚,并且您可以帮助我解决这个问题。干杯
对于 IVR,您希望使用 Background() 和/或 WaitExten() 而不是 Playback()。这是一个示例 IVR 拨号方案:
[ivr_main]
; answer and play announcement
exten => s,1,Set(TIMEOUT(response)=2)
exten => s,2,Set(TIMEOUT(digit)=2)
exten => s,3,BackGround(/your/audio/file/announcement)
exten => s,4,WaitExten(2)
exten => s,5,GoTo(s|3) ; careful of this loop here! should GoTo() somewhere else!
; handle key presses
exten => 0,1,Playback(good-bye)
exten => 0,2,Playback(beep)
exten => 0,3,Hangup()
exten => 1,1,NoOp(do this if user presses 1)
exten => 2,1,NoOp(do this if user presses 2)
exten => 3,1,NoOp(do this if user presses 3)
exten => 4,1,NoOp(do this if user presses 4)
exten => 5,1,NoOp(do this if user presses 5)
; handle invalid key presses
exten => i,1,Playback(pbx-invalid)
exten => i,2,GoTo(s|3)
; handle time out (user did not make a selection)
exten => t,1,GoTo(0|1) ; go to Hangup :-)
希望这可以帮助。
在 Asterisk CLI 中,为这些应用程序的手册执行“显示应用程序背景”和“显示应用程序 WaitExten”。
AFAIK,只有当您调用 Background 或 WaitExten 时,Asterisk 才能接听按键。因此,如果您正在运行一些 AGI,它必须调用这两个命令之一。
Asterisk 并不总是等待用户输入。仅在 Background、WaitExten、Read 命令期间。如果你使用 Playback(),Asterisk 在播放音频文件时会忽略任何 DTMF。
您可以用 Read() 替换 Playback,但您必须将读取超时设置为非常低的值,否则在您使用 Read() 播放的每个音频文件之后都会出现静音。如果您使用 Read() 那么您必须检查用户输入的值以检查退出,就像这样......
代替
exten => x,n,Playback(yourfile)
exten => x,n,somethingelse...
你需要
exten => x,n,Read(Exit,yourfile,1)
exten => x,n,GotoIf($["${Exit}" = "0"]?0,1)
exten => x,n,somethingelse...