Передача переменной из Asterisk Dialplan в Perl-скрипт AGI
Я пытаюсь передать переменную из набора номеров Asterisk в Perl-скрипт с использованием AGI. Я сейчас к этому и очень смущен тем, как именно это работает. Прямо сейчас в моем диалплане у меня есть это:
exten=>1122,1,Answer
exten=>1122,n,Read(digit)
exten=>1122,n,agi(/home/steve/Desktop/testperlping.pl,${digit})
exten=>1122,n,Hangup()
Я хочу, чтобы пользователь набрал добавочный номер 1122, затем ввел номер от 1 до 10, и его номер был передан в perl с использованием AGI.
Мой Perl-скрипт выглядит следующим образом:
#!/usr/bin/perl -w
$|=1;
use Net::Ping;
use Asterisk::AGI;
$AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
***I think I need something here***
$AGI->verbose("$numbertheytypedintophone"); #This will display the entered number back to the CLI.
Любая помощь будет принята с благодарностью.
2 ответа
Рассмотрим часть диалплана
exten => _X.,1,NoOp(${PJSIP_HEADER(read,To)})
exten => _X.,n,Set(FirstTo=${CUT(PJSIP_HEADER(read,To),:,2)})
exten => _X.,n,Set(TO_DID=${CUT(FirstTo,@,1)})
exten => _X.,n,Set(client_number=${CALLERID(num)})
exten => _X.,n,AGI(check_nr.agi,,${client_number})
exten => _X.,n,Set(First_check=${first_ani})
Обратите внимание на двойную запятую в сценарии agi.
Часть скрипта, которая будет использовать значение client_number
(my $empty_field, my $data ) = @ARGV;
my @data_array = split /--/, $data;
my $callerid = $data_array[0];
Разделенная часть - это если у вас есть несколько параметров, таких как
AGI(check_nr.agi,,${client_number}--${second}--${third})
В этом случае будет
(my $empty_field, my $data ) = @ARGV;
my @data_array = split /--/, $data;
my $callerid = $data_array[0];
my $second = $data_array[1];
my $third = $data_array[2];
Чтобы передать переменную обратно в диалплан звездочки, вы должны использовать:
print "SET VARIABLE first_ani $first_ani\n";
Полный perl-скрипт
#!/usr/bin/perl
# Modules to use
use strict ;
use warnings;
use Config::IniFiles;
use DBI;
use sigtrap;
use sigtrap qw(handler my_handler normal-signals stack-trace error-signals);
my $cfg = Config::IniFiles -> new( -file => '/etc/my_file.ini' );
my $dbinst = $cfg -> val('AST', 'DBINST');
my $dbhost = $cfg -> val('AST', 'DBHOST');
my $dbuser = $cfg -> val('AST', 'DBUSER');
my $dbpass = $cfg -> val('AST', 'DBPASS');
my $dbhA = DBI->connect( "dbi:mysql:$dbinst:$dbhost",$dbuser,$dbpass, {RaiseError => 0,PrintError => 1,AutoCommit => 0,}) or die $DBI::errstr;
########################################### Pass data from asterisk channel to perl script ##########################################
(my $empty_field, my $data ) = @ARGV;
my @data_array = split /--/, $data;
my $callerid = $data_array[0];
########################################### Pass data from asterisk channel to perl script ##########################################
my $sthA = $dbhA->prepare( "select ani,
numero,
data_ultima_modifica
from my_table
where numero = ?
ORDER BY data_ultima_modifica DESC ");
$sthA->bind_param( 1, $callerid );
$sthA->execute();
my $sthArows=$sthA->rows;
if ($sthArows > 0)
{
my @aryA = $sthA->fetchrow_array;
my $ani = $aryA[0];
my $numero = $aryA[1];
my $data_ultima_modifica = $aryA[2];
print "SET VARIABLE first_ani $first_ani \n";
}
$sthA->finish();
################## Close DB Connection##################
warn $DBI::errstr if $DBI::err;
$dbhA->commit();
$dbhA->disconnect();
################## Close DB Connection##################
Я использую Asterisk::FastAGI(рекомендуется для интеграции с Perl), и код выглядит так:
my $dst = $self->param('dst');
Для Asterisk::AGI это должно быть (я только что прочитал источник AGI.pm):
my $digits=$input{'arg_1'};
Я настоятельно рекомендую вам прочитать исходный код модуля, если у вас есть какие-либо проблемы, будет НАМНОГО быстрее.