php login führt sofort zu logoff

liberavia

Neuer User
Mitglied seit
12 Mai 2008
Beiträge
92
Punkte für Reaktionen
0
Punkte
0
Hallo,

Ich bin hier echt am Verzweifeln.

Habe eine kleine Wallboardapplikation in PHP geschrieben welche anzeigt, welche Anrufer gerade in der Warteschleife sind und wie der Status der Kollegen gerade ist. Das funktioniert auch soweit.

Agentenmonitor4.png


Als nächsten Schritt habe ich gestern auf Basis dieses Scriptes (oben):
http://www.voip-info.org/wiki/view/Asterisk+manager+Example:+PHP
eine Kleine Klasse geschrieben, welche zunächst nur die Funktionen Login, Logout und Redirect_Call enthält. Hier der Code:

Code:
<?php
/************************************************************************
  			base_ami.php - Copyright andre

This class handles the communication to the Asterisk Manager Interface
This file was generated on Mi Aug 20 2008 at 14:44:40
The original location of this file is /home/andre/Desktop/Asterisk-Entwicklung/callbuntu-webgui/quellcode/base_ami.php
**************************************************************************/


class base_ami
{

	 /*** Attributes: ***/

	private $username;

	private $secret;

	private $socket;

	public function __construct() {
		$this->username="admin";
		$this->secret="geheim";
		$this->socket = fsockopen("127.0.0.1", "5038", $errno, $errstr, $timeout);
	}

	public function redirect_channel( $channel,  $exten,  $context ) {
		fputs($this->socket, "Action: Redirect\r\n");
		fputs($this->socket, "Channel: $channel\r\n");
		fputs($this->socket, "Exten: $exten\r\n");
		fputs($this->socket, "Context: $context\r\n");
		fputs($this->socket, "Priority: 1\r\n\r\n");
	} // end of member function redirect_channel

	public function login() {
		fputs($this->socket, "Action: Login\r\n");
		fputs($this->socket, "Username:{$this->username}\r\n");
		fputs($this->socket, "Secret: {$this->secret}\r\n\r\n");
	} // end of member function login

	public function logout( ) {
		fputs($this->socket, "Action: Logoff\r\n\r\n");
	} // end of member function logout



} // end of base_ami
?>

Benutzt habe ich diese Klasse dann wie folgt:
Code:
	if ($_GET['ami_action']=="redirect")
	{
		$channel=trim($_GET['channel']);
		$exten=trim($_GET['exten']);
		$context=trim($_GET['context']);
		echo "Channel:-".$channel."-<br>";
		echo "Exten:-".$exten."-<br>";
		echo "context:-".$context."-<br>";
                $ami->login();
		$ami->redirect_channel( $channel,  $exten,  $context );
		$ami->logout();
	}

Das Ziel hierbei ist, dass der eingeloggte Agent seinen eigenen Anruf mit einem Klick auf einen anderen Agenten weiterleiten kann.
Das hatte gestern dann auch zunächst geklappt :D. Leider habe ich aber die falschen Kanäle verbunden und dann war feierabend. Darum wollte ich mich dann heute kümmern. Da das Grundschema ja klappte war ich auch guter Dinge, dass ich dafür nicht lange brauchen würde. Nun ermittel ich zwar den korrekten Kanal und gebe ihn an das PHP-Script weiter, aber es tut sich leider gar nix mehr.

Nach Stundenlangem Herumprobieren (Klasse auskomentiert und alles Sequentiell eingegeben, Variablen auf eventuelle Leerzeichen geprüft, Variablen komplett durch festen Text ausgetauscht, Gegenprüfung auf der telnet-konsole mit exakt denselben Eingaben, Mein Synchronisationsprogramm zum Testen abgestellt, timeout bei fsockopen weggelassen oder großzügig gesetzt usw. usw. -> :mad: ) hab ich den Fehler zumindest eingekreist. Das Problem ist, dass sofort nach dem Login der Logoff erfolgt (zu sehen im CLI), obwohl ich das Logoff Kommando bewusst auskommentiert hatte (!). Demnach erfolgt einfach keine Abarbeitung des Redirect-Kommandos.
Code:
== manager 'admin' logged on from 127.0.0.1
== manager 'admin' logged off from 127.0.0.1

