[UPDATE] AGI-Script: Falsche Ausgabe einer Ziffer

JoelM

Neuer User
Mitglied seit
18 Feb 2010
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Hallo,

mein Chef hat mich darum gebeten ein kleines AGI-Script in Perl zu schreiben, welche Eingaben per Telefon annimmt, sie ans AGI-Script weiter gibt und dann wieder ausgibt. So zum Einstieg.

Da ich noch nicht viel mit Perl gemacht habe, habe ich mir nur das "nötigste" angeeignet - also bitte ich um Nachsicht :)


Ich will hier in dem kleinen Versuch also erstmal eine Ziffer vom Anrufer eingeben lassen und diese dann per AGI wieder ausgeben.

Meine Frage ist, wo der Fehler im Code des AGI liegt, da ich als Rückgabewert immer '200' bekomme und nicht die eingegebene Ziffer. Meines Wissens heisst returns 200 result=0 doch, dass das Script erfolgreich abgearbeitet wurde oder irre ich mich?

Ich hoffe mir kann jemand helfen :-(


Code:
Code:
#!/usr/bin/perl
use strict;


$|=1;

# Setup some variables
my %AGI; my $tests = 0; my $fail = 0; my $pass = 0;

while(<STDIN>) {
	chomp;
	last unless length($_);
	if (/^agi_(\w+)\:\s+(.*)$/) {
		$AGI{$1} = $2;
	}
}

print STDERR "AGI Environment Dump:\n";
foreach my $i (sort keys %AGI) {
	print STDERR " -- $i = $AGI{$i}\n";
}

sub checkresult {
	my ($res) = @_;
	my $retval;
	$tests++;
	chomp $res;
	if ($res =~ /^200/) {
		$res =~ /result=(-?\d+)/;
		if (!length($1)) {
			print STDERR "FAIL ($res)\n";
			$fail++;
		} else {
			print STDERR "PASS ($1)\n";
			$pass++;
		}
	} else {
		print STDERR "FAIL (unexpected result '$res')\n";
		$fail++;
	}
}


print "WAIT FOR DIGIT 10000\n";
my $ergebnis = <STDIN>;
&checkresult($ergebnis);

print "SAY DIGITS  $ergebnis \"\"\n";
my $result = <STDIN>;
&checkresult($result);


Freundliche Grüße
Joel Maier
 
Zuletzt bearbeitet:
Hallo Joel,

so müsste es klappen:

Code:
print "WAIT FOR DIGIT 10000\n";
my $ergebnis = <STDIN>;
my $eingabe = &checkresult($ergebnis);
print "SAY DIGITS  $eingabe \"\"\n";

und in die sub noch ein return $1; rein.

Bevor Du Dich wunderst, Du bekommst nicht die eingegebene Ziffer, sondern WAIT FOR DIGIT gibt Dir den zugehörigen Ascii Wert aus.

Sofern sich das 200 result=0 auf das WAIT FOR DIGIT bezieht, bedeutet es übrigens einen Timeout.

Rentier
 
Hallo Rentier,

danke für die schnelle Antwort.
Mit deinen Änderungen kommt nach der Eingabe der Ziffer leider sofort ein Hangup, ohne das 'Say Digit'.

Wenn das 'Wait for Digit' mir den ASCII-Wert ausgibt, speichert er ihn denn richtig im Script - Eingabe 3 -> Wert der Variable $eingabe ist 3, damit ich ihn weiter verarbeiten kann? Ansonsten, gibt es einen anderen Befehl zum Einlesen der Ziffer(n)?
 
Hallo Joel,

Wo hast Du das return $1; gesetzt? Ich habs hier eingebaut und so hat das ganze dann auch funktioniert:

Code:
        if (!length($1)) {
            print STDERR "FAIL ($res)\n";
            $fail++;
        } else {
            print STDERR "PASS ($1)\n";
            $pass++;
            return $1;            #  <--------
        }

Wenn Du die Taste 3 drückst, dann wird er Dir 51 vorlesen. Probier mal
Code:
my $eingabe=chr(&checkresult($ergebnis));
Vielleicht klappts.

Rentier
 
Ok, hab's an die falsche Stelle gesetzt ;)
Vor die letzte }

Ich werde es morgen früh testen und mich dann nochmal melden.

Erstmal danke bis hierher für deine Hilfe!!

Gruß Joel
 
Hallo rentier,

