Как получить все события номеронабирателя от Asterisk REST API (ARI)?
Я делаю веб-приложение, которое должно отслеживать звонки на моем сервере Asterisk. Я могу подключиться к ARI с Javascript WebSocket по URL ws://(host):8088/ari/events?app=dialer
и это работает. Проблема в том, что я получаю события только от звонков, сделанных через ARI. Звонки от других клиентов, таких как Zoiper, не регистрируются. С другой стороны, у Asterisk есть AJAM, который использует длинные опросы http://(host):8088/rawman?action=waitevent
и он регистрирует звонки от всех клиентов (ARI, Zoiper и др.), но есть только информация, кто звонит (звонящий), а не кто (звонящий).
Итак, мой вопрос, как я могу получить события вызовов в реальном времени, которые показывают, кто кому звонит, от всех клиентов (предпочтительно) с WebSockets. Благодарю.
3 ответа
ARI использует модель на основе подписки для событий. Цитирование из документации на вики:
Ресурсы в Asterisk по умолчанию не отправляют события о себе в подключенное приложение ARI. Чтобы получить события о ресурсах, должна произойти одна из трех вещей:
- Ресурс должен быть каналом, который введен в приложение диалплана Stasis. В этом случае неявно создается подписка. Подписка неявно уничтожается, когда канал покидает приложение диалплана Stasis.
- Пока канал находится в приложении набора номеров Stasis, канал может взаимодействовать с другими ресурсами, такими как мост. Пока каналы взаимодействуют с ресурсом, на него делается подписка. Когда больше каналов в приложении диалплана Stasis не взаимодействуют с ресурсом, неявная подписка уничтожается.
- В любое время приложение ARI может подписаться на ресурс в Asterisk посредством операций приложения. Пока этот ресурс существует, приложению ARI принадлежит подписка.
Итак, причина, по которой вы получаете события о канале через ARI WebSocket, заключается в том, что он вошел в приложение диалплана Stasis. Это, однако, не единственный способ получить события.
Если вас интересуют события из других источников событий, вы можете подписаться на эти ресурсы, используя ресурс приложений. Например, если бы я хотел получить все события, относящиеся к конечной точке PJSIP "Алиса", я бы подписался, используя следующее:
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://(хост):8088/ari/events?app=dialer&subscibeAll=true Добавление SubscribeAll=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
Для большей ясности относительно того, что Мэтт Джордан уже предоставил, вот пример того, что он предлагает с 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