Domanda

Sono nuovo di Asterisk (VoIP) e sono piuttosto nuovo per UNIX / Perl. Sto prendendo questo corso da un collega che ha lasciato l'azienda, quindi non ho messo questo in su, in primo luogo, ho solo bisogno di apportare alcune modifiche.

Sto avendo un problema in cui io uso get_data () per ottenere l'ingresso tastiera dell'utente, ma i tasti sono semplicemente ignorati e la funzione get_data () solo volte su. Ho cercato di circoscrivere esattamente quando succede, ma ogni volta che penso di aver ristretto la scelta a "Succede solo quando io ...", ho provato di nuovo e funziona. Il problema si verifica probabilmente circa il 75% del tempo, e con la mia mancanza di esperienza con Asterisk, non ho idea di quello che potrebbe essere la causa di esso.

Di seguito è riportato un estratto dal mio codice che ho testato e riprodotto il problema. Il problema è notato dopo il file 'thankyouforcalling' è in streaming a $demoFlag = $AGI->get_data("demoFlag", 10000, 1);. Qualcuno ha qualche idea di cosa potrebbe causare questo? Grazie!

basic.pl:

#!/usr/bin/perl
use Asterisk::AGI;
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;

my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
my $loop, $env, $demoFlag, $user_id, $password, $type, $mac;
@types = ("", "u", "s");
@environments = ("prod", "test");

($seconds, $minutes, $hours, $day, $month, $year) = localtime();
$year += 1900;
$month += 1;
$date = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $month, $day, $hours,    $minutes, $seconds);
$AGI->verbose("Call Received from ". $input{'callerid'} ." ${date}");

$lrepeat = 1;
while ($lrepeat == 1)
{
    $env = 0;
    $AGI->stream_file('thankyouforcalling');

    do
    {
        $loop = 0;
        $demoFlag = $AGI->get_data("demoFlag", 10000, 1);   # 1 = yes, 2 = no

        if ($demoFlag != 1 && $demoFlag != 2)
        {
            $AGI->stream_file("invalidKey");
            $loop = 1;
        }
    } while ($loop);

    if ($demoFlag == 2)
    {
        do
        {
            $loop = 0;
            $user_id = $AGI->get_data("userid", 10000, 6);

            if (length($user_id) != 6)
            {
                $AGI->stream_file("invalidEntry");
                $loop = 1;
            }
        } while ($loop);

        do
        {
            $loop = 0;
            $password = $AGI->get_data("password", 10000, 6);

            if (length($password) != 6)
            {
                $AGI->stream_file("invalidEntry");
                $loop = 1;
            }
        } while ($loop);
    }

    do
    {
        $loop = 0;  
        $type = $AGI->get_data("type", 10000, 1);   # 1 = UNIQUE, 2 = SERIAL

        if ($type != 1 && $type != 2)
        {
            $AGI->stream_file("invalidKey");
            $loop = 1;
        }
    } while ($loop);

    do
    {
        $loop = 0;
        my $file;

        if ($type == 1) { $file = "uniqueID"; }
        else { $file = "serial" }

        $mac = $AGI->get_data($file, 10000, 6);

        if (length($mac) != 6)
        {
            $AGI->stream_file("invalidEntry");
            $loop = 1;
        }
    } while ($loop);

    $lrepeat = 0;
}

$AGI->stream_file('greatAgreatday');
$AGI->hangup();
exit(0);
È stato utile?

Soluzione

Molto probabilmente si tratta di un problema con le impostazioni DTMF tra Asterisk e un sottoinsieme dei vostri chiamanti.

Se lo script funziona sempre per voi e sempre non per qualcun altro, allora è quasi certamente un DTMF impostazioni problema. Se si ricevono le chiamate utilizzando il canale SIP poi le impostazioni DTMF sono fissati in sip.conf (Penso che ci sia sip_users.conf o qualcosa ora pure).

Se lo script non riesce sporadicamente per tutti i chiamanti allora sarà più complicato. Se il chiamante SIP sta usando in banda DTMF, vale a dire i tasti premuti vengono inviati entro l'audio delle chiamate, quindi Asterisk sarà estrarli dal tentativo di identificare i segnali all'interno del flusso. Un certo numero di cose può gettare un bastone tra le ruote per questo, ma la prima cosa che sarebbe in cerca di qualsiasi è caduto pacchetti RTP, forse la rete diventa particulalry occupato intorno allo stesso tempo come i fallimenti di script.

Se le chiamate stanno arrivando in oltre ISDN allora si può scontare il sopra.

Altri suggerimenti

messo seguente riga prima di ogni get_data. Dovrebbe funzionare. $ AGI-> get_data ( "silenzio / 1", 5,1);

-Kaustubh

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top