SIP Fallback auf CAPI

D-Trix

Neuer User
Mitglied seit
11 Jul 2005
Beiträge
127
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich stehe gerade glaube ich ein bißchen auf dem Schlauch.

Asterisk soll über Capi raustelefonieren, sobald ein Anruf über das SIPprovider-Festnetz-Gateway nicht möglich ist (Internetverbindung weg, DNS-Ausfall, SIP-Provider Ausfall etc.)

Ich denke mal über über Dialstatus kann ich das nicht abfragen, denn da dürfte doch keine Antwort kommen, wenn der SIP-Provicer nicht erreichbar ist?
(NOANSWER bedeutet doch Klingeln und keiner geht ran, und CHANUNAVAIL wenn der angerufene SIP account nicht registerd ist?)

Wäre es cleverer abzufragen ob der Dialstatus [glow=red:82a2ff60e8]NICHT [/glow:82a2ff60e8](NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) und dann auf capi zu springen? Oder gibt es keinen Dialstatus wenn die Internetverbindung weg ist?

Oder besser mit der +101 sprungregel? Greift die denn in meinem Szenario?
 
Wenn ich mich richtig erinnere sollte DIALSTATUS bei einem Fehler auf CONGESTION gesetzt sein.
 
Also so in etwa?

(...)
exten => _0X.,201,Dial(SIP/${EXTEN}@sipsnipout,60,rtT)
exten => _0X.,202,GotoIf($[${DIALSTATUS} = CONGESTION]?600)
exten => _0X.,203,Congestion()
exten => _0X.,204,HangUp()
exten => _0X.,302,Congestion()
exten => _0X.,303,HangUp()

exten => _0X.,600,NoOp(SIP-Hauptprovider ist zur Zeit nicht erreichbar. Probiere ueber ISDN)
exten => _0X.,601,Dial(CAPI/99:0${EXTEN},60,rtT)
exten => _0X.,602,Congestion()
exten => _0X.,603,HangUp()
(...)


Aber dann habe ich noch mal zwei prinzipielle Fragen:
1. Wann tritt 203+205 in kraft?
2. Wann tritt 302+303 in kraft?
 
204 und 303 werden nie ausgefuehrt, weil Congestion das Gespraech beendet. 302 wird angesprungen, wenn die gewaehlte Nummer besetzt ist. Bleibt also noch 203. Das wird bei CHANUNAVAIL und NOAWNSER angesprungen.
 
(...)
exten => _0X.,201,Dial(SIP/${EXTEN}@sipsnipout,60,rtT)
exten => _0X.,202,GotoIf($[${DIALSTATUS} = CONGESTION]?600)
exten => _0X.,203,Hangup() ; bei CHANUNAVAIL und NOANSWER
exten => _0X.,302,Busy() ; bei BUSY

exten => _0X.,600,NoOp(SIP-Hauptprovider ist zur Zeit nicht erreichbar. Probiere ueber ISDN)
exten => _0X.,601,Dial(CAPI/99:0${EXTEN},60,rtT)
exten => _0X.,602,HangUp()
(...)

Ah so langsam verstehe ich. Noch nicht ganz klar wäre mir allerdings noch der zeitliche Aspekt.

201: wird ausgeführt. kommt busy springt er sofort zu 302. Kommt congestion, chanunavail wird sofort die 202 angesprungen, kommt noanswer wird erst nach dem timeout von 60sek die 202 angesprungen.

202: springt bei congestion sofort nach 600. Bei CHANUNAVAIL und NOANSWER springt er zur 203 und legt auf.

Nicht ganz oder?
Gar nicht so einfach wie es auf den ersten Blick aussieht...
 
NOANSWER heisst, dass der Angerufene nicht innerhalb von 60s abgehoben hat. Es heisst aber nicht, dass der Asterisk gar keine Antwort per SIP erhalten hat. Wenn keine Verbindung zum Server besteht ist das CONGESTION oder evtl. CHANUNAVAIL.
 
Okay.
Habe ich das denn zeitlich korrekt begriffen? Augenmerk liegt auf die Wörter "sofort" und "timeout":