Logge ich mich mit exakt denselben Werten über die Telnet-Konsole ein funktioniert dagegen alles wie gewünscht, der Kanal wird umgeleitet.

Ich bin echt am Ende mit meinem Latein und Frage mich, wieso ich mit dem PHP-Script immer sofort wieder ausgeloggt werde :confused:

Der Vollständigkeit halber hier noch die manager.conf:

Code:
[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1

[admin]
secret=geheim
read = all,system,call,log,verbose,command,agent,user,config
write = all,system,call,log,verbose,command,agent,user,config

Laufen tut das ganze auf Ubuntu Server 8.04.1 mit Asterisk 1.4.17.

Bitte hol mich jemand aus meinem Loch heraus!

Danke

André
 
Hi,

sieht schick aus :)

Ich hatte letztens ein ähnliches Problem, soweit ich das gesehen habe, habe ich ausser dem Log-Off und Log-On keine Verbose Msg vom ami gehabt, zweitens könnte es sein, dass du dich zu schnell ausloggst.
Setze doch mal ein Exec VERBOSE nach dem Redirect ab, dann weisst du wenigstens, ob das Redirect ankommt...

Mario
 
Danke für die Antwort.

zweitens könnte es sein, dass du dich zu schnell ausloggst.

Das habe ich auch schon gedacht und überprüft. Habe dazu als einziges den Befehl zum Login übriggelassen (Redirect und Logoff auskommentiert). Trotzdem werde ich sofort ausgeloggt. Nur deswegen bin ich überhaupt darauf gekommen, dass das Problem hier liegt (immerhin).

Leider hatte ich den Stand, wo ich es zumindest geschafft hatte zwei Agentenkanäle miteinander zu verbinden nicht ins Subversion Repository überführt, da es kurz vor Feierabend war.

Paralell habe ich auch noch eine andere AMI-Sitzung auf der Konsole laufen lassen, um eventuell mitverfolgen zu können, was da schief läuft. Dort hatte sich aber nix gerührt.

Setze doch mal ein Exec VERBOSE nach dem Redirect ab, dann weisst du wenigstens, ob das Redirect ankommt...

Ist das ein AMI-Kommando oder php? Denke mal AMI und wird probiert ;)
 
Also,

habe alles nochmal neu aufgesetzt und es hat geklappt... aber nur genau einmal :(

Ich habs leider auch nicht geschafft das zu reproduzieren, so das ich wenigstens einen Hinweis bekomme, was da schief läuft. Der Rechner will mich offensichtlich zum Narren halten :mad:

Habe die Kommandos auch versucht Sequentiell einzugeben, kein Erfolg. Habe den Redirect Code einfach in die Login-Methode eingefügt, kein Erfolg.
Habe mir jeden Schritt ausgeben lassen

Was ich auch probiere stehts werde ich ofenbar ausgeloggt bevor meine Aktion durchgeführt werden kann oder die Aktion wird nicht korrekt ausgeführt :mad: :silly:

Ich würde gerne das mit Exec VERBOSE ausprobieren, aber wie schon oben geschrieben, hab ich keinen Plan wo ich das reinschreiben oder setzen soll? (Ich verwende kein AGI, sondern verwende das Asterisk Manager Interface über ein Standard-PHP-Webbrowser-Script). Wenn ich "core set verbose 5" in der CLI eingebe erhalte ich auch keine weiteren Meldungen, was allerdings auch der Fall ist, wenn ich mich über telnet ins AMI einlogge und die Kommandos per Hand ausführe.

Leider gibt es nämlich sonst keine Chance für mich zu sehen, was intern passiert. Genau das muss ich aber wissen, sonst komm ich hier nicht weiter.

Bin dankbar für weitere Ratschläge

André
 
Zuletzt bearbeitet:
Ich hatte mir die Antwort erspart, weil du schriebst, du willst es ausprobieren ;-)