vielen Dank für deine Hilfe!
Es hat geklappt, wie du sagtest kommt die '51' (bei Ziffer 3) zurück aber mit
Code:
my $eingabe=chr(&checkresult($ergebnis));
gibt er mir nur die Ziffer aus.

Eine letzte Frage habe ich noch:
Wenn mehrere Ziffern eingelesen werden müssen, ist es dann sinnvoll jede einzelne Ziffer mit 'WAIT FOR DIGIT ..." aufzurufen oder gibt es da eine einfachere Variante?
Ich hatte mal ein PHP-Script, wo ich im Dialplan ein "Read(...)" gesetzt und dann die Variable beim Aufrufen des Scripts übergeben habe, sodass ich die Ziffernfolge in einem hatte.

Vielen Dank!

Gruß Joel
 
Hallo Joel,

Du kannst innerhalb des AGI ein Read() ausführen, Du kannst zuerst im Dialplan das Read() ausführen und dann wie Du schon gesagt hast die Variable ans AGI übergeben. Oder Du machst im AGI eine Schleife, die WAIT FOR DIGIT so oft aufruft, bis Du die gewünschte Anzahl an Ziffern zusammen hast.

Sinnvoll ist das, was bei Dir am zuverlässigsten funktioniert und am besten zu Deinem restlichen Ablauf passt.

Wenn sonst alles passt, dann mach doch bitte noch einen Gelöst-Vermerk in den Titel.

Svenja
 
Im Moment habe ich nichts mehr :)
Jetzt geht es nur noch ums reine Perl-Programmieren.

Danke!


Gruß Joel
 
Ich habe doch noch was :-(

Mein Plan mit Read() im Dialplan ist gescheitert. Mein Script soll in der Datenbank Werte überprüfen und gucken, ob sie richtig sind - wenn nicht muss die Eingabe wiederholt werden und dann klappt es mit dem Dialplan ja nicht mehr ... ?!

Gibt es eine Möglichkeit die komplette Zahlenfolge direkt einzulesen?
Also z.B. soll das Script warten bis 10 Ziffern eingegeben wurden und dann weiter mit dem neuen Wert durch das Script gehen.

Du sagtest ja, dass es mit einem Array geht, allerdings weiß ich nicht so richtig, wie ich das programmieren kann - wie gesagt: Perl-Anfänger :-(


Gruß Joel
 
Hallo Joel,

ehrlich gesagt bin ich auch keine Perl-Expertin, aber so in etwa könnte das aussehen:
Code:
sub zahlabfragen {
  for($anzahl=0;$anzahl<10;$anzahl++){
    print "WAIT FOR DIGIT 10000\n";
    my $eingabe .= chr(&checkresult(<STDIN>));
  }
}

...
while ( --$eingabe leer oder kein Eintrag gefunden-- ) &zahlabfragen;

Du könntest dadurch zB. auch gleich nach jeder Ziffer die Datenbank abfragen, ob schon was passt, und ggf. die for-Schleife abbrechen.

Oder Du machst
Code:
exten => bla,1,Read(zahl,beep,10)
exten => bla,n,AGI(zahl.agi,${zahl})
exten => bla,n,Weiter_Gehts
und im AGI ein
Code:
if( --Kein Eintrag gefunden-- ) {
  print "EXEC GOTO 1";
  exit;
}

Noch eine Alternative, das Read() über das AGI ausführen und danach mit GET VARIABLE das Ergenis lesen.

Rentier
 
Also ich hätte es gerne so, dass das Einlesen über das AGI-Script passiert, also das Read() über das AGI selbst ausführen. Cheffe hätte gerne alles im AGI :)
Ich find nur nichts an Befehlen, um zehn Ziffern einzulesen, diese in einer Variable zu speichern und damit weiter zu arbeiten.

Quasi so:
1) Warte auf 10 Ziffern vom Anrufer
2) Speicher die 10 Ziffern in Variable $nummer
[...]


Gruß Joel
 
Was spricht dann gegen die for-Schleife?

Oder Du probierst mal
Code:
print "EXEC READ zahl,beep,10\n";
my $ergebnis = <STDIN>;
print "GET VARIABLE zahl\n";
my $ergebnis = <STDIN>;
my $eingabe = &checkresult($ergebnis);
GET VARIABLE gibt glaube ich 200 result=1 (zahl) aus, müsstest also evtl. Deine checkresult ein wenig anpassen.

Svenja
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.