Создание простых приложений на базе ARI
Мы переходим от теории к практике управления Asterisk через программный код. На предыдущем этапе мы разобрали, что ARI (Asterisk REST Interface) — это инструмент для создания внешних приложений, которые управляют медиапотоками напрямую.
Теперь мы научимся создавать ARI-приложение. Это внешний сервис, который взаимодействует с Asterisk через REST-запросы и WebSocket-события. Чтобы Asterisk передал управление вашему коду, используется приложение диалплана Stasis().
Как захватить вызов: приложение Stasis
Обычно Asterisk обрабатывает вызов по правилам диалплана. Чтобы перехватить управление, нужно отправить канал в приложение Stasis. Пока канал находится внутри него, Asterisk «замирает» и ждет команд от вашего внешнего кода.
Посмотрите на Схему 1, которая описывает взаимодействие между компонентами при обработке вызова.
Пример диалплана в extensions_custom.conf. Отправляем вызов в приложение с именем my-cool-app:
[from-internal-custom]
exten => 700,1,NoOp(Передача вызова в ARI)
same => n,Stasis(my-cool-app)
same => n,Hangup()Структура ARI-приложения
Современное ARI-приложение — это асинхронный сервис. Мы разберем пример на Python, но логика одинакова для Node.js или Go.
Работа приложения делится на три этапа:
- Подключение: установка WebSocket-соединения для получения событий от Asterisk.
- Обработка событий: реакция на событие
StasisStart(появление нового канала). - Управляющие REST-запросы к ARI: отправка команд (ответить, проиграть звук, создать мост).
Каркас приложения: отвечает на звонок и проигрывает приветствие.
import asyncio
import aiohttp
ARI_URL = "http://localhost:8088/ari"
AUTH = ("admin", "password") # Данные из ari.conf
async def on_start(event, channel_id):
async with aiohttp.ClientSession(auth=aiohttp.BasicAuth(*AUTH)) as session:
# 1. Ответ на канал ARI
await session.post(f"{ARI_URL}/channels/{channel_id}/answer")
# 2. Воспроизведение аудио
playback_data = {"media": "sound:hello-world"}
await session.post(f"{ARI_URL}/channels/{channel_id}/play", json=playback_data)
await asyncio.sleep(3)
# 3. Завершение вызова
await session.delete(f"{ARI_URL}/channels/{channel_id}")Объединение абонентов через мосты
В ARI вы управляете медиапотоками вручную через мост ARI (Bridge). Если в диалплане приложение Dial() создает мост автоматически, то в ARI вы сами создаете этот «контейнер» и добавляете в него участников.
Чаще всего используется тип моста mixing — он смешивает аудио всех участников. Это позволяет создавать конференции или обычные звонки «точка-точка».
Алгоритм соединения двух абонентов:
- Создать мост ARI через
POST /bridges. - Вызвать второго абонента через
POST /channels/create. - Добавить оба канала в мост через
POST /bridges/{id}/addChannel.
В отличие от AMI, здесь вы контролируете каждый шаг. Можно в любой момент вынуть одного абонента из моста, проиграть ему сообщение и вернуть обратно, не прерывая связь для остальных.
Диагностика и отладка
ARI работает поверх HTTP и WebSocket, поэтому его легко отлаживать штатными средствами Asterisk.
Практическое задание:
- Создайте пользователя в
ari.confс правами на чтение и запись. - Настройте экстеншен, направляющий вызов в
Stasis(test-app). - Совершите звонок и, узнав
channel_idиз консоли Asterisk, попробуйте вручную ответить на вызов черезcurlили Postman, отправив запросPOST /channels/{channel_id}/answer.
Мы научились захватывать вызов и управлять медиапотоками. Это фундамент для создания сложных систем. В следующей теме разберем, как интегрировать эти возможности с CRM и бизнес-логикой вашей компании.
Понравился урок?
Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей
Продолжить в Telegram