Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
ARI_WEBSOCKET_DISCONNECTED IP-Телефония и СКУД

Управление вызовами через Asterisk REST Interface (ARI): настройка Stasis и WebSockets

Обновлено: 24.08.2026  ·  Официальная база знаний
  • Ошибка 401 Unauthorized / 403 Forbidden при отправке REST-запросов к /ari/channels.
  • WebSocket соединение для получения событий Stasis внезапно разрывается.
  • Вызовы зависают в бесконечном ожидании в приложении Stasis(my_app) без реакции бэкенда.
  • Утечки каналов и медиа-мостов (Bridges) при некорректном завершении сессии.

1. Конфигурация доступа к ARI в ari.conf

Файл /etc/asterisk/ari.conf:

[general]
enabled=yes
pretty=yes
allowed_origins=*

; Пользователь для внешнего бэкенд-сервиса
[ari_user]
type=user
read_only=no
password=SuperSecureAriPassword123
password_format=plain

2. Активация HTTP/WebSocket сервера в http.conf

Убедитесь, что в /etc/asterisk/http.conf включен сервер:

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088

3. Маршрутизация вызова в приложение Stasis (extensions.conf)

[from-internal]
exten => 8000,1,NoOp(Send call to Custom ARI Application)
 same => n,Answer()
 same => n,Stasis(smart_queue_app)
 same => n,Hangup()

4. Пример взаимодействия на Node.js (WebSocket Client)

const WebSocket = require('ws');
const axios = require('axios');

const ARI_URL = 'http://127.0.0.1:8088/ari';
const AUTH = { username: 'ari_user', password: 'SuperSecureAriPassword123' };

const ws = new WebSocket(`ws://127.0.0.1:8088/ari/events?api_key=ari_user:SuperSecureAriPassword123&app=smart_queue_app`);

ws.on('message', async (data) => {
    const event = JSON.parse(data);
    console.log('Received ARI Event:', event.type);

    if (event.type === 'StasisStart') {
        const channelId = event.channel.id;
        // Воспроизведение звука звонящему
        await axios.post(`${ARI_URL}/channels/${channelId}/play?media=sound:hello-world`, {}, { auth: AUTH });
    }
});

5. Проверка состояния ARI в CLI

asterisk -rx "ari show status"
asterisk -rx "ari show apps"
Практический опыт инженера: Никогда не используйте ARI для стандартных офисных АТС (где достаточно базового диалплана и очередей). ARI предназначен для кастомных платформ контакт-центров, систем предиктивного автодозвона и облачных коммуникационных платформ (CPaaS).

Частые вопросы (FAQ)

В чем принципиальная разница между AMI, AGI и ARI?

AMI — протокол асинхронного мониторинга и отправки управляющих команд. AGI — синхронный запуск внешних скриптов на определенных шагах диалплана. ARI (Asterisk REST Interface) — полнофункциональный низкоуровневый веб-фреймворк для полного создания логики управления звонками, каналами и медиамостами из внешнего кода.

Что происходит с вызовом при входе в Stasis()?

Asterisk передает полный контроль над каналом внешнему приложению по ARI, замораживая дальнейшее выполнение диалплана. Если внешний WebSocket-сервис упадет, канал останется в подвешенном состоянии до истечения таймаута.

Как объединить двух абонентов в разговор через ARI?

Создайте мост командой POST /bridges (type=mixing), создайте исходящий канал POST /channels/create, а затем добавьте оба канала (ID входящего и ID исходящего) в созданный мост через POST /bridges/{id}/addChannel.

Как обеспечить отказоустойчивость ARI бэкенда?

Используйте менеджеры процессов (PM2 / systemd) с автоперезапуском, отслеживайте события StasisEnd для гарантированного удаления висячих каналов и мостов, а также настраивайте аварийный выход из Stasis в диалплане.