Mehrere Provider und Wahlregeln mit Fallback

PsychoMantis

Aktives Mitglied
Mitglied seit
18 Dez 2005
Beiträge
2,539
Punkte für Reaktionen
10
Punkte
38
Wie kann man mehrere Provider mit entsprechenden Wahlregeln nutzen? In freepbx ist das einfach, aber wie löst man das im nackten Asterisk?

sip.conf
Code:
[general]
...

[provider1]
....
....
call-limit=1

[provider2]
....
....
call-limit=1

[provider3]
....
....
call-limit=1

[provider4]
....
....
call-limit=1

Was muss ich nun in die extensions.conf eintragen, damit z.B. die 0800... über den ersten Provider geht, und wenn die Leitung des ersten Providers bereits genutzt wird, soll der zweite genommen werden usw (Anmerkung: Pro Provider ist nur ein gleichzeitiges Gespräch möglich, daher steht da auch call-limit=1).

Ich habe es so probiert:

Code:
...

[outgoing]
exten => _0800.,1,Dial,SIP/${EXTEN}@provider1|45|r
exten => _0800.,1,Dial,SIP/${EXTEN}@provider2|45|r
exten => _0800.,1,Dial,SIP/${EXTEN}@provider3|45|r

Aber so geht das nicht.
 
Zuletzt bearbeitet:
lieber psychoman *G*

also mit call limit kannst du festlegen, wieviel gespräche über ein anbieter gehen.
dann müsstest du in den wahlregeln festellen, ob diese anzahl überschritten ist oder nicht.

ich würde das bevor gewählt wird mit einem if konstrukt machen.
schau dir mal
http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+ChanIsAvail
an...

damit sollte das machbar sein:)

edit: obwohl es sicher noch andere möglichkeiten gibt :)
 
oder so

Diese Lösung funktioniert wie folgt:

Jeder Anwahlkontext sieht wie der untenstehende für voipstunt aus. In Zeile 1 wird eine Gruppe voipstunt definiert, wenn sie noch nicht vorhanden ist. Ist sie verhanden wird von Asterisk automatisch der Gruppenzähler um 1 hochgezählt. Da ich nur eine Leitung habe, kann dieser Wert max. 1 sein (durch Zeile 1 gesetzt). Sollte der Wert aber größer sein, also die Linie besetzt sein und durch die Zeile 1 weiter hochgezählt worden sein, ist die Leitung belegt. Die Entscheidung erfolgt in Zeile 2. Ist der Account frei wird in Zeile 3 gewählt, ansonsten in den Kontext [belegt] gesprungen und wenn ein andere Accounts hinterlegt sind, die anderen Accounts probiert. Sind alle Accounts belegt, wird busy signalisiert und aufgelegt. Ist keine Ersatzlinie definiert, erfolgt ebenfalls busy.

Gehen über die Accounts auch Gespräche ein, muß der Inhalt der Zeile 1 auch in den entsprechenden incomming-context, sonst wird belegt durch eingehenden Anruf nicht erkannt.

[voipstunt]
exten => _X.,1,Set(GROUP()=voipstunt)
exten => _X.,2,GotoIf($["${GROUP_COUNT(voipstunt)}">"1"]?5:3)
exten => _X.,3,Dial(SIP/${EXTEN}@voipstunt)
exten => _X.,4,Hangup
exten => _X.,5,Goto(belegt,${EXTEN},1)