201: wird ausgeführt. kommt busy springt er sofort zu 302. Kommt congestion, chanunavail wird sofort die 202 angesprungen, kommt noanswer wird erst nach dem timeout von 60sek die 202 angesprungen.

202: springt bei congestion sofort nach 600. Bei CHANUNAVAIL und NOANSWER springt er zur 203 und legt auf.
 
D-Trix schrieb:
kommt noanswer wird erst nach dem timeout von 60sek die 202 angesprungen

Die Formulierung ist nicht ganz korrekt. Vor dem Timeout ist der Status noch unbekannt. Erst durch das Timeout wird der Status auf NOANSWER gesetzt.
 
Ok Danke für deine Hilfe! :)
 
Gibt es bei asterisk eigentlich eine art ODER-verknüpfung?

exten => _0X.,202,GotoIf($[${DIALSTATUS} = CONGESTION | CHANUNAVAIL]?600)
 
Also das vorhaben mit congestion hat keine wirkung. heute hatte ich beim sipprovider unauthorized und proxy-authentication meldungen, da war von fallback nichts zu spüren ;)

Hat jemand eine Idee wie man das lösen kann?
Vielleicht wirklich testen ob der Dialstatus NICHT (NOANSWER, BUSY, oder ANSWER) ist. Aber wie macht man eine ODER verknüpfung, wenn möglich NEGIERT?

exten => _0X.,202,GotoIf($[${DIALSTATUS} [highlight=red:5626fb938b]!=[/highlight:5626fb938b] BUSY [highlight=red:5626fb938b]|[/highlight:5626fb938b] ANSWER [highlight=red:5626fb938b]|[/highlight:5626fb938b] NOANSWER]?600)
 
Hmm kann sein, dass * da auf n+101 springt. Mach die 302 mal besser weg. Dann wird auf jeden Fall 202 angesprungen und dann kannst du ja mit GotoIf entsprechend verzweigen.
 
Hm so?

exten => _0X.,201,Dial(SIP/${EXTEN}@sipsnipout,60,rtT) ; versuche über SIP
exten => _0X.,202,GotoIf($[${DIALSTATUS} = "NOANSWER"]?600:203) ;wenn normaler Status zurückgegeben wird, gehe zu 600 und mache nichts
exten => _0X.,203,GotoIf($[${DIALSTATUS} = "BUSY"]? 600:204) ;wenn normaler Status zurückgegeben wird, gehe zu 600 und mache nichts
exten => _0X.,204,GotoIf($[${DIALSTATUS} = "ANSWER"]?600:205) ;wenn normaler Status zurückgegeben wird, gehe zu 600 und mache nichts
exten => _0X.,205,Dial(CAPI/contr1/0${EXTEN},60,rtT) ;da anscheinend keiner der drei normalen Stati zurückgegeben wurde, ist ein Fehler aufgetreten. Versuche über CaPI

exten => _0X.,600,NoOP


oder wäre das eine bessere Möglichkeit?

(...)
exten => _0X.,201,Dial(SIP/${EXTEN}@sipsnipout,60,rtT) ; wenn unten keinen regulärer Status gefunden wird, dann wähle über sip,
exten => _0X.,202,Dial(CAPI/contr/0${EXTEN},60,rtT)
exten => _0X.-NOANSWER,hangup
exten => _0X.-BUSY,busy
exten => _0X.-ANSWER,NoOP
(...)


bzw. geht das überhaupt?
 
Nimm besser die erste Variante. Bei der 2. fehlt erstens mal ein Goto und ausserdem kann der Punkt nur am Ende stehen.
 
Ich benutze chanisavail.

Sieht in etwa so aus:
Code:
exten => s,105,ChanIsAvail(SIP/${ARG2})						; SIP-Provider verfügbar ?
exten => s,106,GotoIf($["${notext}" = "1"]?108)					; Textmeldungen senden ?
exten => s,107,SendText('SIP:'${ARG3}'@'${ARG2})
exten => s,108,Dial(SIP/${ARG3}@${ARG2},60)					; ja -> über SIP-Provider wählen
exten => s,109,GotoIf($[${DIALSTATUS} = CANCEL]?:206)				; falls Wählen über Sip-Provider nicht erfolgreich mit 206 weitermachen
exten => s,110,Goto(default,s-${DIALSTATUS},1)
 
