Управление вызовами через Asterisk REST Interface (ARI): настройка Stasis и WebSockets
- Ошибка
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=plain2. Активация HTTP/WebSocket сервера в http.conf
Убедитесь, что в /etc/asterisk/http.conf включен сервер:
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=80883. Маршрутизация вызова в приложение 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" Частые вопросы (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 в диалплане.