[belegt]
exten => _0049.,1,GotoIf($["${GROUP_COUNT(sipdiscount)}">"1"]?3:2)
exten => _0049.,2,Goto(sipdiscount,${EXTEN},1)
exten => _0049.,3,GotoIf($["${GROUP_COUNT(voipstunt)}">"1"]?5:4)
exten => _0049.,4,Goto(voipstunt,${EXTEN},1)
exten => _0049.,5,GotoIf($["${GROUP_COUNT(voipcheap)}">"1"]?7:6)
exten => _0049.,6,Goto(voipcheap,${EXTEN},1)
exten => _0049.,7,Playtones(busy)
exten => _0049.,n,Hangup
exten => _0041.,1,GotoIf($["${GROUP_COUNT(sipdiscount)}">"1"]?3:2)
exten => _0041.,2,Goto(sipdiscount,${EXTEN},1)
exten => _0041.,3,GotoIf($["${GROUP_COUNT(voipbuster)}">"1"]?5:4)
exten => _0041.,4,Goto(voipbuster,${EXTEN},1)
exten => _0041.,5,GotoIf($["${GROUP_COUNT(voipcheap)}">"1"]?7:6)
exten => _0041.,6,Goto(voipcheap,${EXTEN},1)
exten => _0041.,7,Playtones(busy)
exten => _0041.,n,Hangup
exten => _0033.,1,GotoIf($["${GROUP_COUNT(voipbuster)}">"1"]?3:2)
exten => _0033.,2,Goto(voipbuster,${EXTEN},1)
exten => _0033.,3,GotoIf($["${GROUP_COUNT(voipstunt)}">"1"]?5:4)
exten => _0033.,4,Goto(voipstunt,${EXTEN},1)
exten => _0033.,5,GotoIf($["${GROUP_COUNT(voipcheap)}">"1"]?7:6)
exten => _0033.,6,Goto(voipcheap,${EXTEN},1)
exten => _0033.,7,Playtones(busy)
exten => _0033.,n,Hangup
exten => _0034.,1,GotoIf($["${GROUP_COUNT(sipdiscount)}">"1"]?3:2)
exten => _0034.,2,Goto(sipdiscount,${EXTEN},1)
exten => _0034.,3,GotoIf($["${GROUP_COUNT(voipstunt)}">"1"]?5:4)
exten => _0034.,4,Goto(voipstunt,${EXTEN},1)
exten => _0034.,5,GotoIf($["${GROUP_COUNT(voipcheap)}">"1"]?7:6)
exten => _0034.,6,Goto(voipcheap,${EXTEN},1)
exten => _0034.,7,GotoIf($["${GROUP_COUNT(voipbuster)}">"1"]?9:8)
exten => _0034.,8,Goto(voipbuster,${EXTEN},1)
exten => _0034.,9,Playtones(busy)
exten => _0034.,n,Hangup
exten => _00XX.,1,Playtones(busy)
exten => _00XX.,n,Hangup
 
Code:
exten => _0800.,1,Dial,SIP/${EXTEN}@provider1|45|r
exten => _0800.,2,Dial,SIP/${EXTEN}@provider2|45|r
exten => _0800.,3,Dial,SIP/${EXTEN}@provider3|45|r

So geht es, aber welche Nachteile hat diese Lösung und welche Vorteile hat die Lösung vom vorherigen Post?
 
So geht es, aber welche Nachteile hat diese Lösung

Deine Lösung wählt die 0800... dreimal an, die prüfst nicht, ob eine weitere Anwahl überhaupt Sinn macht.
Da du mit SIP/${EXTEN}@provider1 anrufst und nicht mit goto wird z.B. dein Calllimit nicht beachtet, denn Asterisk springt nicht in den Kontext sondern in die sip.conf.


Meine oben beschriebene Lösung kann ich flexibel von jeder Stelle im Dialplan aus anspringen.
 
Mit deiner oben beschriebenen Lösung meinst du Post Nummer 3, oder?

Was gibt es noch für möglichkeiten? Das ist ja wohl bestimmt nicht die einzigste. Carlofbf hat ja was von chanisavail geschrieben.
 
Deine Lösung wählt die 0800... dreimal an, die prüfst nicht, ob eine weitere Anwahl überhaupt Sinn macht.
Da du mit SIP/${EXTEN}@provider1 anrufst und nicht mit goto wird z.B. dein Calllimit nicht beachtet, denn Asterisk springt nicht in den Kontext sondern in die sip.conf.