kannst du mal 106+107 genauer erklären?
 
106 & 107 haben mit dem Fallback nicht direkt zu tun.

Ich sende an meine Endgeräte Textnachrichten, über welche "Leitung" der Ruf rausgeht.
Übermanche Channel (z.B. chan_capi) ist es nicht möglich ist, Textmeldungen zu senden und wenn man es doch versucht, so bricht dabei die Verbindung ab.
Deshalb prüfe ich vorher (oben nicht zu sehen), über welche Channel die Verbindung kommt und setze ggf. die NoText-Variable auf 1.
Ist NoText=1, dann wird das Senden der Texmeldung überprungen.

Du kannst also beide Prioritäten weglassen - mußt dann natürlich die folgenden anpassen (minus 2).
 
Hi,

arbeite ich nach dem Beispiel von Fux, kommt immer folgendes:

Fux schrieb:
Code:
exten => s,109,GotoIf($[${DIALSTATUS} = CANCEL]?:206)

Oct 26 17:06:17 WARNING[5124]: ast_expr.y:475 ast_yyerror: ast_yyerror(): syntax error: syntax error; Input: = CANCEL

Setze ich so: "${DIALSTATUS}" und "CANCEL" in Anführungsstriche, bekomme ich immer den Rückgabewert 0. Immer.
Wird dadurch etwa der reine String verglichen?
Wer kann helfen, dass ich auf die Variablen CANCEL und CHANUNAVAIL prüfen kann?

Michael
 
Hallo an alle,

da das alles für mich irgendwie nicht so recht funktioniert hat, habe ich für mich nun eine eigene Lösung erstellt.
Im Kontext wird auf das vorhandensein der Kanäle SIP und ZAP geprüft, in meiner extensions.conf als globale Variablen $CHAN_EXT_VOIP_SIPGATE und $TRUNK_TCOM definiert.

Es wird eine neue Variable erzeugt (NEWCHAN), dessen Wert der Name des Kanals ist, der zur Zeit der Überprüfung verfügbar ist/war.

Code:
[voip-trunk-outgoing-sipgate]
exten => _${TRUNKINIT}.,1,NoOp(${CHAN_EXT_VOIP_SIPGATE} AND ${TRUNK_TCOM})
exten => _${TRUNKINIT}.,2,ChanIsAvail(${CHAN_EXT_VOIP_SIPGATE}&${TRUNK_TCOM})
exten => _${TRUNKINIT}.,3,NoOp(verfuegbarer Kanal: ${AVAILCHAN})
exten => _${TRUNKINIT}.,4,Cut(NEWCHAN=AVAILCHAN,/,1)
exten => _${TRUNKINIT}.,5,NoOp(verfuegbarer Kanal: ${NEWCHAN})
exten => _${TRUNKINIT}.,6,GotoIf($["${NEWCHAN}" = "SIP"]?8:7)
exten => _${TRUNKINIT}.,7,GotoIf($["${NEWCHAN}" = "Zap"]?15:14)
exten => _${TRUNKINIT}.,8,NoOp(Outgoing call via SIPGATE)
exten => _${TRUNKINIT}.,9,SetCallerID(SIPGATE-ID)
exten => _${TRUNKINIT}.,10,SetLanguage(de)
exten => _${TRUNKINIT}.,11,Dial(${DIALTRUNKSIP}/${EXTEN:1}@${CHAN_EXT_VOIP_SIPGATE_NAME},${RINGTIME},r)
exten => _${TRUNKINIT}.,12,Congestion
exten => _${TRUNKINIT}.,13,Busy
exten => _${TRUNKINIT}.,14,Hangup
exten => _${TRUNKINIT}.,15,Goto(tcom-trunk-outgoing,${TRUNKTCOMINIT}${EXTEN:1},1)

Vielleicht hilft es ja dem einen oder anderen... ;-)

Michael
 
Hallo,
könntest du eventulle deine Komplette Extensions.conf posten. das wäre etwas nachvollziehbarer für mich. das wäre echt nett.
 
Kostenlos!

Statistik des Forums

Themen
248,461
Beiträge
2,291,914
Mitglieder
377,884
Neuestes Mitglied
Tomzefix