В этой заметке расскажу как создать небольшой IVR. Для этого используется интерфейс Asterisk-AGI и знание любого языка.
Рассмотрим на основе Perl, на CPAN-е есть хороший модуль для этого — Asterisk::AGI. Ставить будем через «CPAN». В консоле вводим команду «cpan», если вы первый раз запускаете, то он попросит сконфигурировать его в ручную или автоматически, выбираем автоматически. Я его запускаю не впервые поэтому у меня будет такой вывод
[root_test]# cpan cpan shell -- CPAN exploration and modules installation (v1.7602) ReadLine support enabled cpan>
Установка, если в процессе понадобится установить дополнительные модули, соглашаемся
cpan> install Asterisk::AGI CPAN: Storable loaded ok Going to read /root/.cpan/Metadata Database was generated on Mon, 27 Dec 2010 20:45:25 GMT CPAN: LWP::UserAgent loaded ok Fetching with LWP: <a href="ftp://ftp.perl.org/pub/CPAN/authors/01mailrc.txt.gz">ftp://ftp.perl.org/pub/CPAN/authors/01mailrc.txt.gz</a> Going to read /root/.cpan/sources/authors/01mailrc.txt.gz Fetching with LWP: .................. Asterisk::AGI is up to date. cpan> quit Lockfile removed. [root_test]#
Добавляем в «/etc/asterisk/extensions.conf» строчки, вместо 89XXXX вставьте свой номер.
exten => _89XXXX,1,NoOP(--------------AGI start from ${CALLERID(number)} to ${EXTEN}-----------------------)
exten => _89XXXX,n,AGI(/var/lib/asterisk/agi-bin/IVR/IVR_89XXXX.pl)
exten => _89XXXX,n,Hangup()
Не забываем заставить Asterisk перечитать конфигурацию dialplan
dialplan reload
Файл «/var/lib/asterisk/agi-bin/IVR/IVR_89XXXX.pl» имеет следующий вид
#!/usr/bin/perl
use warnings;
use strict;
use Asterisk::AGI;
my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
my $work_dir = "/var/lib/asterisk/agi-bin/IVR";
my $sound_dir = "/var/lib/asterisk/sounds/en";
my $timeout = 2000;
my $manager = "1001";
my $reception = "1002";
##START
$AGI->answer();
$AGI->exec('Wait','1');
my $loop = 0;
while ($loop <= 5) {
my $user_press = $AGI->get_data("$sound_dir/my_intro","$timeout",'1');
if ($user_press == 1) {
$AGI->exec('Dial','SIP/'.$manager.',60,r');
} elsif ($user_press == 2) {
$AGI->exec('Dial','SIP/'.$reception.',60,r');
}
++$loop;
}
$AGI->hangup();
exit();
#END