Добрый день!
Поделюсь опытом настройки веб приложения с использованием апи asterisk.
Что такое asterisk - ссылка
Своими словами, астериск - это компьютерная технология для управления аудио/видео звонками, сообщениями, факсами и тд и тп., использует широкий спектр протоколов с помощью которых возможно организовать взаимодействие сетей, получение и обработку инфы.
Дока для подключения к ARI - ссылка
Для запуска веб сервиса с астериск использовал nestjs
Исходный код раскрыть не могу, но позже, по возможности, сделаю упрощенный сервис для наглядности.
По упрощенной схеме сервис работает следующим образом:
- Запускается фреймворк nestjs с предустановленными конфигами
- Запускается модуль с рест астериск подключается к сокету через написанный хелпер сервис который поддерживает соединение по сокету
Базовый урл подключения к сокету описан в доках, ссылка выше.
Выглядит следующим образом:
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. ( в приходящих данных события можно получить нажатые кнопки во время звонка )
На этом, с настройкой начальных конфигов описал все что хотелось бы отметить. В частном случае такой настройки хватает чтобы получить все необходимое в событиях, и конечно же можно прописать доп конфиги, но все зависит от требований к фиче.