1

以下问题与 asterisk-java API 有关。

在我们的应用程序中,我们希望能够在很长一段时间内向特定的星号通道发送命令。

这是一个我们想要操纵的长期电话(可能持续几个小时)。

接近它的一种方法是AGI从星号发出调用,这将创建一个AgiScript保存AgiChannel我们将用来发送命令的实例的实例。

我知道一旦AgiScript#serve()方法完成,通道就会关闭。

作为一种解决方法,我们暂停serve()线程以在需要时保持AgiChannel打开状态。

问题

我们是否应该注意最终会自动关闭通道的任何超时?

我们是否需要至少NoOp定期发送以保持打开状态?

总的来说,这看起来不是一个好的解决方案,所以我想问一下我们是否还有其他选择来实现我们的目标?

4

3 回答 3

2

根据您的操作,您最好使用 AMI(星号管理器界面)。

如果您的电话被桥接(与某人交谈),那么您实际上无法控制。在 AGI 中,您会告诉它调用 Dial,并且该线程将被阻塞,直到 Dial 返回,因此该线程实际上没有办法发送新命令。即使 AsteriskJava 没有被阻止,asterisk 本身也不会期待新的命令。

在 AMI 中,您可以使用重定向操作来解决此问题并将通道重定向到远离网桥的位置。或者,如果您只需要获取一些通道变量,您可以从 AMI 异步执行此操作。

甚至可以通过 AMI 发出 AGI 命令。

是一些 AMI 命令的列表。您可以使用“管理器显示命令”从星号内部查看所有这些。

您可以使用 ORIGINATE 创建呼叫,然后使用 ChannelRedirect 将其重定向到拨号方案中的各种分机。

如果您在异步模式下发起或 ChannelRedirect 对 AGI 应用程序的调用,则可以使用 AMI 命令“AGI”通过 AMI 向其发出 AGI 命令。

于 2014-01-31T06:30:51.310 回答
0

您应该使用默认线程类启动新线程,并在挂断后移至处理。

于 2014-02-01T12:20:39.877 回答
0

您可以控制与 async agi 的所有交互,它是完全异步的,您可以根据需要与调用进行交互。您可以将所有事件都返回给您,首先要记住您可以为您的用例建模对象并实现标准 agi 可能具有的任何行为 + 您还可以获得 AMI 功能。

于 2014-11-20T00:14:25.680 回答