1

私はアスタリスク (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);
4

2 に答える 2

1

次の行を get_data の前に置きます。それはうまくいくはずです。$AGI->get_data("silence/1",5,1);

-カウストブ

于 2011-01-27T07:48:17.020 に答える
0

おそらく、アスタリスクと発信者のサブセット間の DTMF 設定の問題です。

スクリプトが常に自分では機能し、他のユーザーでは常に失敗する場合は、ほぼ確実に DTMF 設定の問題です。SIP チャネルを使用して通話を受信して​​いる場合、DTMF 設定は sip.conf に設定されます (sip_users.conf などもあると思います)。

すべての呼び出し元に対してスクリプトが散発的に失敗する場合は、よりトリッキーになります。SIP 発信者がインバンド DTMF を使用している場合、つまり、キーの押下が通話音声内で送信されている場合、Asterisk はストリーム内の信号を識別しようとしてそれらを抽出します。これにはさまざまな原因がありますが、最初に確認するのは、ドロップされた RTP パケットです。スクリプトの失敗とほぼ同時に、ネットワークが特にビジー状態になる可能性があります。

通話が ISDN 経由で着信している場合は、上記を割引できます。

于 2010-08-24T23:34:36.703 に答える