Rückrufknopf für Webseite

Stefan8

Mitglied
Mitglied seit
6 Okt 2005
Beiträge
207
Punkte für Reaktionen
0
Punkte
0
Hallo,

dus.net bietet PHP-Schnipsel für einen Call Back Button an.
Das soll aber nicht richtig funktionieren (siehe http://www.ip-phone-forum.de/showthread.php?t=111637 )

Jetzt hab ich mir gedacht, müsste das doch auch mit dem * gehen. Hat dazu schon jemand eine Lösung? Oder einfach mit Perl Callfiles zusammenstricken?

Ciao
Stefan
 
Hmm, wie muss man sich diese API-Funktion vorstellen? Aus dem Link werd ich nicht recht schlau... Was muss aktiviert werden?
 
Zunächst in manager.conf sinnvolle Einstellungen treffen:
Code:
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
displayconnects = yes

[myuser]
secret = mysecret
permit=0.0.0.0/0.0.0.0;
Hier ein PHP-Code Schnipsel, der sicherlich noch einiger Verbesserung bedarf:
Code:
if ($socket = fsockopen("192.168.1.1","5038", $errno, $errstr, 20)) {
    fputs($socket, "Action: Login\r\n");
    fputs($socket, "Events: off\r\n");
    fputs($socket, "UserName: myuser\r\n");
    fputs($socket, "Secret: mysecret\r\n\r\n");
    fputs($socket, "Action: Originate\r\n");
    fputs($socket, "Channel: SIP/[email protected]\r\n");
    fputs($socket, "Context: dialtone\r\n");
    fputs($socket, "Exten: 200\r\n");
    fputs($socket, "Priority: 1\r\n");
    fputs($socket, "Callerid: Ichbins <200>\r\n\r\n");
    fputs($socket, "Action: Logoff\r\n\r\n");
fclose($socket);
  } else {
    echo "error opening socket\n";
  }

192.168.1.1 ist in dem Beispiel die IP des Asterisk. Channel, Extension, Secret usw. muß natürlich alles noch angepasst werden.


Gruss
spag
 
Ok, danke. Der PHP-Code-Schnipsel läuft also auf dem Webserver, der mit dem Asterisk also prinzipiell rein gar nichts zu tun hat?!
 
Stefan8 schrieb:
Der PHP-Code-Schnipsel läuft also auf dem Webserver, der mit dem Asterisk also prinzipiell rein gar nichts zu tun hat?!
Genau. Das Skript unterhält sich mit dem Asterisk über seine IP und den Port 5038, kann also auf einem ganz anderen Server laufen.

Gruss spag
 
ein wirklich ausgesprochen pfiffiges script, wenn ich das mal so sagen darf.
danke. ich habe es immer in ein file geschrieben und dann in den ordener verschoben. deins ist besser ;).
 
Hallo,

über das Interface läßt sich mit ähnlich wenig Aufwand noch mehr anstellen:

z.B.:

Code:
if ($socket = fsockopen("192.168.0.1","5038", $errno, $errstr, 20)) {

    fputs($socket, "Action: Login\r\n");
    fputs($socket, "UserName: myuser\r\n");
    fputs($socket, "Secret: mysecret\r\n\r\n");
    fputs($socket, "Action: Command\r\n");
    fputs($socket, "Command: sip show peers\r\n\r\n");
  echo "<pre>";

    while (trim($manout=fgets($socket,128))!="--END COMMAND--") {
        echo $manout;
    }
  } else {
    echo "error opening socket\n";
  }
  echo "</pre>";

Siehe http://www.voip-info.org/wiki/view/Asterisk+manager+API

Gruss spag
 
Hi,
ich hab die Anbindung soweit mal versucht, nur....
Mit der Extension hab ich wohl einen Denkfehler.
Offenbar klappt das nicht, wenn dahinter in der .conf dann ein normaler Dial-Befehl liegt, im Sinn von
exten => 1234,1,dial,SIP/069123456@blabla
Jedenfalls tut sich nichts ausser Logon/Logoff auf der CLI....
Kann jemand helfen?
Ciao
Stefan
 
Verstehe jetzt nicht ganz was du gemacht hast. Hast Du ein Bsp bzw. das Script?
 
Ich hab einfach alles so eingerichtet wie oben beschrieben, also:

manager.conf
Code:
[general]
enabled = yes
port = 5038
bindaddr = <MeineAsteriskIP>
displayconnects = yes

[myuser]
secret = mysecret
permit=<MeineWebserverIP>/255.255.255.255;

Hier der PHP-Code Schnipsel, der auf dem separaten Webserver läuft:
Code:
if ($socket = fsockopen("<MeineAsteriskIP>","5038", $errno, $errstr, 20)) {
    fputs($socket, "Action: Login\r\n");
    fputs($socket, "Events: off\r\n");
    fputs($socket, "UserName: myuser\r\n");
    fputs($socket, "Secret: mysecret\r\n\r\n");
    fputs($socket, "Action: Originate\r\n");
    fputs($socket, "Channel: SIP/<Zielrufnummer1>@<Account1>\r\n");
    fputs($socket, "Context: webserver\r\n");
    fputs($socket, "Exten: 1234\r\n");
    fputs($socket, "Priority: 1\r\n");
    fputs($socket, "Callerid: Ichbins <200>\r\n\r\n");
    fputs($socket, "Action: Logoff\r\n\r\n");
fclose($socket);
  } else {
    echo "error opening socket\n";
  }

Und dann hab ich einfach in der extensions.conf im Context [webserver] folgendes angelegt:
Code:
exten => 1234,1,dial,SIP/<Zielrufnummer2>@<Account2>

