Daten vom eingehenden Anruf

informatiker340

Neuer User
Mitglied seit
10 Mrz 2010
Beiträge
65
Punkte für Reaktionen
0
Punkte
0
Hallo Zusammen,

wo speichert Asterisk die eingehenden Anrufe?

Wie bekomme ich die Daten wie zb.
- die Nummer des Anrufers,
- Datum und Uhrzeit des Anrufs
- Dauer des Anrufs,
- und wen er angerufen hat
von Asterisk heraus.

Ich brauche diese Daten.

Danke für die Antworten.
 
noch etwas:

selbstverständlich müssen die Daten nach Beendigung des Anrufs bekommen werden. Da zb. die Dauer des Anrufs davor nicht noch nicht bestimmt ist.
 
Hallo,

nach dem Anruf findest Du die Daten im CDR.

Direkt bei Beendigung des Anrufs kannst Du die Daten in der h-extension auswerten. Die Variablen findest Du hier.

Svenja
 
Da sind einige Variablen erklärt, wie zb. Globale,- Umgebungs,- Kanal,- Variablen.
Welche soll ich benutzen? Ich hatte da an Globale oder Kanalvariablen gedacht?

Ich werde ja die Daten in einer PHP Datei abarbeiten. Wie übergebe ich die Daten denn an die PHP Datei?
 
Genau die, auf die mein Link zeigt, nämlich die Predefined Channel Variables.

Wenn Du das PHP als AGI aufrufst, hast Du vieles davon sowieso schon im Stream. Im Wiki ist auch beschrieben, wie man das in ein Array bekommt.
 
Ich rufe PHP noch nicht auf. Ist es eine gute Lösung mittels AGI aufzurufen? Rufe ich die PHP in der extensions.conf ?

Ich bin ein neuling und weiss vieles nicht.
Was muss ich jetzt zuerst machen um die Daten in PHP zu bekommen?
Soll ich AGi aufrufen oder die Variablen in der h-extension auswerten?

Habe keine Erfahrungen bei der Datenübertragung.

-------------------------------------------------
exten => s,1,Set(foo=${CDR(duration)})

ist somit die dauer des anrufs in der variable foo abgespeichert?

--------------------------------------------------

und so die nummer?
wie ist die richtige syntax eigentlich?

exten => s,1,Set(foo5=${CALLERID(num)})

oder so:

exten => s,1,Set(foo5=${CDR(CALLERID(num))})

----------------------------------------------------

oder ich benutze AGI:

exten => _[3-5]X,1,Dial(SIP/${EXTEN},15)
exten => _[3-5]X,2,AGI(agi.php)
exten => _[3-5]X,3,VoiceMail(${EXTEN})

wäre das so richtig? wie übergebe ich dann die AGI variablen an die agi.php?
 
Zuletzt bearbeitet:
Bitte fasse doch Deine Einzelpostings in einem Posting zusammen ("Ändern"-Button), und lösche dann die überzähligen Postings.

Bitte unterlass zukünftig das "Schieben" dieser Art.
 
ist somit die dauer des anrufs in der variable foo abgespeichert?
Ja.

exten => s,1,Set(foo5=${CALLERID(num)})
ist richtig.

exten => _[3-5]X,1,Dial(SIP/${EXTEN},15)
exten => _[3-5]X,2,AGI(agi.php)
exten => _[3-5]X,3,VoiceMail(${EXTEN})
Dir ist bewusst, dass so das AGI nur aufgerufen wird, wenn der Angerufene nicht dran gegangen ist, der Anrufer aber noch nicht aufgelegt hat.
Abhilfe schafft der Parameter g im Dial, allerdings muss der Angerufene dann auch zuerst auflegen.
Alles was nach einem Anruf auch sicher ausgeführt werden soll, muss in die h-extension.

Damit zu Deiner ersten Frage, es geht nicht darum, ob AGI oder h-extension, sondern es geht darum ob Du das PHP in der h-extension als AGI() oder mittels System() ausführen willst. Vorteil von AGI ist, dass viele Variablen schon zur Verfügung stehen, und nicht vorher im Dialplan ausgewertet und übergeben werden müssen.
Hier gibt's ein schönes Beispiel, wie man im AGI an die Variablen kommt.
 
exten => _[3-5]X,1,Dial(SIP/${EXTEN},15)
exten => _[3-5]X,2,VoiceMail(${EXTEN})
exten => h,1,AGI(agi.php)

so wird nach dem anruf agi.php aufgerufen gel?

