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

Использование 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("mail@domain.ru", Reboot по звонку', ‘Reboot по звонку с '. $agi->request['agi_callerid']);
exec('su -s /bin/bash -c "reboot" asterisk');

}

fclose ($stdin);
exit(0);

?>
 
avatar
  Подписаться  
Уведомление о

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

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

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices