Event-Listener in Asterisk?

rethus

Neuer User
Mitglied seit
7 Jul 2007
Beiträge
137
Punkte für Reaktionen
0
Punkte
16
Hallo Leute,
ich nutze die AGI-Schnittstelle über die Klasse phpagi.
Mich würde mal interessieren, ob es nicht so etwas wie ein Event-Listener in AGI gibt, der mir aufgrund einer Aktion (z.B. eingehender Anruf) eine entsprechende php-funktion anstößt, welche mir wiederrum ne Info ausgibt.

Sinn und zweck hinter der ganzen sache ist, dass die Serverlast so gering wie möglich gehalten werden soll - also nicht die ganze zeit nach einer veränderung im asterisk ge-pullt wird.

Freue mich auf Eure Vorschläge und Anregungen.
 
Mit AMI geht so etwas, mit AGI nicht. Ein AGI läuft immer Channel-bezogen.
 
Danke für deine Antwort.
Wie würde dass unter AMI gehen? Hast du da ein paar Infos und ggf. ein Beispiel für mich.

Übrigens, in meiner AGI-Klasse hab ich folgende functionen drin:
Code:
// *********************************************************************************************************
   // **                       MISC                                                                          **
   // *********************************************************************************************************

   /*
    * Log a message
    *
    * @param string $message
    * @param integer $level from 1 to 4
    */
    function log($message, $level=1)
    {
      if($this->pagi != false)
        $this->pagi->conlog($message, $level);
      else
        error_log(date('r') . ' - ' . $message);
    }

   /**
    * Add event handler
    *
    * Known Events include ( http://www.voip-info.org/wiki-asterisk+manager+events )
    *   Link - Fired when two voice channels are linked together and voice data exchange commences.
    *   Unlink - Fired when a link between two voice channels is discontinued, for example, just before call completion.
    *   Newexten -
    *   Hangup -
    *   Newchannel -
    *   Newstate -
    *   Reload - Fired when the "RELOAD" console command is executed.
    *   Shutdown -
    *   ExtensionStatus -
    *   Rename -
    *   Newcallerid -
    *   Alarm -
    *   AlarmClear -
    *   Agentcallbacklogoff -
    *   Agentcallbacklogin -
    *   Agentlogoff -
    *   MeetmeJoin -
    *   MessageWaiting -
    *   join -
    *   leave -
    *   AgentCalled -
    *   ParkedCall - Fired after ParkedCalls
    *   Cdr -
    *   ParkedCallsComplete -
    *   QueueParams -
    *   QueueMember -
    *   QueueStatusEnd -
    *   Status -
    *   StatusComplete -
    *   ZapShowChannels - Fired after ZapShowChannels
    *   ZapShowChannelsComplete -
    *
    * @param string $event type or * for default handler
    * @param string $callback function
    * @return boolean sucess
    */
    function add_event_handler($event, $callback)
    {
      $event = strtolower($event);
      if(isset($this->event_handlers[$event]))
      {
        $this->log("$event handler is already defined, not over-writing.");
        return false;
      }
      $this->event_handlers[$event] = $callback;
      return true;
    }

   /**
    * Process event
    *
    * @access private
    * @param array $parameters
    * @return mixed result of event handler or false if no handler was found
    */
    function process_event($parameters)
    {
      $ret = false;
      $e = strtolower($parameters['Event']);
      $this->log("Got event.. $e");        

      $handler = '';
      if(isset($this->event_handlers[$e]))         $handler = $this->event_handlers[$e];
      elseif(isset($this->event_handlers['*'])) $handler = $this->event_handlers['*'];

      if(function_exists($handler))
      {
        $this->log("Execute handler $handler");
        $ret = $handler($e, $parameters, $this->server, $this->port);
      }
      else
        $this->log("No event handler for event '$e'");
      return $ret;
    }

Irgendwie tue ich mich aber schwer damit das Event-Handler-Modell zu verstehen, welches hier beschrieben ist: http://www.voip-info.org/wiki-asterisk+manager+events

Kann mir da mal jemand einen konkreten Anwendungsfall an einem einfachen Beispiel beschreiben?
 
Zuletzt bearbeitet:
Ehrlich gesagt versteh ich nicht ganz, was Du eigentlich vor hast.

Du bekommst im AGI über den STDIN Stream auch Ergeignisse geliefert. Aber im Normalfall läuft ein AGI nicht recht lange, und außerdem immer abhängig von einem Channel.

