2010-02-23 4 views
5

ich eine Anwendung mit PHP und einen Asterisk-Server zu entwickeln. Eines der Merkmale der Anwendung ist es, den Anrufstatus (Klingeln, antwortete hing ...) eines bestimmten Anrufer-ID zu überprüfen, so dass ich möchte wissen, wie dies zu tun, weil ich mit einem Sockel ich versucht, und die Befehlsstatus, aber ich denke, es muss ein besserer Weg sein, es zu tun.Wie kann ich den Status eines Anrufs kennen - Asterisk und PHP?

Vielen Dank im Voraus.

Antwort

4

Welche API Sie dieses Programm zu schreiben, verwenden? AMI? AGI? FastAGI? DeadAGI? Dateien aufrufen? Es gibt viele Möglichkeiten, diese Informationen zu erhalten.

HINWEIS: Sie können nicht feststellen, ob ein Kanal aufgelegt wurde, es sei denn, Sie verwenden Anrufdateien und/oder CDR-Zugriff.

Mit dem AMI können Sie den Befehl Status verwenden (dokumentiert hier: http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status).

Mit der AGI, wissen Sie den Status, wie es von Ihrem Programm bestimmt wird. Wenn Sie sich noch in Ihrem AGI-Skript befinden, wird der Anruf noch ausgeführt und bereits beantwortet.

Wenn Sie Anrufdateien verwenden und das Archive-Attribut auf 'yes' gesetzt ist, können Sie nach Beendigung des Anrufs Ihr outoing_done-Verzeichnis (in der Regel/var/lib/asterisk/outgoing_done /) auf Ihr Konto überprüfen Anrufdatei. Wenn Sie die Anrufdatei lesen, werden Sie bemerken, dass Asterisk einen Status am Ende der Anrufdatei angehängt hat, der Ihnen den endgültigen Status des Anrufs anzeigt.

Die BEST Weg, um diese Informationen zu erhalten, ist mit Ihrem PHP-Skript aus den CDR-Datensätze auf Ihrem Asterisk-Server gelesen. Lassen Sie Ihre CDR-Datensätze in einer MySQL-Datenbank protokollieren und dann Datensätze für Ihren Anruf aus der Datenbank abrufen.

+0

Ok ... hier die Sache ist. Ich empfange die aufgerufene ID als GET-Parameter von de URL ('$ _GET ['calledID']'). Ich muss den Anrufstatus dieser Anrufer-ID abrufen. (Ich mache keinen Anruf mit PHP) – Harph

+0

Da Sie nicht die Kanal-ID des Anrufs haben, gibt es keine Möglichkeit, diese Informationen direkt zu erhalten. Sie müssen stattdessen die Asterisk CDR-Datenbank verwenden. Wenn Sie Ihre CDR-Protokolle zu einer Datenbank (in der Regel MySQL) haben, dann lassen Sie einfach Ihr PHP-Skript eine Verbindung zur SQL-Datenbank herstellen und führen Sie eine Abfrage für die Anrufer-ID aus, die Sie von Ihrem Skript haben. Suchen Sie den letzten Anruf, der von der angegebenen Anrufer-ID mit einer SELECT-Anweisung getätigt wurde. Dann extrahieren Sie einfach die Informationen, die Sie benötigen (wie Anrufzeit, Ende der Anrufzeit, Anrufstatus, etc.) – rdegges

+0

Ja, Sie haben Recht, ich kann den Status des Anrufs mithilfe der CDR-Protokolldatenbank abrufen, aber das funktioniert einfach wenn der Anruf beendet ist, weil der Protokolleintrag erstellt wird, wenn der Anruf beendet wird. Ich muss den Status in Echtzeit abrufen, indem ich die Variablen verwende, die das Telefon mir über die URL senden kann. Irgendeine Idee? – Harph

2

Harph,

Sie können einen AMI-Daemon erstellen, um AMI Ereignisse von Asterisk gestreamt zu hören. Ich habe das schon oft gemacht, eines davon für die Asterisk GUI. Wenn Sie eine Tabelle für den Status in Ihrer Datenbank erstellen, können Sie einen Daemon erstellen, der die AMI-Ereignisse überwacht und den Status bei deren Auftreten aktualisiert. Dann muss Ihre Webseite überhaupt nicht mit Asterisk interagieren, sie muss nur den Status von der Datenbank lesen.

Der folgende Link ist aus dem Projekt Asterisk GUI. Es ist in Javascript geschrieben, so dass Ihr PHP ein wenig anders sein würde, aber das wird Ihnen eine gute Basis geben, um damit zu beginnen. Beginnen Sie mit der Linie 574.

http://svn.asterisk.org/view/asterisk-gui/branches/2.0/config/js/welcome.js?view=markup

Einer der wichtigsten Unterschiede in Javascript vs PHP ist, dass Javascript Asterisk des http-Daemon statt eine Socket-Verbindung direkt auf AMI verwenden hat. Aus diesem Grund muss es das 'waitevent' Zeug benutzen. Da Sie jedoch eine TCP-Socket-Verbindung verwenden werden, führen Sie einfach eine Leseanweisung aus.

Hoffe, das hilft! Diese Methode scheint am zuverlässigsten zu sein, wenn man versucht, Informationen von Asterisk zu erhalten.

1

Ich benutze tatsächlich HTML5 webSockets und AsterClick, ein Middleware-Daemon, den ich in PHP geschrieben habe.

AsterClick ist, soweit ich weiß, das einzige wirklich ereignisgesteuerte Asterisk AMI-Schnittstelle für HTML5 auf dem Planeten. Alle anderen Lösungen draußen sind immer noch polling der Server.

Ich kann den Status von Anrufen in Echtzeit sehen, entstehen. Transfer zwischen (Warteschlangen, Treffen, Parken, Einzelpersonen) einfach per Drag-and-Drop in meinem Browser. Ich kann funktionierende Ad-hoc-Wählplaneinträge erstellen, ohne in den Wählplan zu schreiben, oder grundsätzlich alles, was Asterisk AMI mit NO POLLING überhaupt tun kann.

In Javascript kann ich eine addEventListener() - Funktion verwenden, die die Namen von AMI-Ereignissen als Parameter tatsächlich übernimmt. Es gibt KEINE ABRUFUNG, aber eher wenn der Asterisk AMI ein Ereignis ausgibt, wird es an meinen Browser über den webSocket gesendet, der ein Ereignis erzeugt, das die Daten verarbeitet und mehr Ereignisse innerhalb des Browsers ausgibt .

Ich habe auch ein Tool namens WBEA, mit dem ich die gleichen HTML5 AsterClick-Anwendungen als eigenständige Desktop-ausführbare Dateien für Windows und Linux bereitstellen kann.

0

verwende ich CLI-Kommandokanal status.Here ist der PHP-Code zu überprüfen, verwende ich

<?php 
    $socket = fsockopen("111.11.11.111",$portno, $errno, $errstr, $timeout); 
    fputs($socket, "Action: Login\r\n"); 
    fputs($socket, "UserName: username\r\n"); 
    fputs($socket, "Secret: secret\r\n\r\n"); 


    $channel=$_GET['value']; //pass channel through GET method 


    echo"<pre>"; 
    fwrite($socket, "Action: Status\r\n"); 
    fwrite($socket, "Command: Lists channel status ".$channel."\r\n\r\n"); 
    $wrets=""; 


    fputs($socket, "Action: Logoff\r\n\r\n"); 

    while (!feof($socket)) { 
     $wrets .= fread($socket, 8192).'</br>'; 
    } 

    echo $wrets."<br/>"; 

    fclose($socket);  

    ?> 
Verwandte Themen