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