我正在尝试使用Asterisk ARI来监视与桥相关的事件。我正在使用Asterisk 13.6.0。

具体来说,我想知道何时创建或销毁了桥梁,以及用户(渠道)何时加入或离开了桥梁。在我的服务器上,当有人拨入时动态创建网桥,并在最后一个成员离开网桥时自动销毁。

使用Asterisk项目中的node-ari-client库,并遵循他们的一些示例代码,这就是我到目前为止的内容。

var client = require("ari-client");
var util = require("util");

client.connect("http://localhost:8088", "username", "password")

.then(function (ari) {

    ari.once("StatisStart", channelJoined);

    function channelJoined (event, incoming) {

        incoming.on("BridgeCreated", function(event, bridge) {
            console.log(util.format("Bridge created: %s", bridge.id));
        });

        incoming.on("BridgeDestroyed", function(event, bridge) {
            console.log(util.format("Bridge destroyed: %s", bridge.id));
        });

        incoming.on("ChannelEnteredBridge", function(event, channel) {
            console.log(util.format("Bridge was joined by: %s", channel.id));
        });

        incoming.on("ChannelLeftBridge", function(event, channel) {
            console.log(util.format("Bridge was joined by: %s", channel.id));
        });
    }

    ari.start("bridge-watcher");
})

.done();


我希望当各种事件发生时,.on()处理程序将打印到控制台。但是,呼叫桥接器,离开桥接器,什么都不会打印到控制台。

如果重要的话,这是npm ls的输出,显示我正在使用的版本。节点是v0.10.36。

├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │   ├── [email protected]
│ │   ├── [email protected]
│ │   ├── [email protected]
│ │   └── [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│   ├── [email protected]
│   ├── [email protected]
│   ├── [email protected]
│   └── [email protected]
├── [email protected]
└─┬ [email protected]
  └── [email protected]

最佳答案

具体来说,我想知道何时创建桥或
  用户(频道)加入或离开网桥时被销毁。上
  在我的服务器上,当有人拨入时动态创建网桥,并且
  当最后一个成员离开桥时自动销毁。


请记住:ARI的主要目的是build your own dialplan applications,而不是监视整个星号。因此,默认情况下,您的外部应用程序未订阅Asterisk中的资源。如Channels in a Stasis Application部分所述:


  默认情况下,Asterisk中的资源不会将有关自身的事件发送到已连接的ARI应用程序。为了获得有关资源的事件,必须发生以下三种情况之一:
  
  
  资源必须是进入Stasis Dialplan应用程序的渠道。在这种情况下,将隐式创建一个预订。当通道离开Stasis Dialplan应用程序时,预订将被隐式破坏。
  当通道处于Stasis Dialplan应用程序中时,该通道可能会与其他资源(例如网桥)交互。当通道与资源交互时,将对该资源进行订阅。当Stasis Dialplan应用程序中没有更多通道与资源交互时,隐式订阅将被破坏。
  ARI应用程序可以随时通过应用程序操作来订阅Asterisk中的资源。当该资源存在时,ARI应用程序将拥有该订阅。
  


如果您希望自动获取Asterisk中通道在bridge-watcher应用程序之外使用的资源的事件,除非执行以下两项操作之一,否则您不会获得它们:


使用applications resource显式订阅资源。这对于相对静态和/或长期存在的资源(例如端点,静态网桥(例如用于会议的那些),邮箱和设备状态)有效。它不适用于暂时性资源。
在Asterisk 13.6.0和更高版本中,现在可以在连接WebSocket时订阅所有事件源。在node-ari-client中,您将执行以下操作:

ari.start(bridge-watcher,true);


但是,您应该注意,即使订阅了所有资源,也不会明确拥有它们。您只可以自动观看它们。所有权的概念在ARI中非常重要,尤其是与所有权有关,您可以对渠道做什么,何时不可以做什么。我链接的Wiki页面提供了一些合理的文档来说明其工作原理。

关于javascript - 使用ARI观察与桥梁有关的事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34551454/

10-11 04:27