【问题标题】:Asterisk AGI (Perl script) - Sometimes all keys are ignored by the scriptAsterisk AGI(Perl 脚本) - 有时脚本会忽略所有键
【发布时间】:2011-01-27 15:48:17
【问题描述】:

我是 Asterisk (VoIP) 的新手,对 UNIX/Perl 还是比较陌生。我是从一位离开公司的同事那里接手的,所以我一开始并没有设置,我只需要进行一些更改。

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

下面是我测试并重现问题的代码的摘录。在$demoFlag = $AGI->get_data("demoFlag", 10000, 1); 流式传输“thankyouforcalling”文件后,就会发现该问题。有谁知道可能导致这种情况的原因是什么?谢谢!

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

【问题讨论】:

  • 没有建议?令我惊讶的是,我找不到其他人问这个问题,因为我以前在拨打其他自动电话系统时看到过这个问题,所以我不能成为第一个遇到这个问题的人......

标签: perl key voip asterisk agi


【解决方案1】:

在任何 get_data 之前添加以下行。 它应该工作。 $AGI->get_data("silence/1",5,1);

-考斯图布

【讨论】:

  • 目前,我没有看到这个问题了。我不知道它为什么开始或停止,但只要它有效,我就不会搞砸它。如果我再次看到问题,我一定会尝试您的建议。谢谢!
【解决方案2】:

这很可能是 Asterisk 和您的呼叫者子集之间的 DTMF 设置问题。

如果脚本总是对您有效,而对其他人总是失败,那么几乎可以肯定是 DTMF 设置问题。如果您使用 SIP 通道接听电话,则 DTMF 设置在 sip.conf 中设置(我认为现在还有 sip_users.conf 或其他内容)。

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

如果您的电话是通过 ISDN 打进来的,那么您可以享受上述优惠。

【讨论】:

  • 感谢您的回复。我使用办公室电话拨打连接到 Perl 脚本的 1-800 号码。使用同一部手机,它有时会工作,有时会失败。从我的手机拨打电话时会看到相同的行为。因此,根据您的描述,我认为这不是 DTMF 设置。不知道如何检查丢弃的 RTP 数据包,我不知道呼叫是否通过 ISDN 进入(我是菜鸟)。需要注意的一点是,如果第一个键有效,则所有键都将有效。如果第一个不起作用,那么后面的键都不起作用,需要挂机重试。
  • 您所描述的 DTMF 不一致类型是典型的 VoIP 呼叫段(例如 SIP 或 IAX)。您确实需要了解您的呼叫是如何被您的 Asterisk 服务器接收的。检查的简单方法是找出其中是否安装了任何额外的 PCI 卡。要使用 ISDN,必须在服务器中安装特殊的 PCI 卡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多