В 2013 году, вместе с бета – релизом Asterisk 12 астериск - комьюнити был представлен новый API, который получил гордое название - ARI (Asterisk REST Interface). Что это и как им пользоваться, если вы любите php - рассказываем в статье.
Зачем Asterisk нужен новый API?
Все мы привыкли, что Asterisk имеет два интерфейса: Asterisk Manager Interface (AMI) и Asterisk Gateway Interface (AGI). AMI это асинхронный интерфейс, который используется для управления вызовами, инициацией звонков и всем, что попадает под определение «call control». AGI, в свою очередь, предоставляет синхронный интерфейс манипуляции одним каналом, являясь своего рода «прослойкой» между диалпланом и внешними скриптами. Важно отметить, что на время выполнения, AGI блокирует поток.
В связке, оба интерфейса неплохо справляются с задачами, связанными с различного рода манипуляциями с каналами и диалпланом Asterisk. Но разработка сложного и многоуровневого приложения может стать по настоящему трудной задачей для разработчика, в которой придется задействовать AGI и AMI одновременно.
Именно в этот момент на помощь приходит ARI (Asterisk REST Interface). Отметим, что ARI не заменяет AGI или AMI. Новый интерфейс позволяет разработчикам заменить управление на уровне диалплана внешними приложениями (скриптами). Тем самым, ARI упрощает жизнь разработчикам бизнес – приложений, которые используют Asterisk в качестве коммуникационной платформы.
ARI дает девелоперам высокоуровневый REST интерфейс, через который доступно управление базовыми операциями Asterisk, например, такими как каналы, мосты (бриджи), конечные устройства, управление медиа – потоками, записью разговоров и так далее. Информация об этих объектах передается в асинхронном режиме событиями JSON поверх WebSocket.
Только представьте: раньше, чтобы овладеть подобным набором инструментов, вам необходимо было иметь навыки программирования на C и разработать свой собственный модуль и внедрить в Asterisk. С использованием ARI, приложения могут быть написаны на вашем любимом языке, будь то Python, Ruby, PHP или JavaScript! Для удобства, ниже мы привели библиотеки и ссылки на них для различных языков программирования:
Библиотека | Язык программирования | Ресурс |
---|---|---|
ari4java | Java | https://github.com/l3nz/ari4java |
ari-py | Python | https://github.com/asterisk/ari-py |
AsterNET.ARI | C#/.NET | https://asternetari.codeplex.com/ |
node-ari-client | JavaScript (node) | https://github.com/asterisk/node-ari-client |
phpari | PHP | http://www.phpari.org/ |
Подведем итог: новый интерфейс ARI дает новые возможности не только для Asterisk комьюнити, но и для разработчиков бизнес приложений. От слов к делу, переходим к настройке.
Настройка phpari
Поскольку ARI это технология, базирующаяся на WebSocket, первым делом необходимо внести некоторые настройки в файл http.conf, который находится в директории /etc/asterisk/
:
cd /etc/asterisk/ vim http.conf
Приводим файл к следующему виду:
[general] enabled = yes bindaddr = 127.0.0.1
Далее, «сетапим» файл ari.conf, открыв его командой vim ari.conf
:
[general] enabled = yes pretty = yes [имя_вашего_пользователя] type = user read_only = no password = пароль_для_пользователя
В секции [имя_вашего_пользователя], укажите юзернейм, а в секции password его соответствующий пароль. Перегружаем Asterisk:
asterisk –rv core restart now
Теперь мы установим phpari. Установку будем производить с помощью composer:
Если у вас не установлен composer, вы можете скачать его по этой ссылке.
Открываем для редактирования файл composer.json и добавляем в него следующий код:
{ "require": { "php": ">=5.3.9", "educoder/pest": "1.0.0", "devristo/phpws": "dev-master", "greenfieldtech-nirs/phpari": "dev-master" } }
После чего запускаем команду:
composer install
Необходимая библиотека будет загружена. Переходим в директорию /vendor/greenfieldtech-nirs/phpari
и открываем для редактирования файл phpari.ini:
cd /vendor/greenfieldtech-nirs/phpari vim phpari.ini
Редактируем следующим образом:
[general] debug=0 logfile=console ; #если хотите логировать ARI в консоль, то оставьте данное поле без изменений. Если хотите логировать в файл, то укажите полный путь к нему; [asterisk_ari] username= имя_вашего_пользователя password= пароль_для_пользователя host=IP_адрес_Asterisk port=8088 endpoint=/ari transport=ws ; #нешфированный транспорт, wss для шифрования;
Отлично. Теперь давайте соберем простенький .php скрипт, который будет показывать активные каналы. Для этого, в директории, где у нас находится скачанная библиотека phpari и соответственно директория /vendor, создаем файл ari.php и наполяем его следующей конфигурацией:
require_once "vendor/autoload.php"; $ariCon = new phpari(); print_r($ariCon->channels()->channel_list());
Сохраняем. Сделайте 1 активный вызов на вашем Asterisk (например, позвонив с софтфона на софтфон). Переходим в консоль, и даем команду на выполнение этого скрипта:
php ari.php
Если все сделано правильно, в консоли мы увидим JSON – ответ, в котором будут переданы параметры активного канала: context, exten, caller, accountcode и прочие.
Как вызвать приложение?
Вызвать приложение из диалплана очень просто. Для этого, необходимо использовать Stasis:
exten => _XXXX,1,Stasis(ваше_приложение)
Что именно умеет ARI?
Кратко поговорим о том, какие именно операции умеет совершать ARI:
Метод | Путь | Описание |
---|---|---|
GET | /channels/{channelId} | Получить информацию о канале с channelId |
POST | /channels/{channelId} | Создать канал с указанным channelId |
DELETE | /channels/{channelId} | Удалить (Hang Up) канал |
POST | /channels/{channelId}/continue | Возврат в диалплан (выход из скрипта) |
POST | /channels/{channelId}/continue | Возврат в диалплан (выход из скрипта) |
POST | /channels/{channelId}/answer | Ответить на канал |
POST | /channels/{channelId}/mute | "Замьютить" канал |
DELETE | /channels/{channelId}/mute | "Снять мьют" с канала |
POST | /channels/{channelId}/hold | Поставить вызов на удержание |
DELETE | /channels/{channelId}/hold | Снять вызов с удержания |
POST | /channels/{channelId}/play | Воспроизвести медиа файл |
POST | /channels/{channelId}/record | Начать запись |
GET | /bridges | Лист всех активных мостов (бриджей) |
GET | /bridges | Лист всех активных мостов (бриджей) |
POST | /bridges/{bridgeId}/addChannel | Добавить канал к бриджу |
POST | /bridges/{bridgeId}/removeChannel | Удалить канал с бриджа |
GET | /endpoints | Список оконечных устройств |
GET | /endpoints/{tech} | Список оконечных устройств, которые функционируют по указанной технологии |
GET | /endpoints/{tech}/{resource} | Детальная информация по оконечному устройству |
GET | /sounds | Список звуков |
GET | /sounds/{soundId} | Список звуков |