Найти тему

Asterisk подключение ARI для веб приложения. REST interface

Добрый день!

Поделюсь опытом настройки веб приложения с использованием апи asterisk.
Что такое asterisk -
ссылка

Своими словами, астериск - это компьютерная технология для управления аудио/видео звонками, сообщениями, факсами и тд и тп., использует широкий спектр протоколов с помощью которых возможно организовать взаимодействие сетей, получение и обработку инфы.

Дока для подключения к ARI - ссылка
Для запуска веб сервиса с астериск использовал
nestjs
Исходный код раскрыть не могу, но позже, по возможности, сделаю упрощенный сервис для наглядности.

По упрощенной схеме сервис работает следующим образом:

  1. Запускается фреймворк nestjs с предустановленными конфигами
  2. Запускается модуль с рест астериск подключается к сокету через написанный хелпер сервис который поддерживает соединение по сокету

Базовый урл подключения к сокету описан в доках, ссылка выше.
Выглядит следующим образом:
ws://localhost:8088/ari/events?api_key=<username>:<password>&app=<app_name>

username - имя пользователя который можно создать в freepbx или задать конфиги для ari.conf как тут
password - заданный пароль для созданного пользователя
app_name - имя приложения который прописан в файле extensions.conf в исходниках приложения астериск

Код для приложения в extensions.conf можно брать как в доках:

[default]
exten => 1000,1,NoOp()
same => n,Answer()
same => n,Stasis( имя приложения, [ доп аргументы (необязательно) ] )
same => n,Hangup()

После успешного старта, приложение будет слушать все события по сокету.
Распарсив события по типу (Object.groupBy) и отделяя полученные события по id можно получить полную инфу о звонке и двигаться дальше в зависимости от требуемой логики.

Пример с наименованием событий которые будут приходить по сокету:

  • ChannelCreated - создался канал ( в зависимости от контекста который создает канал можно найти входящий звонок и сохранить id канала и следить за дальнейшими изменениями звонка. Если не понятно пишите в коменты, опишу подробнее )
  • ChannelDestroyed - удаление канала
  • ChannelConnectedLine - установка соединения, например приняли входящий звонок
  • ChannelDtmfReceived - получение DTMF событий, например если входящий звонок нажал кнопку во время звонка, соответственно если при звонке канал будет подписан на dtmf. ( в приходящих данных события можно получить нажатые кнопки во время звонка )

На этом, с настройкой начальных конфигов описал все что хотелось бы отметить. В частном случае такой настройки хватает чтобы получить все необходимое в событиях, и конечно же можно прописать доп конфиги, но все зависит от требований к фиче.