.titleBar { margin-bottom: 5px!important; }

Rückrufknopf für Webseite

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von Stefan8, 31 Jan. 2007.

  1. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    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
     
  2. spag

    spag Neuer User

    Registriert seit:
    17 Okt. 2006
    Beiträge:
    34
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  3. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hmm, wie muss man sich diese API-Funktion vorstellen? Aus dem Link werd ich nicht recht schlau... Was muss aktiviert werden?
     
  4. spag

    spag Neuer User

    Registriert seit:
    17 Okt. 2006
    Beiträge:
    34
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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/069123123@sipgate.de\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
     
  5. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ok, danke. Der PHP-Code-Schnipsel läuft also auf dem Webserver, der mit dem Asterisk also prinzipiell rein gar nichts zu tun hat?!
     
  6. spag

    spag Neuer User

    Registriert seit:
    17 Okt. 2006
    Beiträge:
    34
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  7. n8isch

    n8isch Mitglied

    Registriert seit:
    22 März 2005
    Beiträge:
    275
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Trier
    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 ;).
     
  8. spag

    spag Neuer User

    Registriert seit:
    17 Okt. 2006
    Beiträge:
    34
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  9. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  10. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    Verstehe jetzt nicht ganz was du gemacht hast. Hast Du ein Bsp bzw. das Script?
     
  11. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  12. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    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
    
     
  13. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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...
     
  14. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    Da gibt es eigendlich keinen Trick. Bekommst Du eine Fehlermeldung?
     
  15. Stefan8

    Stefan8 Mitglied

    Registriert seit:
    6 Okt. 2005
    Beiträge:
    207
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  16. Fredjam

    Fredjam Mitglied

    Registriert seit:
    7 Mai 2006
    Beiträge:
    362
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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/069123123@sipgate.de\r\n");
    Hier sollte der anstatt sip dieser stehen ... DeadAGI(astcc.agi,${CALLERIDNUM},${NR}|3)
    weiß halt nicht wie ich das mache...
     
  17. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    das musst du dan über locale Channel machen. Z.B.:

    fputs($socket, "Channel: LOCAL/069123123@webcall\r\n");
     
  18. Fredjam

    Fredjam Mitglied

    Registriert seit:
    7 Mai 2006
    Beiträge:
    362
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #18 Fredjam, 16 Feb. 2007
    Zuletzt bearbeitet: 16 Feb. 2007
    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 02111234567@astcc.agi creating local channel
    Feb 16 18:25:21 NOTICE[10986]: channel.c:2491 __ast_request_and_dial: Unable to request channel LOCAL/02111234567@astcc.agi
    == Manager 'fredastrisk' logged off from ip

    ach ja das ist die agi von Voiponcd wo das billing drüber läuft.
     
  19. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    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
     
  20. Fredjam

    Fredjam Mitglied

    Registriert seit:
    7 Mai 2006
    Beiträge:
    362
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #20 Fredjam, 17 Feb. 2007
    Zuletzt bearbeitet: 17 Feb. 2007
    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