Frage zum Default-Dialplan, verschiedene Extensions "zusammenführen"

Sargeras

Neuer User
Mitglied seit
10 Mrz 2005
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Ich zitiere mal kurz aus dem Default-Dialplan aus der extensions.conf. Das ist natürlich nicht mein richtiger Dialplan, aber an diesem einfachen Beispiel kann ich wohl noch am ehesten erklären, was ich überhaupt will.
Code:
[demo]
;
; We start with what to do when a call first comes in.
;
exten => s,1,Wait,1                     ; Wait a second, just for fun
exten => s,n,Answer                     ; Answer the line
exten => s,n,Set(TIMEOUT(digit)=5)      ; Set Digit Timeout to 5 seconds
exten => s,n,Set(TIMEOUT(response)=10)  ; Set Response Timeout to 10 seconds
exten => s,n(restart),BackGround(demo-congrats) ; Play a congratulatory message
exten => s,n(instruct),BackGround(demo-instruct)        ; Play some instructions
exten => s,n,WaitExten          ; Wait for an extension to be dialed.

exten => 2,1,BackGround(demo-moreinfo)  ; Give some more information.
exten => 2,n,Goto(s,instruct)

exten => 3,1,Set(LANGUAGE()=fr)         ; Set language to french
exten => 3,n,Goto(s,restart)            ; Start with the congratulations

Angenommen, ich habe nun ein Softphone, mit dem ich am Asterisk angemeldet bin. Dem Softphone weise ich den Standardkontext "demo" zu.

Nun kann ich z.B. die Rufnummer "s" wählen, und lande beim Asterisk-Willkommens-Gruß. Die Timeouts werden auch schön gesetzt, wie man das erwartet.

Wähle ich aber gleich die Rufnummer "2", wird sofort zur Extension "2" gesprungen. Ohne den Anruf mit "Answer" entgegenzunehmen, und ohne die Timeouts zu setzen.
Ich verstehe zwar, warum das bei diesem Dialplan so ist, aber ich hätte gerne, dass auch in diesem Fall sowas wie eine "Initialisierung" stattfindet.
Da frage ich mich doch, was die "Answer"-Funktion eigentlich bewirkt, wenn's auch ohne sie funktioniert?

Bei Asterisk 1.0.3 habe ich mal sowas benutzt:
Code:
exten => _.,1,Wait,1
exten => _.,2,Answer                     ; Answer the line
exten => _.,3,Set(TIMEOUT(digit)=5)      ; Set Digit Timeout to 5 seconds
exten => _.,4,Set(TIMEOUT(response)=10)  ; Set Response Timeout to 10

exten => s,5,mach irgendetwas

exten => 2,5,mach irgendetwas anderes

Mittlerweile habe ich Asterisk 1.2.10 installiert, aber dieser beschwert sich heftig über dieses "Catch-All-Kontrukt" mit "_."
Code:
WARNING[11756]: pbx_config.c:1741 pbx_load_module: The use of '_.' for an extension is strongly discouraged and can have unexpected behavior.  Please use '_X.' instead at line 284

Wenn ich aber "_X." anstatt dessen benutze, muss ich für die einstelligen Rufnummer wieder eine extra Extension schreiben, und das widerstrebt mir. Kann mir da vielleicht jemand auf die Sprünge helfen?
 
Sargeras schrieb:
Wenn ich aber "_X." anstatt dessen benutze, muss ich für die einstelligen Rufnummer wieder eine extra Extension schreiben, und das widerstrebt mir. Kann mir da vielleicht jemand auf die Sprünge helfen?

Probiers doch mal das aus:

exten => _X.,1,Wait,1
exten => X,1,Wait,1,

exten => _.,2,Answer ; Answer the line
exten => _.,3,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds
exten => _.,4,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10
usw...

Damit hättest du im ersten SChritten alle 1- und n-stelligen Nummern erfasst mit allen Ziffern und verhinderst das von Asterisk ungeliebte "catchall" in der Priorität eins.
Ob er allerdings dann immer noch meckert, wenn es dann bei 2 mit ._ weitergeht, musst du ausprobieren.

Gruß, Ingo
 
Vielleicht solltet Ihr noch mal das Handbuch lesen...

mfg Guard-X
 
Ich habe zu meinem Problem weder bei Google, noch in der Foren-Suchfunktion etwas gefunden. Auch das Asterisk-Handbuch hilft mir da nicht weiter. Könnte mir vielleicht jemand sagen, wonach ich genau suchen soll?

Weiß jemand, warum diese "catchall" Extension nicht (mehr) verwendet werden soll? Das würde mich auch interessieren.


Ingo's Vorschlag funktioniert erwartungsgemäß nicht, Asterisk ist es egal ob "_." bei Priorität 1 oder sonstwo vorkommt...
 
exten => s,

dieses s entspricht in etwa _.,

Das benutzt Asterisk, wenn er nichts besseres findet. Genaue Bedeutung selbst nachlesen!

2 ist besser als s, weil es genau passt. Damit hat 2 recht und nicht s. Somit wird exten => 2, ausgeführt.

Also bau dir einen Kontext incomming und setze dort alle Variablen und globalen Dinge, die du brauchst. Als letztes kommt ein goto(), ggf. auch mehrere (dann GotoIf) wenn du verschiedene Szenarien auflösen willst.

Und lass das Answer weg. Das brauchst du normalerweise nicht. Deine Anrufer brauch nicht zu zahlen, wenn Asterisk durch die Dialpläne saust und zum Schluß vielleicht gar keiner zu Hause ist.
 
Danke für deine Antwort, leider funktioniert es nicht so wie gedacht:

Asterisk hängt über einen S0 Bus an einer Telefonanlage, die Asterisk-Durchwahl ist 85, eingehende Anrufe landen im Context capi-incoming:
Code:
[capi-incoming]
exten => s,1,Macro(set-vars)
exten => s,n,Goto(irgendwas)

Wenn ich nun Asterisk anrufe, sehe ich folgende Debug Ausgaben:
Code:
    -- CONNECT_IND (PLCI=0x301,DID=85,CID=214,CIP=0x10,CONTROLLER=0x1)
Aug 31 15:52:48 NOTICE[11752]: chan_capi.c:2689 start_pbx_on_match: DIVA#02: did not find exten for '85', ignoring call.
  == DIVA#02: Interface cleanup PLCI=0x301
Ich vermute mal, dass dieses Verhalten (wenn keine passende Extension gefunden wird, wird "s" benutzt) nur bei früheren Asterisk Version funktioniert hat - bei meiner Version 1.2.10 geht es aber scheinbar nicht mehr.

Ich werde dann ähnliche Extensions eben einzeln definieren, auch wenn man es theoretisch vielleicht zusammenfassen könnte.
 
Kostenlos!

Statistik des Forums

Themen
248,857
Beiträge
2,302,996
Mitglieder
378,505
Neuestes Mitglied
Jk77