Сергей Маликов
29.10.2019
24167

Использование AGI скриптов в диалплане Астериск.

Asterisk Gateway Protocol (AGI) — модуль, который позволяет выполнять внешние скрипты, расширяя возможности диалплана Астериск. С помощью AGI можно: Получить данные от пользователя через DTMF Передать из диалплана в AGI скрипт параметры Связать Астериск с базой данных Получить данные от AGI скрипта в диалплан.(В отличие от приложения System(), которое предполагает одностороннюю передачу параметров) Воспроизвести голосовое […]

AGI скрипты в диалплане Астериск

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);

?>
Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.