Das EXEC ist ein AMI Kommando, Verbose ist eine Asterisk Application.
"EXEC Verbose" führt damit den Verbose Befehl auf der Konsole aus.

Schau' dir doch einfach mal phpagi an, ich musste zwar einen Moment suchen, bis ich den Befehl gefunden hatte, aber dann versteht man das eher.

Ich frage mich sowieso, warum du das Rad neu erfinden willst? phpagi ist doch ok!?

Mario
 
Ich hatte mir die Antwort erspart, weil du schriebst, du willst es ausprobieren

Da hast du recht!
Hatte das Problem erstmal vertagt und den Unterbau des Wallboards jetzt mit Ajax realisiert. Außerdem habe ich auch die serverseitigen Python-Scripte auf die neuen Anforderungen angepasst, damit ich nicht ständig 6 Tabellen gleichzeitig abfragen muss. Das mit der AMI-Schnittstelle ist erst seit gestern wieder Thema.

Das EXEC ist ein AMI Kommando, Verbose ist eine Asterisk Application.
"EXEC Verbose" führt damit den Verbose Befehl auf der Konsole aus.

Wenn ich das richtig verstanden habe, sollte mir das ja mehr ausgeben als "core set verbose 5" auf der CLI, richtig? Hoffentlich erklärt das, warum es einmal geklappt hat und danach nie wieder.

Ich frage mich sowieso, warum du das Rad neu erfinden willst? phpagi ist doch ok!?

Das stimmt sicherlich. Allerdings will ich ja nicht den ganzen Befehlsstack zur Verfügung haben. Mir reichen einige wenige AMI-Kommandos (Bisher Redirect und Originate). Von daher war ich der Meinung, dass eine eigene Klasse angemessener sein sollte, vom Lerneffekt ganz zu schweigen ;)

Sollte die AMI-Wünsche viele Kinder kriegen, werde ich sicherlich auf ein vorhandenes Framework zurückgreifen ;)

Leider kann ich das erst am Montag testen, aber immerhin gehe ich dann dank dir nicht unbewaffnet an die Maschine :)

Gruß

André
 
Sorry ich kann das Kommando Exec Verbose bzw. Exec einfach nicht finden.

Weder die Eingabe von

Code:
manager show commands

noch die folgende Seite liefert ein solches Kommando:
http://www.voip-info.org/wiki-Asterisk+manager+API

Sollte dieses Kommando die CLI lediglich auf Verbose Level 5 stellen, bringt das auch wenig, da auch hier nur der Login/Logoff-Vorgang angezeigt wird.

Wenn ich mir die Methode in der phpagi anschaue, dann stelle ich aber fest, dass anscheinend ganau das getan wird.

Gib mir mal bitte Hilfestellung.

Danke

André
 
Zuletzt bearbeitet:
OK, nach Tagelangem probieren krieche ich (erstmal) zu Kreuze.

Habe phpagi in meine Wallboard-Applikation eingebunden und nach ein bisschen fummelei funktioniert nun alles wie gewünscht. Ich glaube, ich habe dabei auch meinen eigenen Fehler erkannt.

Offenbar hab ich die erwarteten Parameter nicht in der richtigen Reihenfolge hineingebracht, denn anfangs hatte ich mit phpagi dasselbe Ergebnis

Werde das nochmal mit meiner Klasse ausprobieren und dann nochmal berichten.

Jedenfalls bin ich heilfroh, dass es jetzt funktioniert :D

Danke nochmal für deine Hilfe Mario !
 
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.