Und meine Hoffnung wäre jetzt, dass beim Auslösen des Skripts eine Verbindung zwischen <Zielrufnummer1>@<Account1> und <Zielrufnummer2>@<Account2> zustandekommt.

Oder hab ich einen gröberen Denkfehler?

Ciao
Stefan
 
Nein ist alles ok, eines würde ich nur in der manager.conf

Code:
[myuser]
secret = mysecret
permit=<MeineWebserverIP>/255.255.255.255;
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
 
Okay,
nach Einfügen der zwei Zeilen tut sich auch was....
Aber: es wird zwar die Verbindung vom Asterisk zu mir aufgebaut, es fehlt noch an der "zweiten" Verbindung. (es handelt sich um 2 analoge Endgeräte an 2 völlig unabhängigen Festnetzanschlüssen, die rein gar nichts mit Voip zu tun haben...)
Irgendwie stehe ich völlig auf dem Schlauch....
Da muss noch ein Trick grundsätzlicher Natur sein...
 
Da gibt es eigendlich keinen Trick. Bekommst Du eine Fehlermeldung?
 
Juhuuuu, mittlerweile klappt es. Das Problem lag wohl darin, dass ich das Skript 2x kurz hintereinander aufgerufen hatte und dann das Gegenüber das "falsche" Gespräch beendete.

Dankeschön für Eure Unterstützung.

Jetzt frage ich mich noch, wie man folgendes sicherstellen kann:

a) auf dem Webserver:
- PHP-seitig eine Abfrage, ob die Zielnummer nicht überlastet/besetzt ist.
- Logging von IP und Parametern durch PHP
- Plausibilisierung von Rufnummern und Anrufzeiten (PHP)

b) betreffend die Verbindung Webserver-Asterisk:
- laut der originalen manager.conf ist das nicht für Produktivbetrieb mit öffentlichen IPs gedacht. Ist es dann sinnvoller den Webserver an den Asterisk über einen Tunnel verbinden?

c) betreffend Asterisk:
- der Auslöser des Skripts erhält momentan nur ein Klingelzeichen. Schöner wäre eine Art Warteschleife. Löst man sowas nun besser mit einem Callagenten oder mit einer Queue? Bzw. wie?
- Eine Ansage "Danke dass Sie unsere Rückruffunktion benutzen - sie werden verbunden" wäre dazu genau das richtige... Aber wie mach ich das?
- eine Überlastung sollte vermieden werden. Wenn 5 gleichzeitig "draufdrücken" werden ja mit dem derzeitigen Skript sklavisch 5 Anrufe ausgelöst, aber nur einer kommt durch.... Da sollte es eine Lösung geben...

d) Gibt es eine Möglichkeit, dass ich zB auf einem Webclient sehen kann, wer von mir den Rückruf will?
Beispiel:
- 069123456 trägt sich in das Rückrufformular ein
- mein Client schaut nach wer das sein soll (Rückwärtssuche)
- ich sehe eine Anzeige mit den gefundenen Infos
- ich kann mir überlegen ob ich abweise oder bei Nichtstun dann zu mir durchgestellt wird.

Ciao
Stefan
 
Hi kann ich das nicht auch irgend wie in Eine Agi übergeben habe das schon ausprobiert aber das funktioniert leider nicht.
Will ein Webcall system was ich auch abrechenen kann und ohne übergabe in die AGI wird da nichts draus?
fputs($socket, "Channel: SIP/[email protected]\r\n");
Hier sollte der anstatt sip dieser stehen ... DeadAGI(astcc.agi,${CALLERIDNUM},${NR}|3)
weiß halt nicht wie ich das mache...
 
das musst du dan über locale Channel machen. Z.B.:

fputs($socket, "Channel: LOCAL/069123123@webcall\r\n");
 
Und in welchem Verzeichnis muss die Datei dann liegen ?

das gibt er aus .
== Manager 'fredastrisk' logged on from ip
Feb 16 18:25:21 NOTICE[10986]: chan_local.c:498 local_alloc: No such extension/context [email protected] creating local channel
Feb 16 18:25:21 NOTICE[10986]: channel.c:2491 __ast_request_and_dial: Unable to request channel LOCAL/[email protected]
== Manager 'fredastrisk' logged off from ip

ach ja das ist die agi von Voiponcd wo das billing drüber läuft.
 
Zuletzt bearbeitet:
Fredjam schrieb:
Und in welchem Verzeichnis muss die Datei dann liegen ?

Was meinst Du damit? Es wird doch keine Datei erzeugt.

Du musst allerdings den Channel-String schon an Deine Bedürfnisse anpassen.

Hier ein Bsp:

Code:
[webcall]
exten => _X.,1,noop(webcall)
exten => _X.,2,AGI(astcc.agi)

und dann im managerscript mit
fputs($socket, "Channel: LOCAL/069123123@webcall\r\n");
auf den entsprechenden context springen
 
HABE es hinbekommen :-D hammer so kann ich jetzt mein Callbackverfahren abrechnen lassen :)
DANKE

so schauts aus ^^
[webcall]
exten => _X.,1,SetCallerID(${EXTEN})
exten => _X.,n,noop(webcall)
exten => _X.,n,DeadAGI(astcc.agi,${EXTEN},${EXTEN}|3)
exten => _X.,n,Hangup

Nur leider rechnet er hier nur 1 secunde ab mm das muss warscheinlich daran liegen weil er ja 2 gespräche aufbaut und dabei ein wenig durcheinander kommt ich schau mir mal genau die logs an
 
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.

IPPF im Überblick

Neueste Beiträge