Создание простых приложений на базе 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.

Работа приложения делится на три этапа:

  1. Подключение: установка WebSocket-соединения для получения событий от Asterisk.
  2. Обработка событий: реакция на событие StasisStart (появление нового канала).
  3. Управляющие 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 — он смешивает аудио всех участников. Это позволяет создавать конференции или обычные звонки «точка-точка».

Алгоритм соединения двух абонентов:

  1. Создать мост ARI через POST /bridges.
  2. Вызвать второго абонента через POST /channels/create.
  3. Добавить оба канала в мост через POST /bridges/{id}/addChannel.

В отличие от AMI, здесь вы контролируете каждый шаг. Можно в любой момент вынуть одного абонента из моста, проиграть ему сообщение и вернуть обратно, не прерывая связь для остальных.

Диагностика и отладка

ARI работает поверх HTTP и WebSocket, поэтому его легко отлаживать штатными средствами Asterisk.

Практическое задание:

  1. Создайте пользователя в ari.conf с правами на чтение и запись.
  2. Настройте экстеншен, направляющий вызов в Stasis(test-app).
  3. Совершите звонок и, узнав channel_id из консоли Asterisk, попробуйте вручную ответить на вызов через curl или Postman, отправив запрос POST /channels/{channel_id}/answer.

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

Понравился урок?

Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей

Продолжить в Telegram