我正在制作一个Web应用程序,它应该能够监视Asterisk服务器上的调用。我可以在URL ws://(host):8088/ari/events?app=dialer
上使用Javascript WebSocket连接到ARI,它可以工作。问题是我只从通过 ARI 进行的调用中获取事件。从其他客户端(如 Zoiper)发出的调用未注册。另一方面,Asterisk有AJAM,它对http://(host):8088/rawman?action=waitevent
使用长轮询,并记录来自所有客户端(ARI,Zoiper等)的呼叫,但只有谁在呼叫(呼叫者),而不是谁(被调用者)。
所以,我的问题是,我怎样才能获得实时呼叫事件,显示谁在呼叫谁,来自所有客户端,(最好)使用 WebSockets。谢谢。
ARI 对事件使用基于订阅的模型。引用维基上的文档:
默认情况下,Asterisk中的资源不会将有关自身的事件发送到连接的ARI应用程序。为了获取有关资源的事件,必须发生以下三种情况之一:
- 该资源必须是输入到"静止"拨号计划应用程序中的通道。在这种情况下,将隐式创建订阅。这 当通道离开 停滞拨号计划应用程序。
- 当通道位于 Stasis 拨号计划应用程序中时,该通道可能会与其他资源(如网桥)交互。虽然通道 与资源交互,订阅该资源。 当 Stasis 拨号计划应用程序中没有更多通道正在交互时 使用资源时,将销毁隐式订阅。
- 在任何时候,ARI应用程序都可以通过应用程序操作订阅Asterisk中的资源。虽然那 资源存在,ARI 应用程序拥有订阅。
因此,您通过ARI WebSocket获取有关通道的事件的原因是因为它进入了Stasis拨号计划应用程序。然而,这并不是获取事件的唯一方法。
如果您对来自其他事件源的事件感兴趣,可以使用应用程序资源订阅这些资源。例如,如果我想接收与 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
ws://(host):8088/ari/events?app=dialer&subscibeAll=true添加全部订阅=真 做你想要的 =)
可能会帮助某人:
订阅通道、网桥和端点上的所有事件
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
为了更清楚地了解 Matt Jordan 已经提供的内容,这里有一个他建议的 ari-py 示例:
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