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

星号AGI(Perl脚本)-有时脚本会忽略所有键,perl,key,voip,asterisk,agi,Perl,Key,Voip,Asterisk,Agi,我不熟悉Asterisk(VoIP),也不熟悉UNIX/Perl。我是从一个离开公司的同事那里接手的,所以我一开始并没有设置这个,我只是需要做一些改变 我遇到了一个问题,我使用get_data()来获取用户的键盘输入,但是这些键被忽略,get_data()函数只是超时。我一直试图缩小它发生的确切时间,但每次我认为我已经缩小到“它只发生在我…”,我再试一次,它的工作。这个问题大概75%的时候都会发生,由于我缺乏使用星号的经验,我不知道是什么原因造成的 下面是我的代码摘录,我已经测试并重现了这个问题

我不熟悉Asterisk(VoIP),也不熟悉UNIX/Perl。我是从一个离开公司的同事那里接手的,所以我一开始并没有设置这个,我只是需要做一些改变

我遇到了一个问题,我使用get_data()来获取用户的键盘输入,但是这些键被忽略,get_data()函数只是超时。我一直试图缩小它发生的确切时间,但每次我认为我已经缩小到“它只发生在我…”,我再试一次,它的工作。这个问题大概75%的时候都会发生,由于我缺乏使用星号的经验,我不知道是什么原因造成的

下面是我的代码摘录,我已经测试并重现了这个问题。当“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);

很可能是星号和呼叫者子集之间的DTMF设置问题

如果脚本总是对您有效,而对其他人无效,那么几乎可以肯定这是DTMF设置问题。如果您正在使用SIP通道接收呼叫,那么DTMF设置将在SIP.conf中设置(我认为现在也有SIP_users.conf之类的设置)

如果脚本对所有调用方都偶尔失败,那么它将变得更加棘手。如果SIP呼叫方使用带内DTMF,即按键在呼叫音频中发送,则星号将通过尝试识别流中的信号来提取按键。很多事情都可能导致这种情况,但我要寻找的第一件事是任何丢弃的RTP数据包,也许在脚本失败的同时,您的网络变得特别繁忙


如果您的电话是通过ISDN打来的,那么您可以对上述内容进行折扣。

很可能是星号和呼叫方子集之间的DTMF设置存在问题

如果脚本总是对您有效,而对其他人无效,那么几乎可以肯定这是DTMF设置问题。如果您正在使用SIP通道接收呼叫,那么DTMF设置将在SIP.conf中设置(我认为现在也有SIP_users.conf之类的设置)

如果脚本对所有调用方都偶尔失败,那么它将变得更加棘手。如果SIP呼叫方使用带内DTMF,即按键在呼叫音频中发送,则星号将通过尝试识别流中的信号来提取按键。很多事情都可能导致这种情况,但我要寻找的第一件事是任何丢弃的RTP数据包,也许在脚本失败的同时,您的网络变得特别繁忙


如果您的电话是通过ISDN打来的,那么您可以对上述内容进行折扣。

在任何get_数据之前,请在下面的行中添加以下内容。 它应该会起作用。 $AGI->get_数据(“静音/1”,5,1)


-Kaustubh

在任何get_数据之前放置以下行。 它应该会起作用。 $AGI->get_数据(“静音/1”,5,1)


-Kaustubh

没有建议吗?我发现很奇怪,我找不到其他人问这个问题,因为我以前在打电话给其他自动电话系统时看到过这个问题,所以我不是第一个遇到这个问题的人……没有建议吗?我发现很奇怪,我找不到其他人问这个问题,因为我以前在打电话给其他自动电话系统时看到过这个问题,所以我不是第一个遇到这个问题的人……谢谢你的回复。我使用办公室电话拨打连接到Perl脚本的1-800号码。使用同一部手机,它有时工作,有时失败。当我用手机打电话时,也可以看到同样的行为。因此,根据您的描述,我认为这不是DTMF设置。不知道如何检查丢弃的RTP数据包,我也不知道电话是否通过ISDN传入(我是一个noob)。需要注意的一点是,如果第一个键起作用,那么所有键都会起作用。如果第一个键不起作用,则后续键都不起作用,您需要挂断并重试。您描述的DTMF不一致类型是典型的VoIP呼叫分支(如SIP或IAX)。您确实需要了解Asterisk服务器如何重新接收您的呼叫。检查的简单方法是确定是否安装了额外的PCI卡。要使用ISDN,必须在服务器中安装一个特殊的PCI卡。感谢您的回复。我使用办公室电话拨打连接到Perl脚本的1-800号码。使用同一部手机,它有时工作,有时失败。当我用手机打电话时,也可以看到同样的行为。因此,根据您的描述,我认为这不是DTMF设置。不知道如何检查丢弃的RTP数据包,我也不知道电话是否通过ISDN传入(我是一个noob)。需要注意的一点是,如果第一个键起作用,那么所有键都会起作用。如果第一个键不起作用,则后续键都不起作用,您需要挂断并重试。您描述的DTMF不一致类型是典型的VoIP呼叫分支(如SIP或IAX)。您确实需要了解Asterisk服务器如何重新接收您的呼叫。检查的简单方法是确定是否安装了额外的PCI卡。要使用ISDN,必须在服务器上安装一个特殊的PCI卡。目前,我不再看到这个问题。我不知道它为什么开始或停止,但只要它起作用,我就不会搞砸它。如果我再看到这个问题,我一定会尝试你的建议。谢谢现在,我再也看不到这个问题了。我不知道它为什么开始或停止,但只要它起作用,我就不会搞砸它。如果我再看到这个问题,我一定会尝试你的建议。谢谢