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

Verzögerung bei Callfile

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von Dani_CH, 16 Apr. 2005.

  1. Dani_CH

    Dani_CH Neuer User

    Registriert seit:
    23 Okt. 2004
    Beiträge:
    68
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo zusammen

    Wenn ich mit meinem Handy den Asterisk-Server anrufe, nimmt der gar nicht ab, sondern startet direkt ein Callback auf mein Handy.

    Dies wird mit einem Callfile realisiert.

    Leider versucht der jeweils gerade anzurufen, wenn ich den Anruf noch nicht mal abgebrochen habe. Deshalb kommt es zu einer enormen Verzögerung.

    Kann mir jemand sagen, wie ich eine Verzögerung ins Callfile einbaue?

    Ich habe ursprünglich in die Callback-Extension am Anfang ein wait(5) reingebaut, aber dies funktioniert komischerweise nicht...

    Besten Dank für Eure Hilfe!!
     
  2. ecco

    ecco Neuer User

    Registriert seit:
    28 Okt. 2004
    Beiträge:
    174
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Am einfachsten mit dem Programm, dass auch den Callfile erzeugt. Im Callfile selbst kann man nicht verzögern (soweit ich weiß).
    Elegant wäre es, fork zu verwenden und den einen Teil zum Asterisk zurück kehren zu lassen.
     
  3. Dani_CH

    Dani_CH Neuer User

    Registriert seit:
    23 Okt. 2004
    Beiträge:
    68
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das Callfile wird eben direkt in der Extension drin erstellt....
     
  4. ecco

    ecco Neuer User

    Registriert seit:
    28 Okt. 2004
    Beiträge:
    174
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    *grübel* wie das - dafür muss in eine Datei geschrieben werden.
    Am einfachsten wäre wohl, einen eigenen Context zu definieren, in dessen h extension zu warten und den file zu schreiben... sprich

    [normalerAnrufContext]
    exten => 1234,1,Goto(callback,callme,1)

    [callback]
    exten => callme,1,Ringing
    exten => callme,2,Wait(15)
    exten => callme,3,Hangup

    exten => h,1,Wait(5)
    exten => h,2,Callfileerzeugen
     
  5. britzelfix

    britzelfix Gesperrt

    Registriert seit:
    28 Mai 2004
    Beiträge:
    1,099
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Braunschweig
    Dani!

    Wie wäre es, wenn Asterisk gleich mit
    einer Fehlermeldung antwortet, ansatt es
    klingeln zu lassen?

    Ich meine einen Anruf abzulehnen, ohne abgehoben
    zu haben. So wie ich verstanden habe gibt
    es dafür 2 Lösungen:
    durch das setzen der PRI_CAUSE Variable und
    durch priindication=oob.

    Mehr dazu hier:
    http://www.mail-archive.com/asterisk-users@lists.digium.com/msg84393.html


    Wäre nett zu hören, ob es funktioniert.

    Gruß
    britzelfix
     
  6. Dani_CH

    Dani_CH Neuer User

    Registriert seit:
    23 Okt. 2004
    Beiträge:
    68
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    dies mache ich mit folgendem code:

    Code:
    exten => 2,1,system(echo "Channel: SIP/${CALLERIDNUM}@sipcall" > /etc/asterisk/c
    exten => 2,2,system(echo "Context: callback" >> /etc/asterisk/call-files/callbac
    exten => 2,3,system(echo "Extension: s" >> /etc/asterisk/call-files/callback.cal
    exten => 2,4,system(echo "SetVar: CALLERIDNUM=xxx" >> /etc/asterisk/call-f
    exten => 2,5,system(echo "MaxRetries: 2" >> /etc/asterisk/call-files/callback.ca
    exten => 2,6,system(echo "RetryTime: 5" >> /etc/asterisk/call-files/callback.cal
    exten => 2,7,system(echo "WaitTime: 5" >> /etc/asterisk/call-files/callback.call
    
    exten => 2,8,system(cp /etc/asterisk/call-files/callback.call /var/spool/asteris
    
    Bis ich dann aber aufgehänt habe, hat der Asterisk bereits den ersten erfolglosen Anruf-Versuch hinter sich.
     
  7. Dani_CH

    Dani_CH Neuer User

    Registriert seit:
    23 Okt. 2004
    Beiträge:
    68
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Besten Dank für den Vorschlag. Der Anruf wird aber gar nicht abgenommen. Wenn Asterisk merkt, dass ich mit meinem Handy anrufe, wird nur das Callfile generiert und mehr passiert nicht.
     
  8. ecco

    ecco Neuer User

    Registriert seit:
    28 Okt. 2004
    Beiträge:
    174
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    OK, das ist natürlich die brutalst mögliche Variante.
    Aber letzlich müsstest du deine Callfile-Erzeugung mit meinem Vorschlag realisieren können: http://www.ippf.tk/forum/viewtopic.php?p=109047#109047

    Einfach bei CreateCallFile durch die Befehlsfolgen ersetzen und natürlich die 2 durch h ersetzen ;)
     
  9. Dani_CH

    Dani_CH Neuer User

    Registriert seit:
    23 Okt. 2004
    Beiträge:
    68
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ja, hat nun bestens geklappt!! Vielen herzlichen Dank!
     
  10. britzelfix

    britzelfix Gesperrt

    Registriert seit:
    28 Mai 2004
    Beiträge:
    1,099
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Braunschweig
    hier eben hat es auch geklappt,
    allerdings benutze ich dafür
    DeadAgi. Ich rufe an, höre den ersten Ton
    und breche ab. Danach kommt schon der
    Anruf von *.

    Wie von ecco vorgeschlagen:

    [callback]
    exten => s,1,Ringing
    exten => s,2,Wait(25)
    exten => s,3,HangUp
    exten => h,1,DeadAGI(callback.agi|SIP/1234/HandyNr)

    [incoming-context]

    exten => _0HandyNr,1,Goto(callback,s,1)

    Was mir noch fehlt: ich möchte gerne den callback-context
    etwas universeller gestallten und die anzurufende Nummer
    z.B. im Goto mit zu übergeben.

    exten => _0HandyNr,1,Goto(callback,s,1,0123456)

    geht das?


    Gruß
    britzelfix
     
  11. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    [globals]

    CBEXTEN => 99

    [incoming-context]

    exten => _0HandyNr,1,SetGlobalVar(CBEXTEN=${EXTEN})
    exten => _0HandyNr,2,Goto(callback,s,1)

    [callback]
    exten => s,1,Ringing
    exten => s,2,Wait(25)
    exten => s,3,HangUp
    exten => h,1,DeadAGI(callback.agi|SIP/1234/${CBEXTEN})

    Sollte aber wahrscheinlich auch mit lokaler channel Variable statt einer globalvar gehen.

    [Edit]
    Wenn mehr als ein callback auf einmal ausgeführt wird/zu erwarten ist sollte man sowieso eher eine channel variable nehmen, einfach SetVar statt SetGlobalVar und Eintrag unter [globals] sparen.

    Gruß,
    Tin
     
  12. britzelfix

    britzelfix Gesperrt

    Registriert seit:
    28 Mai 2004
    Beiträge:
    1,099
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Braunschweig
    danke, das klappt schon ganz gut.

    Ich habe den callback-context noch
    in ein Macro gepackt, so daß ich jetzt
    nur

    exten => _XHandyNr,1,Macro(callback,SIP/012345/${EXTEN})

    ausführen brauche.

    Gruß
    britzelfix
     
  13. speedy1980

    speedy1980 Mitglied

    Registriert seit:
    13 Okt. 2004
    Beiträge:
    592
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Man könnte dem Callfile auch ein Erzeugungsdatum in der Zukunft geben (Asterisk sollte es zu der Zeit dann ausführen) oder im Callfile einfach die Option für eine Wiederholung des Rufes reinsetzen. Dann geht es auch.
     
  14. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    also ich mache das auch direkt im Anrufcontext.
    Zuerst ein Wait(1)
    dann ein System(cp xxxx.call nach ..../outgoing)
    und danach ein Hangup()

    Die Callfiles habe ich vorher erstellt - da ich callback nur auf fest definierten nummern erlaube. durch das hangup() ist mein Handy sofort wieder erreichbar. ansonsten sind noch 3 retry´s konfiguriert...

    cu
    thorsten gehrig
     
  15. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das hangup wird dennoch erst wirklich NACH dem AgiScript-Return durcheführt.
    Denn genau da liegt derzeit mein Problem mit meinem CallbackScript.
    Denn der User hört leider kein Auflegen, sondern "nichts"...

    Laut Debug ist dies auch korrekt, da das callback.agi ein paar Sekunden wartet, dann das erstellte Callfile verschiebt und zurückkehrt.
    Und erst DANN wird das Hangup abgeschlossen und im Tel kommt das "tuten"...
     
  16. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hmm... Mitlerweil glaub ich das ich unrecht hab und es eigentlich funzen müsste...
    Scheinbar liegt das problem, dass mein Client(Handy) kein Aufleg-Signal bekommt woanders:

    Code:
    -- Executing Hangup("SIP/49xxxxxxxxx-f5af", "") in new stack
    == Spawn extension (callback-withoutcallid, t, 3) exited non-zero on 'SIP/49xxxxxxxxx-f5af'
    
    jemand Ahnung?
     
  17. britzelfix

    britzelfix Gesperrt

    Registriert seit:
    28 Mai 2004
    Beiträge:
    1,099
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Braunschweig
    @Flash

    Ehrlich gesagt ich weiß nicht. DeadAgi agiert wenn eine der 2 Seiten
    aufgelegt hat. Ich habe es verwendet, weil mein Handy etwas lahm
    reagiert wenn die Gegenseite auflegt.
    Also habe ich * angerufen, 1-2 Klingeln lassen, dann am Handy aufgelegt.
    * hat garnicht erst abgenommen, reagiert aber auf das Auflegen
    der Gegenseite und versucht nicht mehr ein Gespräch aufzubauen,
    sondern löst beide Channel auf und vorher oder nachher wird das
    script ausgeführt, welches den Rückruf initiert.

    Gruß
    britzelfix
     
  18. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Natürlich funktioniert an sich alles, da ich ja auch auflege nach 1-2 Sekunden und das callback.agi eh 10Sekunden wartet und dann die Channels eh aufgelöst sind und der Rückruf funzt...

    Aber jemand anders, der nun auf ein auflegen bzw. abweisen der Gegenstelle (der CallbackServer) wartet, wartet ewig und bekommt dann wohl den Callback garnicht mit, da dieser ein Besetzt bekommt...

    Das ist ärgerlich und ich will nun herausbekommen, ob das Auflegen Asterisk-Seitig nicht funzt, oder woran obiger Fehler liegen könnte...
     
  19. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    hi
    ich würde dann das verhalten des callbackscripts verändern....
    ich schiebe das callfile direkt in den outgoing ordner - und habe trotzdem auf meinem mobiltelefon einige sekunden zwischen besetztzeichen und dem rückruf.
    und im zweifelsfall kommt halt erst der 2. versuch durch - dafür hat man ja die einstellung der rückrufversuche....

    gruß
    Thorsten Gehrig
     
  20. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    ach aufs einfachste kommt man nicht... *betriebsblind*

    natürlich hast du recht und ich hab die 10sekunden warten aus dem callback.agi rausgenommen...
    somit schliesst das DeadAgi sofort ab und der Anrufer bekommt das Abweisen direkt...

    nun hab ich einfach vor dem Dial in der Extension die sekunden warten lassen und gut ist ;-) Retry's sind da ja eh nicht nötig, da der User nach 10 Sekunden getute locker aufgelegt haben sollte :p