使用ARI

时间:2015-12-31 20:42:19

标签: javascript node.js asterisk

我正在尝试使用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。

├─┬ ari-client@0.5.0
│ ├── backoff-func@0.1.2
│ ├── bluebird@2.9.34
│ ├── node-uuid@1.4.1
│ ├─┬ swagger-client@2.0.26
│ │ ├── btoa@1.1.1
│ │ └─┬ shred@0.8.10
│ │   ├── ax@0.1.8
│ │   ├── cookiejar@1.3.1
│ │   ├── iconv-lite@0.2.11
│ │   └── sprintf@0.1.1
│ ├── underscore@1.6.0
│ └─┬ ws@0.4.31
│   ├── commander@0.6.1
│   ├── nan@0.3.2
│   ├── options@0.0.5
│   └── tinycolor@0.0.1
├── bluebird@3.1.1
└─┬ util@0.10.3
  └── inherits@2.0.1

1 个答案:

答案 0 :(得分:2)

  

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

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

  

默认情况下,Asterisk中的资源不会将自身事件发送到连接的ARI应用程序。为了获得有关资源的事件,必须发生以下三种情况之一:

     
      
  1. 资源必须是进入Stasis dialplan应用程序的频道。在这种情况下隐式创建订阅。当频道离开Stasis dialplan应用程序时,隐式销毁订阅。

  2.   
  3. 当某个频道位于Stasis拨号方案应用程序中时,该频道可能会与其他资源(例如网桥)进行交互。当渠道与资源交互时,会对该资源进行订阅。当Stasis拨号方案应用程序中没有其他通道与资源交互时,隐式订阅将被销毁。

  4.   
  5. 任何时候,ARI应用程序都可以通过应用程序操作订阅Asterisk中的资源。当该资源存在时,ARI应用程序拥有该订阅。

  6.   

如果您希望自动为Asterisk中的资源获取事件,那些频道正在bridge-watcher应用程序之外使用,除非您执行以下两项操作之一,否则您将无法获取这些资源:

  1. 使用applications resource明确订阅资源。这适用于相对静态和/或长期存在的资源,例如端点,静态网桥(例如用于会议的网桥),邮箱和设备状态。它不适用于暂时性资源。

  2. 在Asterisk 13.6.0及更高版本中,您现在可以在连接WebSocket时订阅所有事件源。在node-ari-client中,您将执行以下操作:

    ari.start(bridge-watcher,true);

  3. 但是,您应该注意,即使您订阅了所有资源,也不会明确拥有它们。你只需要自动观看它们。所有权的概念在ARI中非常重要,特别是因为它涉及到您可以和不能对渠道做什么,以及什么时候。我链接的维基页面提供了一些合理的文档,说明了它的工作原理。