过去一周我一直在学习 Asterisk 拨号方案。我写下了一个简单的 IVR 系统,它有两级菜单和一个退出选项。我使用了网络上不同教程中的概念。有人能确认下面的 IVR 是否正确吗?正确的意思是,如果使用下面的方法,它会起作用。我知道 IVR 还没有做太多事情。但我只是想澄清我的理解。
[incoming]
exten => 123,1,Answer()
same => n(menuprompt),Background(main-menu)
exten => 1,1,Playback(digits/1)
same => n,Goto(incoming,menuprompt,123)
exten => 2,1,Playback(digits/2)
same => n,Goto(incoming,menuprompt,123)
exten => 9,1,Hangup()
[main-menu]
exten => n(menuprompt),Background(main-menu)
exten => 3,1,Playback(digits/3)
same => n,Goto(main-menu,menuprompt,n)
exten => 4,1,Playback(digits/4)
same => n,Goto(main-menu,menuprompt,n)
exten => 9,1,Hangup()
答案1
转到以下格式
转到(上下文、扩展、优先级)
标签与优先级相同。因此您需要更正您的拨号计划以执行类似操作
n,Goto(来电,123,菜单提示)
答案2
欢迎来到 Asterisk 拨号方案编程的世界。我一眼就能发现几个问题,所以让我先做个简单的介绍...
- 所有上下文都需要有一个“exten”声明来处理
- 每个上下文可以且很可能有许多扩展条目。每个扩展都需要以“exten”声明开头。
- “相同”条目表示“使用上面的‘exten => xxx’”
- “n”优先级表示下一个数字;将上述优先级增加 1,然后使用它。
因此,让我们使用一个例子:
[context]
exten => 111,1,Noop(Start here)
exten => 111,2,Answer()
exten => 111,2,Goto(another_context,exten,priority)
为了简化,我们可以使用“same”和“n”:
[context]
exten => 111,1,Noop(Start here)
same => n,Answer()
same => n,Goto(another_context,exten,priority)
第二个示例与第一个示例完全相同,但允许您在拨号方案中插入新条目,并重新编号。您还可以在第一行更改分机号,而无需编辑每一行。
首先从您的示例开始,我看到您从 [主菜单] 开始:
exten => n(menuprompt),Background(main-menu)
此处没有要拨打的分机号。您可以按如下方式添加分机号:
exten => 5432,n(menuprompt),Background(main-menu)
然而,这仍然是一个问题,因为“n”表示此上下文中的下一个优先级,并且没有在其上方使用任何内容……因此 n 未定义。您必须在上下文中以定义的数字开始每个扩展,例如 1:
exten => 5432,1(menuprompt),Background(main-menu)
现在,您可能不需要为该条目分配“扩展名”,因此您可以使用以下内容:
exten => s,1(menuprompt),Background(main-menu)
现在,播放完上述声音后,Asterisk 会查找“s”扩展中的下一个优先级。因此,在本例中为“main-menu,s,2”。由于那里没有条目,因此由 Asterisk 选择其默认行为,这被视为安全风险。例如,添加以下内容:
same => n,WaitExten(10)
same => n,Goto(menuprompt)
这将等待 10 秒钟,让呼叫者输入在此上下文中可识别的内容。请注意,我们仅向 Goto 提供了“menuprompt”,并且它将默认仅在当前上下文中查找。这将无限循环。理想情况下,您需要计算失败的输入次数,并在等待 X 次且未收到任何结果后执行其他操作。另外,请注意,如果呼叫者输入 5,则无法识别,并且呼叫者将被发送到“i”分机,表示“无效”。因此,添加以下内容:
exten => i,1,Playback(invalid-message)
same => n,Goto(menuprompt)
同样的事情也适用于此......理想情况下,您应该检查尝试的次数,如果他们继续做出无效选择,则应采取不同的措施。
最后,在这种情况下,您的 3 和 4 选项将在 Goto 上失败。更改为上面的简化版本。
现在,对于您的“传入”上下文。这看起来更正确。拨入 123 的电话将得到应答并播放声音文件。选择 1 和 2 将触发,但在播放后将失败。您必须将 Goto 调用更改为:
Goto(incoming,123,menuprompt)
这就是上下文、范围、优先级。通过更正,如果他们在文件播放时选择 1 或 2,它将播放相应的声音文件,然后再次返回提示。9 当然会挂断呼叫者的电话。
现在,让我们以你的例子为例,并稍微简化一下:
[incoming]
exten => 123,1,Answer()
same => n(menuprompt),Background(main-menu)
exten => 1,1,Playback(digits/1)
same => n,Goto(123,menuprompt)
我的下一个问题是,无法从“传入”转到“主菜单”。作为示例,我们可以添加以下内容:
exten => 0,1,Goto(main-menu,s,1)
现在,当呼叫者收到第一个菜单时,他们可以按 0 进入第二个菜单。我建议将“背景”条目更改为新内容,以免造成混淆。它应该是声音文件的名称,虽然它可以是它本身的名称,但它是“主菜单”没有任何意义。也许可以使用“主菜单声音文件”。
这是我的修正和添加的示例文件。它仍需要进一步完善,但需要一步一步来,尤其是当您学习语法时。
[incoming]
exten => 123,1,Answer()
same => n(menuprompt),Background(main-menu-sound-file)
same => n,WaitExten(10)
same => n,Goto(menuprompt)
exten => 1,1,Playback(digits/1)
same => n,Goto(menuprompt,
exten => 2,1,Playback(digits/2)
same => n,Goto(menuprompt)
exten => 9,1,Hangup()
exten => 0,1,Goto(main-menu,s,1)
exten => i,1,Playback(invalid-message)
same => n,Goto(menuprompt)
[main-menu]
exten => s,1(menuprompt),Background(main-menu-sound-file)
same => n,WaitExten(10)
same => n,Goto(menuprompt)
exten => 3,1,Playback(digits/3)
same => n,Goto(main-menu,menuprompt,n)
exten => 4,1,Playback(digits/4)
same => n,Goto(main-menu,menuprompt,n)
exten => 9,1,Hangup()
exten => i,1,Playback(invalid-message)
same => n,Goto(menuprompt)
希望对您有所帮助!祝您编码愉快!