Asterisk AGI (Perl-скрипт) - иногда все ключи игнорируются скриптом - PullRequest
1 голос
/ 19 августа 2010

Я новичок в Asterisk (VoIP) и довольно новичок в UNIX / Perl. Я забираю это у сотрудника, который ушел из компании, поэтому я не настроил его в первую очередь, мне просто нужно внести некоторые изменения.

У меня проблема с тем, что я использую get_data (), чтобы получить запись клавиатуры пользователя, но клавиши просто игнорируются, а функция get_data () просто отключается. Я пытался точно определить, когда это происходит, но каждый раз, когда я думаю, что я сузил это до «это происходит только тогда, когда я ...», я пробую это снова, и это работает. Проблема возникает, вероятно, примерно в 75% случаев, и из-за отсутствия у меня опыта использования Asterisk я понятия не имею, что может быть его причиной.

Ниже приведена выдержка из моего кода, который я протестировал и воспроизвел проблему. Проблема замечена после того, как файл 'thankyouforcalling' передается в $demoFlag = $AGI->get_data("demoFlag", 10000, 1);. Кто-нибудь знает, что может быть причиной этого? Спасибо!

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);

Ответы [ 2 ]

1 голос
/ 27 января 2011

ставьте следующую строку перед любыми get_data.Он должен работать.$ AGI-> get_data ("silence / 1", 5,1);

-Kaustubh

0 голосов
/ 25 августа 2010

Скорее всего, это проблема с настройками DTMF между Asterisk и подмножеством ваших абонентов.

Если скрипт всегда работает для вас и всегда терпит неудачу для кого-то другого, то это почти наверняка проблема с настройками DTMF. Если вы принимаете вызовы по SIP-каналу, то настройки DTMF устанавливаются в sip.conf (я думаю, что сейчас есть sip_users.conf или что-то еще).

Если сценарий время от времени терпит неудачу для всех вызывающих, то это будет сложнее. Если вызывающий SIP использует внутриполосный DTMF, то есть нажатия клавиш отправляются в звуковом вызове, то Asterisk будет извлекать их, пытаясь идентифицировать сигналы в потоке. Несколько вещей могут бросить гаечный ключ в работу для этого, но первое, что я бы искал, это любые отброшенные RTP-пакеты, возможно, ваша сеть особенно занята примерно в то же время, когда происходит сбой скрипта.

Если ваши звонки поступают через ISDN, вы можете сделать скидку на вышеуказанное.

...