我正在尝试使用Asterisk ARI来监视与桥梁相关的事件。我使用的是Asterisk 13.6.0。
具体来说,我想知道何时创建或销毁了一个桥接器,以及用户(通道)何时加入或离开了该桥接器。在我的服务器上,当有人拨入时会动态创建网桥,当最后一个成员离开网桥时会自动销毁。
使用Asterisk项目中的node-ari客户端库,并遵循他们的一些示例代码,这就是我迄今为止所拥有的。
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
具体来说,我想知道何时创建了一座桥梁,或者当用户(频道)加入或离开桥接器时。在…上在我的服务器上,当有人拨入时会动态创建网桥,并且当最后一个成员离开舰桥时自动销毁。
请记住:ARI的主要目的是构建您自己的拨号计划应用程序,而不是监控整个Asterisk。因此,默认情况下,您的外部应用程序不会订阅Asterisk中的资源。正如Stasis应用程序中的通道部分所解释的:
默认情况下,Asterisk中的资源不会将有关其自身的事件发送到连接的ARI应用程序。为了获取有关资源的事件,必须发生以下三件事之一:
该资源必须是进入Stasis拨号计划应用程序的频道。在这种情况下,订阅是隐式创建的。当频道离开Stasis拨号计划应用程序时,订阅将被隐式销毁。
当一个频道处于Stasis拨号计划应用程序中时,该频道可能会与其他资源交互,例如桥接。当通道与资源交互时,会对该资源进行订阅。当Stasis拨号计划应用程序中不再有通道与资源交互时,隐式订阅将被销毁。
ARI应用程序可以随时通过应用程序操作订阅Asterisk中的资源。当该资源存在时,ARI应用程序拥有订阅。
如果您希望自动获取Asterisk中频道在bridge-watcher
应用程序之外使用的资源的事件,那么除非您做以下两件事之一,否则您将无法获得这些事件:
-
使用应用程序资源显式订阅资源。这适用于相对静态和/或寿命较长的资源,如端点、静态桥接器(如用于会议的桥接器)、邮箱和设备状态。它对暂时性资源不起作用。
-
在Asterisk 13.6.0及更高版本中,您现在可以在连接WebSocket时订阅所有事件源。在
node-ari-client
中,您将执行以下操作:ari.start(桥梁观察者,true);
但是,您应该注意,即使您订阅了所有资源,也不会显式地拥有。你只能自动观看它们。所有权的概念在ARI中非常重要,尤其是当它涉及到你可以和不能对渠道做什么以及何时做时。我链接的wiki页面提供了一些合理的文档来说明它是如何工作的。