Meine oben beschriebene Lösung kann ich flexibel von jeder Stelle im Dialplan aus anspringen.

naja, die zeilen werden ja nacheinander abgearbeitet. wenn er nach erfolg von zeile zb 2 auflegt, wird zb 3 auch nicht ausgeführt. trotzdem recht häßlich:p

grüße
 
Das ist ja wohl bestimmt nicht die einzigste.

Mit Dialstatus das Ergebnis der Anwahl abfragen und dann entsprechend verzweigen. Hat gegenüber chanisavail den Vorteil dass alle Stati behandelt werden können. Wird aber auch etwas aufwendiger.

Also z.B. so:
Code:
[sipgate]
exten => _X.,1,Dial(SIP/${EXTEN}@${sipgate-id},60,Tt)
exten => _X.,n,Goto(s-${DIALSTATUS},1)
exten => _X.,n,Hangup

exten => _s-.,1,Goto(fehler,s-${DIALSTATUS},1)
in [fehler] sagst du dann, was mit den einzelnen Ergebnissen zu tun ist, also mit anderem Provider wählen, auflegen ...


Im Endeffekt kommt es darauf an, einen für dich akzeptablen Weg zwischen einfach und aufwendig zu finden.
 
Wie sieht denn so was bei euch aus? Ich meine, warum soll ich das Rad nochmal erfinden. Ich würde am liebsten irgendeine (und auch noch so hochkomplizierte) extensions.conf nehmen, und die dann einfach an meine Bedürfnisse anpassen.

Nachtrag: @ kombijuder Ich habe mir schon deinen Beitrag hier angeschaut, aber mir ist noch nicht klar, wie bei dir "exten => axxeso..." aussieht. und bin etwas schlauer geworden.

Was haltet ihr davon?
Code:
exten => _0800.,1,Dial(SIP/${EXTEN}@provider1,60,Tt)
exten => _0800.,2,ExecIf($[ ${DIALSTATUS} = CHANUNAVAIL ],Dial,SIP/${EXTEN}@provider2|45|r)
exten => _0800.,3,ExecIf($[ ${DIALSTATUS} = CHANUNAVAIL ],Dial,SIP/${EXTEN}@provider3|45|r)
exten => _0800.,4,Hangup

Es funktioniert. Aber vielleicht habe ich ja nochwas übersehen.

naja, die zeilen werden ja nacheinander abgearbeitet. wenn er nach erfolg von zeile zb 2 auflegt, wird zb 3 auch nicht ausgeführt.

Wie meinst du das genau? Wenn wer nach Erfolg von Zeile 2 wie auflegt? Trifft das immer noch zu?



Da du mit SIP/${EXTEN}@provider1 anrufst und nicht mit goto wird z.B. dein Calllimit nicht beachtet, denn Asterisk springt nicht in den Kontext sondern in die sip.conf.

Ich bin mir zwar jetzt nicht sicher, wie du das meinst, aber ich glaube du hast mit dieser Aussage unrecht. Wenn in der sip.conf "call-limit=1" steht und schon ein Gespräch über diesen Provider geführt wird, dann höre ich im Telefon, welches an meiner FBF angeschlossen ist nur ein Besetztzeichen und sehe in der CLI folgendes:

Code:
    -- Executing [10000@default:1] Dial("SIP/30-f6f0e098", "SIP/10000@provider1|60|Tt") in new stack
    -- Called 10000@provider1
    -- SIP/provider1-08203a18 answered SIP/30-f6f0e098
    -- Executing [10000@default:1] Dial("SIP/0841179xxxx-f6f1e8e0", "SIP/10000@provider1|60|Tt") in new stack
