ќбсудим вашу задачу в Telegram - чате?

ћерион Ќетворкс

¬ 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 (Asterisk REST Interface)

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} —писок звуков

ѕолезна ли ¬ам эта стать€?

–аз в неделю мы отправл€ем дайджест с самыми интересными стать€ми.

P.S. ≈сли укажите свою дату рождени€, то мы об€зательно ¬ас поздравим и подарим небольшой подарок :)

Ќажима€ на кнопку "ѕодписатьс€", вы даете согласие на обработку своих персональных данных