Bei benutzung von AGI steht ja viele Variablen schon zur Verfügung. Welche variablen sind diese? Sind das die gleichen variablen wie hier.

ich glaube so übergebe ich die variablen an php?

exten => _[3-5]X,1,Dial(SIP/${EXTEN},15)
exten => _[3-5]X,2,VoiceMail(${EXTEN})
exten => h,1,AGI(agi.php,${CALLERID(num)})

gel?
 
Zuletzt bearbeitet:
Je nach Asterisk-Version kann es sein, dass Du
exten => h,1,deadAGI(agi.php)
machen musst, aber sonst ja.

Schau Dir meinen Link vom vorigen Beitrag noch mal an, da stehen die Variablen drin, gleich nach dem ersten Code-Beispiel.

Wenn Du zusätzliche Variablen brauchst, dann ist
exten => h,1,AGI(agi.php,Variable1 Variable2)
richtig. Im AGI kannst Du mit argv[1], argv[2], usw. darauf zugreifen.
 
Ich habe Asterisk 1.6.X. In dem Fall immer noch deadAGI aufruf?

Unter diesen Variablen sind nur 2 die ich gebrauchen kann.
Und zwar
1) agi_dnid => Die Nummer vom Anrufer
2) agi_extension => Die Nummer der Angerufen wird

Und diese verwende ich dann so?:
exten => _[3-5]X,1,Dial(SIP/${EXTEN},15)

exten => _[3-5]X,2,VoiceMail(${EXTEN})

exten => h,1,deadAGI(agi.php,agi_dnid,agi_extension)
richtig?
 
Bei 1.6 brauchst Du deadAGI() nicht mehr, da reicht AGI().

Die Variablen, die bereits im Stream übertragen werden, brauchst Du im Dialplan eben nicht extra übergeben. Das ist ja gerade der Witz an der Sache.

Hast Du Dir das Beispiel im Wiki angesehen?!

PHP:
$agivars = array();
 while (!feof(STDIN)) {
     $agivar = trim(fgets(STDIN));
     if ($agivar === '') {
         break;
     }
     $agivar = explode(':', $agivar);
     $agivars[$agivar[0]] = trim($agivar[1]);
 }
extract($agivars);
echo $agi_callerid;

Dabei wird zB. die Variable $agi_callerid angelegt.

Der Aufruf mit
Code:
exten => h,1,AGI(agi.php)
ist dafür völlig ausreichend.

Und jetzt setzt Du Dich mal hin und probiest selber eins der Beispiel-Skripte zum Laufen zu bekommen.
 
1. Bevor ich anfange zu tippe habe noch einiges im Kopf die nicht klar ist.
Mit den variablen von agi kann ich die Quell und zielnummer bekommen. Aber ich brauche ja auch noch die Dauer des Anrufs. Aber unter den Variablen hier kann ich nichts sehen was die dauer angeht.
Muss ich dann die dauer über CDR oder über die Predefined Channel Variablen zugreifen?

2. agi.php kann ich nur in /var/lib/asterisk/agi-bin/ abspeichern gel? sonst nirgends? Asterisk läuft bei mir unter der Virtuellen Maschine. Ich bräuchte die Daten aber unter windows wo auch der VMware Server läuft.
 
Code:
exten => h,1,AGI(agi.php,${CDR(billsec)})

Damit Du die CDR-Daten im Dialplan überhaupt auslesen kannst, musst Du endbeforehexten=yes in der cdr.conf haben.

PHP:
$dauer = $argv[1];