[Mar 28 19:18:53] ERROR[31227]: chan_sip.c:3234 update_call_counter: Call to peer 'provider1' rejected due to usage limit of 1
    -- Couldn't call 10000@provider1
  == Everyone is busy/congested at this time (0:0/0/0)
  == Auto fallthrough, channel 'SIP/0841179xxxx-f6f1e8e0' status is 'CHANUNAVAIL'
  == Spawn extension (default, 10000, 1) exited non-zero on 'SIP/30-f6f0e098'
 
Zuletzt bearbeitet:
Erstmal wollte ich das verwenden:
Code:
exten => _0800.,1,Dial,SIP/${EXTEN}@provider1|45|r
exten => _0800.,2,Dial,SIP/${EXTEN}@provider2|45|r
exten => _0800.,3,Dial,SIP/${EXTEN}@provider3|45|r

Funktioniert super (ist Leitung 1 belegt, nimmt der automatisch die 2 und ist die belegt, wird die 3 genommen), nur wenn ich jetzt nach Zeile eins ein Busy erhalten (weil z.B. der Angerufene weggedrückt hat), dann wird Zeile 2 ausgeführt und wenn dann wieder ein Busy kommt, weil der Angerufene vielleicht wieder weggedrückt hat, dann wird Zeile drei ausgeführt. Das ist natürlich blöd.

So wird das Problem vermieden:
Code:
exten => _0800.,1,Dial(SIP/${EXTEN}@provider1,60,Tt)
exten => _0800.,2,ExecIf($[ ${DIALSTATUS} = CHANUNAVAIL ],Dial,SIP/${EXTEN}@provider2|45|r)
exten => _0800.,3,ExecIf($[ ${DIALSTATUS} = CHANUNAVAIL ],Dial,SIP/${EXTEN}@provider3|45|r)
exten => _0800.,4,Hangup
 
So wird das Problem vermieden:

Das hängt davon ab, was dein Provider dir zurückliefert. In deinem geschilderten Fall dürfte er dir das eigentlich nicht liefern, da bei weggedrückt eigentlich cancel geliefert werden müsste. Das erfasst deine Auswertung nicht.

Wenn es für dich ausreichend ist, nicht weiter reinknien, sondern anwenden. Wenn es einmal nicht mehr reicht, kannst du ja immer noch eine komplette Dialstatusauswertung einbauen.
 
Jetzt, wo ich mich mit Asterisk einigermaßen auskenne (war ja gar nicht so schwer), sieht meine Lösung so aus:
Code:
;Deutschland Mobil
exten => _01[567].,1,ExecIf($[${LEN(${EXTEN})} < 11],Playback,handynrzukurz)
exten => _01[567].,n,ExecIf($[${LEN(${EXTEN})} < 11],Hangup)
exten => _01[567].,n,Set,STRATO=strato
exten => _01[567].,n,Dial,SIP/${EXTEN}@strato1|90|L(1800000:60000)
exten => _01[567].,n,ExecIf($[${DIALSTATUS} = BUSY | ${DIALSTATUS} = NOANSWER],Goto,s-${DIALSTATUS}|1)
exten => _01[567].,n,Dial,SIP/${EXTEN}@strato2|90|L(1800000:60000)
exten => _01[567].,n,ExecIf($[${DIALSTATUS} = BUSY | ${DIALSTATUS} = NOANSWER],Goto,s-${DIALSTATUS}|1)
exten => _01[567].,n,Dial,SIP/${EXTEN}@strato3|90|L(1800000:60000)
exten => _01[567].,n,Goto,s-${DIALSTATUS}|1

exten => s-NOANSWER,1,Playback,keineantwort
exten => s-NOANSWER,2,Hangup
exten => s-BUSY,1,Busy
exten => s-CONGESTION,1,Playback,nrnichtvermittelbar
exten => s-CONGESTION,n,Hangup
exten => s-CHANUNAVAIL,1,Playback,alleleitungenbelegt
exten => s-CHANUNAVAIL,n,Hangup
exten => _s.,1,Hangup
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,195
Beiträge
2,247,818
Mitglieder
373,748
Neuestes Mitglied
fanti88
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.