Передача переменной из 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'};

Я настоятельно рекомендую вам прочитать исходный код модуля, если у вас есть какие-либо проблемы, будет НАМНОГО быстрее.

Другие вопросы по тегам