Wenn Du zB. auf einen ankommenden Anruf wartest, dann ist ja gar kein AGI aktiv. Du brauchst also einen externen Daemon, der dauerhaft (d.h. Channel-unabhängig) läuft und am AMI angemeldet ist. Dort bekommst Du dann alle Ereignisse zugeschoben.

Aber beschreib doch am besten mal etwas ausführlicher Dein Vorhaben. Vielleicht gibt es ja noch eine andere Lösung.
 
Ich brauch ne Möglichkeit, live bei einem eingehenden event dies in meiner Webapplikation (PHP) anzuzeigen.
Die Applikation ist eine Art Konferenz-Raum verwaltung, wo ich eingewählte Teilnehmer sehen kann, diese sprechend oder stumm schalten kann usw.

Der eingehende Event kann dann zum Beispiel ein Tastendruck sein ("drücke die 9 wenn du was sagen willst"), oder ein neuer Anrufer in der Konferenz, oder das auflegen eines Teilnehmers usw. was dann jeweils in der Weboberfläche signalisiert werden soll.

Schwierigkeit für mich ist der weg vom Asterisk ins PHP-Frontend.
 
Richte Dir in der manager.conf mal einen Benutzer ein, das sample ist recht gut erklärt. Dann verbinde Dich mit telnet auf Port 5038 zum Asterisk und gib folgendes ein:
Action: logon
User: benutzername
Secret: kennwort
Events: all
Wichtig ist ein doppelter Zeilenumbruch nach der letzten Zeile.
Asterisk spuckt Dir bei jeder Kleinigkeit dort ein event aus.

Beendet wird das ganze mit
Auch hier wieder mit doppeltem Zeilenumbruch.

Grundsätzlich kannst Du das mit PHP und fsockopen genau so machen. Der Haken an der Sache ist, dass Du bei einer Webapplikation immer vom Browser her pollen musst. Du müsstest Dir einen Daemon basteln, der permanent am AMI angemeldet ist, die events auswertet und zB. in eine Datenbank schreibt, die dann von Deinen PHP-Skripts ausgelesen wird.

Ich warte schon die ganze Zeit auf froschi's Kommentar "Gemeinschaft hat das bereits integriert" ;) :weg:
 
Ich brauch ne Möglichkeit, live bei einem eingehenden event dies in meiner Webapplikation (PHP) anzuzeigen.
Die Applikation ist eine Art Konferenz-Raum verwaltung, wo ich eingewählte Teilnehmer sehen kann, diese sprechend oder stumm schalten kann usw.

Gibt es fertig: WebMeetMe.

Ich warte schon die ganze Zeit auf froschi's Kommentar "Gemeinschaft hat das bereits integriert" ;)

Das nackte Gemeinschaft hat das nicht integriert. Es gibt eine von der Firma LocaNet modifizierte Version von Gemeinschaft, die einen wie von Dir beschriebenen Mechanismus für diverse Ansteuerungsfunktionen von Endgeräten mitbringt (siehe Vortrag Amoocon 2009)
 
Danke schon mal für die Info. Jetzt weiß ich wenigstens, wie der EventListener grundsätzlich arbeitet.

Also ich hab mir heute den Tag um die Ohren gehauen, auf der Suche nach greifbaren Möglichkeiten.
Mein Resumee bis jetzt ist, dass ich auf websockets (HTML5) setze, da diese ab Ende diesen Jahres mit Firefox4 eh implementiert sind.
Den Benutzern vorzuschreiben, dass Firefox, Google Chrome oder Safari genutzt werden muss, ist ja kein Problem.
Dann würde ich halt so vorgehen, dass dann via websockets, die von AMI erhaltenen Events an den Broser ausgegeben werden. Sollte wohl machbar sein, hoffe ich.

@foschi:
Und dieses Webmeetme kann live z.B. nen tastendruck in der Webgui anzeigen? Wie machen die dass, über polling?

PS: Meine Konferenzsteuerung ist eine Individualprogrammierung für einen sehr speziellen Anwendungsfall. Ich hatte mir damals mal WebMeetMe angeschaut, das ist jedoch in Hinsicht auf meinen benötigten Funktionsumfang nicht im mindesten zu gebrauchen. Mein Anwendungsfall ist zu speziell.


.... persönlicher erinnerungsmarker: http://www.voip-info.org/wiki/view/asterisk+manager+events#JoinEvent
 
Zuletzt bearbeitet:
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.