Die Skripte müssen in /var/lib/asterisk/agi-bin/ liegen, müssen Unix-Zeilenumbrüche haben, der Benutzer unter dem Asterisk läuft muss Ausführrechte haben und in der ersten Zeile des Skripts muss der Interpreter (zB. #!/usr/bin/php) angegeben werden. Daran gibt es nichts zu rütteln.
 
Alles klar, in meiner extensions steht jetzt
exten => _[3-5]X,1,Dial(SIP/${EXTEN},15)
exten => _[3-5]X,2,VoiceMail(${EXTEN})
exten => h,1,AGI(agi.php,${CDR(billsec)})

und in der agi.php
PHP:
#!/usr/bin/php5-cgi
<?php
$agivars = array();
 while (!feof(STDIN)) {
     $agivar = trim(fgets(STDIN));
     if ($agivar === '') {
         break;
     }
     $agivar = explode(':', $agivar);
     $agivars[$agivar[0]] = trim($agivar[1]);
 }
extract($agivars);
echo $agi_callerid; 
echo $agi_dnid;
$dauer = $argv[1];  
echo $dauer;
?>

habe auch php5,myadmin und auch apache installiert. dumme frage aber wo sehe ich die ausgabe der variablen?
 
Nirgends. Das wird alles über den STDOUT Stream zurück an Asterisk gegeben.
Schreib die Ausgaben am besten in ein Log-File.

Wenn Du die Ausgaben unbedingt in Echtzeit brauchst, kannst Du ein Verbose oder Exec(Noop) an Asterisk schicken. Dann siehst Du das im CLI. Beispiele dazu ebenfalls auf der verlinkten Wiki-Seite, ziemlich weit unten.
 
das ist jetzt der folgende code

PHP:
#!/usr/bin/php
<?php
$agivars = array();
 while (!feof(STDIN)) {
     $agivar = trim(fgets(STDIN));
     if ($agivar == '') {  [B]Vorsicht:in wiki ===[/B]
         break;
     }
     $agivar = explode(':', $agivar);
     $agivars[$agivar[0]] = trim($agivar[1]);
 }
extract($agivars);
echo $agi_callerid; 
echo $agi_dnid;
$dauer = $argv[1];  
echo $dauer;

$datei=fopen("logfile.txt","a");
fputs($datei,$agi_callerid\n);
fclose($datei);

function __read__() {
  global $in, $debug;
  $input = str_replace("\n", "", fgets($in, 4096));
  if ($debug) echo "VERBOSE \"read: $input\"\n";
  return $input;
}

function __write__($line) {
   global $debug;
   if ($debug) echo "VERBOSE \"write: $line\"\n";
   print $line."\n";
}

 //get the variable and strip off all the extra stuff around it
 __write__("MEINE VARIABLEN");
 $res = substr(strrchr(__read__(),"("),1,-1);
 __write__("EXEC NOOP '======??? MYDIALPLANVAR: ".$res." ???======'\n");
 __read__(); 

?>
 
Zuletzt bearbeitet:
hatte ein problem mit php interpreter:

jetzt steht auf deCLI folgendes, aber immer noch nicht die Variablen die ich eigentlich sehen möchte:

== Using SIP RTP CoS mark 5
-- Executing [35@developer:1] Dial("SIP/34-0000000a", "SIP/35,15") in new stack
== Using SIP RTP CoS mark 5
-- Called 35
-- SIP/35-0000000b is ringing
-- SIP/35-0000000b answered SIP/34-0000000a
-- Native bridging SIP/34-0000000a and SIP/35-0000000b
-- Executing [h@developer:1] AGI("SIP/34-0000000a", "agi.php, 6") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/agi.php
-- AGI Script Executing Application: (NOOP) Options: ('======???)
-- <SIP/34-0000000a>AGI Script agi.php completed, returning 0
== Spawn extension (developer, 35, 1) exited non-zero on 'SIP/34-0000000a'

Die 6 oben sind die sekunden(billsec) die übergeben wird. Ok und aber die Variablen $agi_callerid und $agi_dnid tauchen nicht auf?
 
Zuletzt bearbeitet:
Ich habe im Forum diesen folgenden Code gefunden der auch jetzt funktioniert und alle Variablen von AGI ausgibt:

PHP:
function read() {
  	global $in;
	$input = str_replace("\n", "", fgets($in, 4096));
  	return $input;
}
 
$in=fopen("php://stdin","r");
 
while ($env=read()) {
  	$s = split(": ",$env);
  	$agi[str_replace("agi_","",$s[0])] = trim($s[1]);

  	if (($env == "") || ($env == "\n")) {
    		break;
  	}
}

// --- "Hauptprogramm" 
ksort($agi);
reset($agi);
echo "verbose \n";
read();

while (list($key,$val)=each($agi)) {
    	echo "verbose \"".$key." = ".$val."\"\n";
    	read();
}

echo "exec Hangup\n";
read();

ich will ja aber nicht alle Variablen sonden nur callerid, dnid von agi???
 
Dann hast Du doch alles im Array $agi, was Du brauchst.

PHP:
echo "verbose \"CallerID: ".$agi['callerid']."\"\n";
read();

echo "verbose \"DNID: ".$agi['dnid']."\"\n";
read();

echo "verbose \"Billsec: ".$argv[1]."\"\n";
read();

Code:
exten => h,1,AGI(agi.php, ${CDR(billsec)})

Wie schon erwähnt ist endbeforehexten=yes in der cdr.conf wichtig, sonst bleibt billsec leer.
 
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.