2010-08-19 24 views
1

Je suis nouveau sur Asterisk (VoIP) et je suis plutôt nouveau sur UNIX/Perl. Je m'en remets à un collègue qui a quitté l'entreprise, donc je n'ai pas mis cela en place, j'ai juste besoin de faire quelques changements.Asterisk AGI (script Perl) - Parfois toutes les clés sont ignorées par le script

Je rencontre un problème lorsque j'utilise get_data() pour obtenir l'entrée du clavier de l'utilisateur, mais les clés sont juste ignorées et la fonction get_data() vient à expiration. J'ai essayé de réduire exactement quand cela arrive, mais chaque fois que je pense que je l'ai réduit à "ça n'arrive que quand je ...", je l'essaie à nouveau et ça marche. Le problème survient probablement dans environ 75% des cas, et avec mon manque d'expérience avec Asterisk, je n'ai aucune idée de ce qui pourrait en être la cause. Ci-dessous, un extrait de mon code que j'ai testé et reproduit le problème. Ci-dessous un extrait de mon code. Le problème est remarqué après que le fichier 'thankyouforcalling' soit diffusé au $demoFlag = $AGI->get_data("demoFlag", 10000, 1);. Est-ce que quelqu'un a une idée de ce qui pourrait causer cela? Merci!

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

Aucune suggestion? Je trouve surprenant que je ne puisse pas trouver d'autres personnes posant cette question, vu que j'ai déjà vu ce problème en appelant d'autres systèmes téléphoniques automatisés, donc je ne peux pas être le premier à avoir ce problème ... – Travesty3

Répondre

0

Plus que probablement, il est un problème avec les paramètres DTMF entre Asterisk et un sous-ensemble de vos correspondants.

Si le script fonctionne toujours pour vous et échoue toujours pour quelqu'un d'autre, c'est presque certainement un problème de réglages DTMF. Si vous recevez les appels en utilisant le canal SIP, les paramètres DTMF sont définis dans sip.conf (je pense qu'il y a sip_users.conf ou quelque chose maintenant).

Si le script échoue sporadiquement pour tous les appelants, cela va être plus compliqué. Si l'appelant SIP utilise le DTMF intrabande, c'est-à-dire que les touches sont envoyées dans l'audio d'appel, Asterisk les extrait en essayant d'identifier les signaux dans le flux. Un certain nombre de choses peuvent jeter un coup d'oeil dans les travaux pour cela, mais la première chose que je rechercherais est des paquets RTP abandonnés, peut-être votre réseau est particulièrement occupé en même temps que les échecs de script.

Si vos appels arrivent via RNIS, vous pouvez ne pas tenir compte de ce qui précède.

+0

. J'utilise mon téléphone de bureau pour appeler notre numéro 1-800 qui se connecte au script Perl. En utilisant le même téléphone, cela fonctionne parfois et échoue parfois. Le même comportement exact est vu lors de l'appel de mon téléphone portable. Donc, je ne pense pas que ce soit les paramètres DTMF, en fonction de votre description. Je ne sais pas comment vérifier les paquets RTP perdus, et je ne sais pas si les appels arrivent sur RNIS ou non (je suis un noob). Une chose à noter est que, si la première touche fonctionne, toutes les touches fonctionneront. Si le premier ne fonctionne pas, aucune des touches suivantes ne fonctionnera et vous devez raccrocher et réessayer. – Travesty3

+0

Le type d'incohérence DTMF que vous décrivez est typique des segments d'appel VoIP (tels que SIP ou IAX). Vous avez besoin de savoir comment vos appels sont reçus par votre serveur Asterisk. Le moyen le plus simple de vérifier est de savoir si des cartes PCI supplémentaires sont installées. Pour utiliser le RNIS, une carte PCI spéciale doit être installée sur le serveur. – sipwiz

1

mettre la ligne suivante avant tout get_data. Ça devrait marcher. $ AGI-> get_data ("silence/1", 5,1);

-Kaustubh

+0

Pour le moment, je ne vois plus ce problème. Je n'ai aucune idée de pourquoi cela a commencé ou s'est arrêté, mais tant que ça fonctionne, je ne vais pas me tromper. Si je vois le problème à nouveau, je vais certainement essayer votre suggestion. Merci! – Travesty3