如何从Asterisk REST API(ARI)获取所有拨号事件?

时间:2015-01-21 10:12:37

标签: asterisk voip asteriskami

我正在制作一个应该能够监控我的Asterisk服务器上的呼叫的Web应用程序。我可以使用URL ws://(host):8088/ari/events?app=dialer上的Javascript WebSocket连接到ARI,它可以正常工作。问题是我只从通过ARI进行的呼叫中获取事件。来自Zoiper等其他客户的电话未注册。另一方面,Asterisk有AJAM,它在http://(host):8088/rawman?action=waitevent上使用长轮询并且它注册来自所有客户端的呼叫(ARI,Zoiper等),但是只有正在呼叫的信息(来电者) ),而不是(被叫者)。

所以,我的问题是,如何从所有客户端(最好)使用WebSockets获取实时调用事件,以显示谁在调用谁。感谢。

4 个答案:

答案 0 :(得分:8)

ARI使用基于订阅的模型进行事件。引用wiki上的文档:

  

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

     
      
  1. 资源必须是进入Stasis dialplan应用程序的频道。在这种情况下隐式创建订阅。该   当频道离开时,隐式销毁订阅   Stasis dialplan应用程序。
  2.   
  3. 当频道位于Stasis拨号方案应用程序中时,该频道可能会与其他资源(例如网桥)进行交互。虽然渠道   与资源交互,对该资源进行订阅。   当Stasis拨号方案应用程序中没有其他通道进行交互时   使用该资源,隐式订阅将被销毁。
  4.   
  5. 任何时候,ARI应用程序都可以通过应用程序操作订阅Asterisk中的资源。那时候   资源存在,ARI应用程序拥有订阅。
  6.   

因此,您通过ARI WebSocket获取有关频道事件的原因是因为它进入了Stasis拨号方案应用程序。然而,这不是获取事件的唯一方法。

如果您对来自其他事件源的事件感兴趣,可以使用applications资源订阅这些资源。例如,如果我想收到与PJSIP端点“Alice”相关的所有事件,我会使用以下内容订阅:

POST https://localhost:8080/ari/applications/my_app/subscription?eventSource=endpoint:PJSIP%2FAlice

请注意,对端点的订阅会隐式地为您订阅为该端点创建的所有通道。如果您想订阅特定技术的所有端点,您还可以订阅资源本身:

POST https://localhost:8080/ari/applications/my_app/subscription?eventSource=endpoint:PJSIP

答案 1 :(得分:3)

WS://(主机):8088 / ARI /事件应用程式=拨号&安培; subscibeAll =真? 添加SubscribeAll = true可以使你想要的东西=)

答案 2 :(得分:1)

为了更清楚地了解Matt Jordan已经提供的内容,这里是一个用ari-py做他的建议的例子:

#!/usr/bin/env python

import ari
import logging

logging.basicConfig(level=logging.ERROR)
client = ari.connect('http://localhost:8088', 'username', 'password')
postRequest=client.applications.subscribe(applicationName=["NameOfAppThatWillReapThisEvent-ThisAppShouldBeRunning"], eventSource="endpoint:PJSIP/alice")

print postRequest

答案 3 :(得分:0)

可能会帮助某人:

订阅频道,网桥和端点上的所有事件

POST http://localhost:8088/ari/applications/appName/subscription?api_key=user:password&eventSource=channel:,bridge:,endpoint:

退订

DELETE http://localhost:8088/ari/applications/appName/subscription?api_key=user:password&eventSource=channel:__AST_CHANNEL_ALL_TOPIC,bridge:__AST_BRIDGE_ALL_TOPIC,endpoint:__AST_ENDPOINT_ALL_TOPIC