如何正确使用星号包含语句?

How to use asterisk Include statement the right way?

我是 asterisk 的新手,我对使用 include 语句有疑问。

我有一个来自 FreePBX 的名为 "app-calltrace-perform" 的上下文,当人们按 *69 跟踪他们的呼叫时使用。

[app-calltrace-perform]
include => app-calltrace-perform-custom
exten => s,1,Answer
...
exten => t,n,Macro(hangupcall,)

写在extensions_additional.conf中的"app-calltrace-perform"当用户在网络图形用户界面。所以我必须在另一个名为 extensions_custom.conf
[=18 的文件上编写自己的上下文 "app-calltrace-perform-custom" =]

[app-calltrace-perform-custom]
exten => s,1,Answer()
same => n,VERBOSE("Something here")
same => n,Playback(hello-world)
same => n,Hangup()

注意extensions_additional.confextensions_custom.conf 已经包含在 extensions.conf

然后我 dialplan reload 再试一次,但是拨号规则根本不播放我的上下文(不冗长,不播放 hello-world)。

我在 https://wiki.asterisk.org/wiki/display/AST/Include+Statements+Basics

中找到了一些有用的东西

Asterisk will always try to find a matching extension in the current context first, and only follow the include statement to a new context if there isn't anything that matches in the current context.

所以现在我不知道如何将我的自定义上下文用于此类内容。抱歉,这是一个愚蠢的问题,但如果您有任何想法,请指导我。

编辑
这是 app-calltrace-perform

调用的地方

[app-calltrace] include => app-calltrace-custom exten => *69,1,Goto(app-calltrace-perform,s,1)

现在我正在使用在上下文 app-calltrace-custom 中定义的另一个扩展 (*12345),它运行良好但是是硬编码的,因此不能被 Web Gui 修改

结束编辑

提前致谢
来党

为了让拨号方案知道使用它,您需要在包含的上下文中有一些与众不同的东西。由于您在两者中都使用了 s 扩展名,因此它首先在当前上下文中使用匹配的扩展名。正如您在文档中找到的那样。

s 分机是 "start" 分机,在没有已知的已拨分机时使用。

首先,仔细检查您的文件包含在 extensions.conf

[globals] 上下文中
[globals]
#include extensions_custom.conf

然后,像您所做的那样包括:

[app-calltrace-perform]
include => app-calltrace-perform-custom
exten =>   s,1,Answer
same =>      n,Noop(Testing 1234)
same =>      n,Hangup()

但是,您需要在包含的上下文中有所区别。例如:

[app-calltrace-perform-custom]
exten => *69,1,Answer()
same =>      n,Playback(hello-world)
same =>      n,Hangup()

因此,如果您的设备使用 [app-calltrace-perform] 并且他们拨打 *69,他们将使用 [app-calltrace-perform-custom] 分机号。

此外,用 Hangup() 结束每个包含的上下文被认为是一种很好的做法(干得好)。以防止可能的错误导致盗用话费。只是想为将来的 Whosebugers 注意这一点。

A​​sterisk 拨号规则匹配是这样工作的

[context1]
exten => 1,1,Noop(1)
include =>context2
include =>context3
exten => i,1,Noop(invalid extension)
[context2]
exten => 1,1,Noop(2)
exten => 2,1,Noop(3)
[context3]
exten => 1,1,Noop(4)
exten => 2,1,Noop(5)
exten => _X,1,Noop(other)

假设您调用 context1

当调用 1 时将从上下文 1 中选择命令,因为它存在于上下文中。如果您使用通配符也是如此。

调用2时会从context2中选择2,首先included context 当调用任何其他号码(例如 3)时,将在上下文 3 中选择 "other"(因为它没有出现在上下文中,也没有出现在之前包含的上下文中)

如果调用的 12 不存在于任何上下文中,将执行 "invalid" extension