Frage

Ich bin neu in Asterisk (VoIP) und bin recht neu zu UNIX / Perl. Ich bin diese Übernahme von einem Mitarbeiter, der das Unternehmen verlassen, so dass ich dies nicht aufgebaut habe, in erster Linie, ich brauche nur ein paar Änderungen vornehmen.

ich habe ein Problem, wo ich get_data () verwenden, die Benutzer-Tastatureingabe zu erhalten, aber die Schlüssel werden einfach ignoriert und die get_data () Funktion nur mal aus. Ich habe versucht, genau zu verengen, wenn es passiert, aber jedes Mal, wenn ich denke, dass ich es verengt habe nach unten zu „es geschieht nur, wenn ich ...“, ich es noch einmal versuchen, und es funktioniert. Das Problem tritt wahrscheinlich etwa 75% der Zeit, und mit meinem Mangel an Erfahrung Asterisk verwenden, ich habe keine Ahnung, was es sein könnte verursacht.

Im Folgenden ein Auszug aus meinem Code, dass ich getestet habe und reproduziert das Problem. Das Problem wird bemerkt, nachdem die ‚thankyouforcalling‘ Datei auf $demoFlag = $AGI->get_data("demoFlag", 10000, 1); gestreamt wird. Hat jemand eine Ahnung, was dies verursacht werden könnte? Dank!

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);
War es hilfreich?

Lösung

Mehr als wahrscheinlich es ist ein Problem mit DTMF-Einstellungen zwischen Asterisk und einer Untergruppe der Anrufer.

Wenn das Skript immer für Sie arbeitet und nicht immer für jemand anderes, dann ist es mit ziemlicher Sicherheit ein Problem Einstellungen DTMF. Wenn Sie die Anrufe über den SIP-Kanal empfangen dann die DTMF-Einstellungen in der sip.conf (ich glaube, es gibt sip_users.conf oder etwas jetzt auch).

Wenn das Skript für alle Anrufer sporadisch fehlschlägt, dann es geht um schwieriger zu sein. Wenn der SIP Anrufer DTMF Verwendung Inband, d.h. die Tastendrücke innerhalb des gesendeten Anrufs Audio werden, dann werden sie Asterisk extrahieren, indem versucht Signale innerhalb des Stroms zu identifizieren. Eine Reihe von Dingen einen Strich durch die Rechnung dafür werfen, aber das erste, was ich suchen würde, ist jede RTP-Pakete fallen gelassen, vielleicht Ihr Netzwerk um die gleiche Zeit wie die Skript Ausfälle particulalry voll wird.

Wenn Sie Ihre Anrufe über ISDN kommen, dann können Sie die oben genannten Rabatt.

Andere Tipps

setzen folgende Zeile vor jedem get_data. Es sollte funktionieren. $ AGI-> get_data ( "Stille / 1", 5,1);

-Kaustubh

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top