Asterisk 拨号计划上下文和标签说明

Asterisk 拨号计划上下文和标签说明

过去一周我一直在学习 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)

希望对您有所帮助!祝您编码愉快!

相关内容