【问题标题】:How to get all dialer events from Asterisk REST API (ARI)?如何从 Asterisk REST API (ARI) 获取所有拨号器事件?
【发布时间】:2015-01-21 10:12:36
【问题描述】:

我正在制作一个 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 从所有客户端(最好)获取实时呼叫事件,以显示谁在呼叫谁。谢谢。

【问题讨论】:

    标签: asterisk voip asteriskami


    【解决方案1】:

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

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

    1. 资源必须是进入 Stasis 拨号方案应用程序的通道。在这种情况下,订阅是隐式创建的。这 当频道离开时订阅被隐式销毁 Stasis 拨号方案应用程序。
    2. 当通道在 Stasis 拨号方案应用程序中时,通道可能与其他资源交互 - 例如网桥。而频道 与资源交互,订阅该资源。 当 Stasis 拨号方案应用程序中没有更多通道正在交互时 使用资源,隐式订阅被销毁。
    3. ARI 应用程序可以随时通过应用程序操作订阅 Asterisk 中的资源。虽然那 资源存在,则 ARI 应用程序拥有订阅。

    因此,您通过 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
    

    【讨论】:

    • 我订阅了 PJSIP,现在它出现在该应用程序的“endpoint_ids”下。 “请注意,订阅端点隐式订阅所有频道”,似乎没有收到与频道相关的“ChannelDtmfReceived”。
    【解决方案2】:

    ws://(主机):8088/ari/events?app=dialer&subscibeAll=true 添加 SubscribeAll=true 做你想要的 =)

    【讨论】:

    • 这是一个正确的答案,否则你会被重复。
    【解决方案3】:

    可能会帮助某人:

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

    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
    

    【讨论】:

      【解决方案4】:

      为了更清楚地了解 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
      

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多