Использование AGI скриптов в диалплане Астериск.
Asterisk Gateway Protocol (AGI) — модуль, который позволяет выполнять внешние скрипты, расширяя возможности диалплана Астериск. С помощью AGI можно: Получить данные от пользователя через DTMF Передать из диалплана в AGI скрипт параметры Связать Астериск с базой данных Получить данные от AGI скрипта в диалплан.(В отличие от приложения System(), которое предполагает одностороннюю передачу параметров) Воспроизвести голосовое […]
Asterisk Gateway Protocol (AGI) — модуль, который позволяет выполнять внешние скрипты, расширяя возможности диалплана Астериск.
С помощью AGI можно:
- Получить данные от пользователя через DTMF
- Передать из диалплана в AGI скрипт параметры
- Связать Астериск с базой данных
- Получить данные от AGI скрипта в диалплан.(В отличие от приложения System(), которое предполагает одностороннюю передачу параметров)
- Воспроизвести голосовое сообщение для звонящего абонента
AGI может управлять абонентской группой, вызывается в extensions.conf.
Async AGI представлен начиная с Asterisk 1.6, позволяет выполнять асинхронные сценарии AGI.
EAGI дает приложению возможность доступа и управления звуковым каналом в дополнение к взаимодействию с диалпланом.
FastAGI может использоваться для обработки на удаленном компьютере через сетевое соединение.
DeadAGI дает доступ к мертвому каналу после зависания. Устаревший с Asterisk 1.6
Как запустить AGI скрипт
Для запуска agi скрипта необходимо использовать приложение AGI()
;Этот код вызывает php скрипт handler.php через AGI
;Приложение AGI() позволяет передавать до 127 аргументов в скрипт, указываемых через запятую после имени скрипта
[incoming]
exten => _X.,1,AGI(handler.php)
Также создаем php скрипт.
Директория по умолчанию для AGI скриптов /var/lib/asterisk/agi-bin/
Скрипт должен быть исполняемым (в системах Linux это означает, что на этот файл должен быть установлен исполняемый бит). Вы можете сделать это с помощью команды Linux chmod + x, чтобы изменить права на выполнение.
Каждый скрипт AGI на основе PHP имеет следующую форму:
#!/usr/bin/php -q
<?
require('phpagi.php');
$agi = new AGI(); //подключаем библиотеку phpagi.php
$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
$stdlog = fopen('my_agi.log', 'w');
/ * Обработка ввода ввода от Asterisk * /
fclose ($stdin);
fclose ($stdlog);
exit(0);
?>
Отладка AGI в Asterisk CLI:
Для включения отладки необходимо в CLI выполнить команду
localhost*CLI> agi set debug on
Чтобы отключить отладку AGI, просто введите agi no debug в консоли Asterisk.
Каждая строка начинается с идентификатора канала вызова.
Если вызовов много, для фильтрации по идентификатору канала можно использовать grep, например: asterisk -rx | grep из командной строки.
После идентификатора канала вы увидите AGI, а затем Tx или Rx. Tx (передача) — означает, что Asterisk передает следующую информацию в буфер STDIN для использования AGI-скриптом. Строки, начинающиеся с Rx (получение), отображают информацию, которую AGI-скрипт отправляет в Asterisk в буфер STDOUT.
После запуска AGI скрипта Астериск передает в него переменные вызова.
agi_request Имя файла исполняемого скрипта
agi_channel Канал, инициирующий звонок
agi_language Языковой код
agi_type Тип канала, инициирующий вызов
agi_uniqueid Уникальный идентификатор звонка
agi_version Версия Asterisk
agi_callerid Номер вызывающего абонента
agi_calleridname Имя вызывающего абонента
agi_dnid Набранный номер
agi_context Контекст обработки вызова
Для примера напишем скрипт на языке php, который по звонку на определенный номер будет выполнять системные команды Linux.
Для этого создадим в диалплане экстеншен, при звонке на который Астериск будет ожидать от пользователя ввода PIN через DTMF.
В файле extensions.conf:
[from-internal]
exten => 777,1,NoOp(Reboot по звонку)
same => n,Set(CHANNEL(language)=ru)
same => n,Answer()
same => n,AGI(pin.php, ${CALLERID(number)})
same => n, Hangup()
В процессе выполнения скрипта воспроизводим предварительно записанные вспомогательные голосовые сообщения, которые должны иметь формат wav с частотой 8000гц и располагаться по адресу /var/lib/asterisk/sounds/ru.
В случае, если PIN введен верно, вызовем из скрипта выполнение команды reboot и отправляем письмо на e-mail.
Добавим в /etc/sudoers возможность запуска команд из php скрипта от пользователя root:
asterisk ALL=(ALL) NOPASSWD:/usr/sbin/reboot
asterisk ALL=(ALL) NOPASSWD:/var/lib/asterisk/agi-bin/pin.php
В директории /var/lib/asterisk/agi-bin/ создаем файл pin.php и назначаем права 755.
Содержимое файла /var/lib/asterisk/agi-bin/pin.php:
#!/usr/bin/php -q
<?php
require('phpagi.php');
$agi = new AGI(); //подключаем файл phpagi.php
$stdout = fopen('php://stdout', 'w');
$stdin = fopen('php://stdin', 'r');
const PIN_FOR_ACTION = 5782; // обьявляем константу - верный pin, введение которого ожидается от пользователя
//Описание функции, которая запрашивает у пользователя ввода pin кода
function ask_pin(){
global $agi,$main_cfg;
$pin_array='';
//Воспроизведение голосового сообщения "введите pin"
$agi->exec("Playback","vvedite");
//массив корректных значение
$correct_numbers=array('0','1','2','3','4','5','6','7','8','9');
while(true){
//ожидание ввода через DTMF
$pressed=$agi->wait_for_digit(500);
$digit=chr($pressed['result']);
if(in_array($digit,$correct_numbers)){
//корректное значение, добавляем к массиву
$pin_array[]=$digit;
}elseif($digit=="*"&&count($pin_array)==4){
//Введено более 4 цифр, ввод окончен нажатием звездочки
break;
}elseif($digit=="*"&&count($pin_array)<4){
//Введено меньше 4 цифр, повторный ввод
$agi->exec("Playback","invalid");
$pin_array=ask_pin(true);
}else{
continue;
}
}
//преобразуем полученный с пом. DTMF массив символов в число
$input_pin = implode('', $pin_array);
return $input_pin;
}
$inputed_pin = ask_pin();
//если ввели верный pin
if(PIN_FOR_ACTION <> (int)$inputed_pin){
exit(0);
}
else{
mail("[email protected]", Reboot по звонку', ‘Reboot по звонку с '. $agi->request['agi_callerid']);
exec('su -s /bin/bash -c "reboot" asterisk');
}
fclose ($stdin);
exit(0);
?>
Остались вопросы?
Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.