Asterisk AGI(Perl脚本) - 有时脚本会忽略所有键

时间:2010-08-19 16:20:03

标签: perl key voip asterisk agi

我是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 个答案:

答案 0 :(得分:1)

在任何get_data之前放置以下行。 它应该工作。 $ AGI-> GET_DATA( “沉默/ 1”,5,1);

-Kaustubh

答案 1 :(得分:0)

很可能是Asterisk和来电者子集之间的DTMF设置存在问题。

如果脚本始终适合您并且总是对其他人失败,则几乎可以肯定是DTMF设置问题。如果您使用SIP通道接收呼叫,则在sip.conf中设置DTMF设置(我认为现在还有sip_users.conf或其他内容)。

如果脚本偶尔会对所有来电者都失败,那么它会变得更加棘手。如果SIP呼叫者使用带内DTMF,即在呼叫音频内发送按键,则Asterisk将通过尝试识别流内的信号来提取它们。很多事情都可以为此工作投入扳手,但我要寻找的第一件事就是任何丢弃的RTP数据包,也许你的网络在脚本失败的同时会特别繁忙。

如果您的电话是通过ISDN进入的,那么您可以打折以上内容。