0 für extern als Vorwahl sinnvoll?

sipgateuser

Mitglied
Mitglied seit
17 Jul 2008
Beiträge
564
Punkte für Reaktionen
0
Punkte
0
Ich bin vorsichtig, wenn ich etwas anders möchte als es häufig gemacht wird. In der Regel wird entweder eine Vorwahl für interne oder externe Gespräche verwendet, häufig also die 0 als Vorwahl für extern.

Kann man nicht einfach annehmen, dass mehr als 2 Stellen extern sein soll? Mit Notrufen komme ich mit dieser Annahme nicht in Konflikt.

Für mich stellt sich die Problematik speziell im Zusammenhang mit der ENUM-Abfrage, wo ja ein entsprechendes Format erzeugt werden muss.
 
Natürlich kann man das so annehmen. Genau so behandele ich es auch.
Das schöne am Matching bei Asterisk ist, dass es, wenn es mehrere Möglichkeiten zu matchen hat, den "exakteren" Treffer (also der, der am genausten beschrieben ist) wählt.

Hast du also diese Möglichkeiten in deinem Dialplan:
Code:
exten => _X.,1,.....
exten => _XX,1,.....
exten => _[12]X,1,......
Dann wird bei einer mehr als zweistelligen Zahl die erste Option genommen. Bei einer zweistelligen Zahl die nicht mit 1 oder 2 anfängt die zweite und bei einer zweistelligen Zahl die mit 1 oder 2 anfängt die dritte.
 
Dein 2. Beispiel verstehe ich nicht.

Code:
exten => _XX

Ist das hier nicht eine beliebige 2 stellige Zahl? bei "_NN" würde IMHO 1 und 0 nicht möglich sein, 2 aber schon.
 
_[12]X bedeutet eine zweistellige Zahl die mit 1 oder 2 anfängt. Dies ist eine exaktere Spezifikation als _XX welches einfach nur eine beliebige zweistellige Zahl ist. Wenn Asterisk jetzt eine Extension hat, die auf beides zutreffen würde (also z.B. "25"), dann wählt es die exaktere Spezifikation.

Aus diesem Grund gehen in meinem Beispiel alle zweistellige Zahlen die mit 1 oder 2 anfangen in die dritte Option - somit gehen nur zweistellige Zahlen die nicht mit 1 oder 2 anfangen (diese werden ja schließlich abgefangen) in die zweite Option.

Also nochmal zusammen fassen:
(1) _XX matched 00 bis 99
(1) _[12]X matched 10 bis 29
Wenn beide im gleichen context sind wird 10 bis 29 in (2) gelangen, der Rest (also 00 bis 09 und 30 bis 99) dann in (1).
 
Das schöne am Matching bei Asterisk ist, dass es [...] den "exakteren" Treffer (also der, der am genausten beschrieben ist) wählt.

Das Unschöne am Matching ist, dass man das so pauschal nicht sagen kann.
 
Das Unschöne am Matching ist, dass man das so pauschal nicht sagen kann.
Hmm, in welche Fällen nicht? Ich rede hier von Asterisk 1.4 nicht von 1.2 in der die sortier Reihenfolge noch anders war.

1.4 sortiert meines Wissens Stelle für Stelle nach der Präzision der Spezifikation.
In meinem Beispiel hat die erste Option (_X.) an der ersten Stelle 10 Möglichkeiten (0-9) und an der zweiten und jeder folgenden sehr sehr viele Möglichkeiten (a-zA-Z0-9 und diverse andere Zeichen).
Die zweite Option (_XX) hat an der ersten Stelle 10 Möglichkeiten und an der zweiten auch (da die zweite Stelle hier weniger Möglichkeiten hat als die zweite Stelle der ersten Option, wird die zweite Option der ersten bevorzugt)
Die dritte Option (_[12]X) hat an der ersten Stelle nur zwei Möglichkeiten (1 und 2) und wird somit vor den andere zwei (welche hier jeweils 10 Möglichkeiten haben) bevorzugt.
Matchingreihenfolge ist also: _[12]X, _XX, _X.
 
_[12]
Also nochmal zusammen fassen:
(1) _XX matched 00 bis 99
(1) _[12]X matched 10 bis 29

Da du meine conf-Dateien aus http://www.ip-phone-forum.de/showthread.php?t=172587 noch in Erinnerung hast, kannst du mir vermutlich leicht sagen, wo ich es am besten anpasse. Achtung ich habe mittlerweile die "Vorwahlen" um 1 erhöht. Es gibt also kein *20 mehr, das ist jetzt *21. *20 soll für ENUM-Abfragen verwendet werden.

Nehmen wir an, die Nummern von 20-29 und 40-49 sind interne Nummern, alles andere ist extern bzw. ungültig, zB 35

Somit müsste das in etwa so aussehen, oder?

Code:
exten => _[24]X

Mir ist aber nicht klar, ob ich das gleich hier rein schreiben kann:
bis jetzt:
Code:
[lokal]
exten => _NX,1,NoCDR()
exten => _NX,n,Goto(ankommend,${EXTEN}lokal,1)
wäre das also richtig?
Code:
[lokal]
exten => _[24]X,1,NoCDR()
exten => _[24]X,n,Goto(ankommend,${EXTEN}lokal,1)

Wird vor einer Nummer *20 oder *40 gewählt, soll eine ENUM-Abfrage durchgeführt werden.

Ich stelle mir es etwa so vor:

Code:
[enum23_out]
exten => _*20.,1 ....

[erlaubt23]
include => enum23_out
...

Bei http://www.ip-phone-forum.de/showthread.php?t=114483&page=2 steht ein Beispiel wie eine ENUM-Abfrage mit 0 als Vorwahl gemacht wird:

Code:
[52]
include=default
include=enum-go
[nachenum52]
include=lcr
include=outgoingsipgate.at


[53]
include=default
include=enum-go
[nachenum53]
include=lcr
include=outgoingsipgate.at


[54]
include=default
include=enum-go
[nachenum54]
include=lcr
include=outgoingsipgate.at


[55]
include=default
include=enum-go
[nachenum55]
include=lcr
include=outgoingsipgate.at





[enum-go]
; 0->lokales Ortsnetz, 00->Österreich, 000->Ausland
exten => _X.,1,Set(Nebenstelle=${CALLERIDNUM})
exten => _Z.,2,Goto(nachenum${Nebenstelle},${EXTEN},1)
exten => _0Z.,2,Goto(enum,43${EXTEN:1},1)
exten => _00Z.,2,Goto(enum,${EXTEN:2},1)



[enum]
exten => _Z.,1,Set(CALLERID(number)=0043720720xxx${Nebenstelle})
exten => _Z.,n,Set(enumlist=e164.org e164.arpa|tree=0)
exten => _Z.,n,While($["${SET(e164=${CUT(enumlist, ,${SET(tree=$[${tree} + 1])})})}" != ""])
exten => _Z.,n,Set(sipcount=${ENUMLOOKUP(+${EXTEN},sip,c,${e164})}|counter=0)
exten => _Z.,n,While($[${counter}<0${sipcount}])
exten => _Z.,n,Set(counter=$[${counter}+1])
exten => _Z.,n,Gotoif($["${SET(e=${ENUMLOOKUP(+${EXTEN},sip,${counter},${e164})})}"=""]?ew)
exten => _Z.,n,Playback(/mnt/kd/accessvoip/sounds/moo)
exten => _Z.,n,Dial(SIP/${e},120)
exten => _Z.,n(ew),EndWhile
exten => _Z.,n,EndWhile
exten => _Z.,n,GotoIf($["${DIALSTATUS}"=""]?ef)
exten => _Z.,n,Noop(${DIALSTATUS})
exten => _Z.,n,Congestion()
exten => _Z.,n,Hangup
exten => _Z.,n(ef),goto(enum-lcr,00${EXTEN},1)



; Enum lookup failed
[enum-lcr]
exten => _0043Z.,1,Goto(nachenum${Nebenstelle},0${EXTEN:4},1) 
exten => _00Z.,1,Goto(nachenum${Nebenstelle},${EXTEN},1)

Bei diesem Beispiel erahne ich worum es geht, verstehe es aber nicht ganz bzw. habe ich doch einen andere Situation.

Ich möchte, dass der Anrufer möglichst flexibel entscheiden kann, wie telefoniert wird. Vermutlich sind 90% der Nummern im Telefonbuch mit Providervorwahl hinterlegt. Damit ein gewisser Zwang zur Pflege des Telefonbuchs vorhanden ist, soll grundsätzlich ohne Providervorwahl nicht telefoniert werden können. *20 soll eine ENUM-Abfrage durchführen, wenn ein Eintrag vorhanden ist, direkt verbinden und wenn kein ENUM-Eintrag vorhanden ist einen "Standard-Provider" verwenden. Da ja alle Provider bereits über eine Vorwahl definiert sind, bräuchte man nur zB die *20 durch *22 ersetzen.

In erster Linie bin ich mir noch über die Struktur unklar.
 
Yep, die deine Änderungen an "Lokal" sind genau so wie du sie haben willst.
Du solltest vielleicht dir überlegen noch überlegen eine "i" Extension hinzuzufügen die abhebt und dem Benutzer sagt, dass er versucht hat ohne gültige Providervorwahl zu wählen (und die Nummer auch keine zweistellige lokale Nummer war).

Zum Enum Lookup: Warum machst du nicht prinzipiell immer ein lookup? Wenn ein SIP-Eintrag gefunden wird ruft er direkt über SIP dort an, wenn nicht dann nimmt er den durch die Vorwahl definierten Anbieter.
 
Interne Gespräche sind eher selten. Meine Prioriät liegt zur Zeit bei ENUM. Wenn nicht definierte Nummern gerufen werden, dann ist mir eine Meldung zur Zeit egal, wäre natürlich aber ganz nett. Bei zu vielen Änderungen fürchte ich, dass ich Fehler einbaue, die ich dann nicht so leicht entdecke. Du hast mir ja schon ein Beispiel gezeigt, wie das gehen kann.

Code:
exten => i,1,NoOp("Invalid extension dialed")
exten => i,n,Hangup()

Man müsste vermutlich nur die 2. Zeile entsprechend ersetzen. Da habe ich mich aber noch zu wenig eingelesen.

Mir geht es darum, dass ich immer mehr verstehe, wie alles zusammenhängt und die für mich wichtien Dinge zuerst.

Man könnte natürlich grundsätzlich ENUM abfragen. Ich möchte aber "gefühlsmäßig" auch eine Möglichkeit haben, dass ENUM nicht abgefragt wird. Die Überlegung ist noch etwas konfus. Ich kann mir folgende Situation vorstellen. "Normale"-Festnetz-Nummern werden in A von VOIP-Providern nicht abgefragt. Es gibt nun mehrere Festnetz-Nummern, die bei e164.org eintragen sind. Diese Nummern haben als Endgerät ein Notebook. Wenn dieses Notebook nun nicht online ist, komme ich bei automatischer Abfrage via ENUM nicht mehr zum "normalen" Festnetzanschluss. Inwieweit diese Konfiguration überhaupt sinnvoll ist, ist natürlich auch zu überlegen. Aber das wird auch die Erfahrung zeigen. Es ist die grosse Ausnahme, wenn ein anderer Anrufer eine ENUM-Abfrage für einen Festnetznummer macht, andererseits werden diese Gespräche dadurch auch kostenlos. Privat kann man es sich ja ein wenig leisten, etwas zu experimentieren.

Wie würdest du meine Situation weiter angehen? Wie passe ich die Telefonnumer an, sodass ein Format vorliegt, das eine ENUM-Abfrage ermöglicht? Ich denke das muss der nächste Schritt sein.

IMHO gebt also um diese Anpassung. Alles ist lokal, das mit einer Zahl von 1-9 anfängt, 0 ist Inland, 00 Ausland. Vermutlcih macht es auch keinen Sinn bei Notrufen eine ENUM-Abfrage zu machen. Ich denke man könnte alle 3stelligen Nummern, die mit 1 beginnen, von einer ENUM-Abfrage ausschließen und die Ortsvorwahl ergänzen. Keine Ahnung, ob es sinnvoll ist auch die Landesvorwahl zu ergänzen.

Code:
[enum-go]
; 0->lokales Ortsnetz, 00->Österreich, 000->Ausland
exten => _X.,1,Set(Nebenstelle=${CALLERIDNUM})
exten => _Z.,2,Goto(nachenum${Nebenstelle},${EXTEN},1)
exten => _0Z.,2,Goto(enum,43${EXTEN:1},1)
exten => _00Z.,2,Goto(enum,${EXTEN:2},1)
 
Code:
[FONT="Courier New"]exten => i,1,NoOp("Invalid extension dialed")
exten => i,n,Hangup()[/FONT]

Man müsste vermutlich nur die 2. Zeile entsprechend ersetzen.
Nicht ersetzen sodern zusätzlich an 2. Stelle ein Playback und ggf. Response code beim Hangup setzen (z.B. 604 "Does not exist anywhere") also
Code:
[FONT="Courier New"]exten => i,1,NoOp("Invalid extension dialed")
exten => i,n,Playback(invalid)
exten => i,n,Hangup(604) ;Does not exist anywhere[/FONT]

; 0->lokales Ortsnetz, 00->Österreich, 000->Ausland
Der Kommentar ist nich richtig. Im Dialplan
exten => _00Z.,2,Goto(enum,${EXTEN:2},1) ;00Z. = Ausland =Landesvorwahl in EXTEN enthalten (z.B. 0043555666777)
exten => _0Z.,2,Goto(enum,43${EXTEN:1},1) ;0Z. = Österrech 0 Weg dafür 43 dazu
exten => _Z.,2,Goto(nachenum${Nebenstelle},${EXTEN},1) ;alles andere

Nach dem Kommentar müsste es heisen
Code:
[enum-go]
; 0->lokales Ortsnetz, 00->Österreich, 000->Ausland
exten => _X.,1,Set(Nebenstelle=${CALLERIDNUM})
exten => _0Z.,2,Goto(enum,4355555${EXTEN:1},1) ;<-55555 mit deiner Ortsvorwahl ersetzen ;lokales Ortsnetz
exten => _00Z.,2,Goto(enum,43${EXTEN:1},1) ;Östereich
exten => _000Z.,2,Goto(enum,${EXTEN:2},1) ;Ausland
exten => _Z.,2,Goto(nachenum${Nebenstelle},${EXTEN},1) ;alles andere
 
Hangup(604) ist falsch, da sind keine SIP Fehlercodes erlaubt, nur ISDN cause codes.
 
Es geht ja darum die 0 für externe Gespräche wegzulassen und einen sinnvolle ENUM-Abfrage zu machen.

Ich stelle zur Diskussion:

Intern ist nur 20-29 und 40-49!

Code:
[enum-go]
; jede Nummer außer 20-29 und 40-49->lokales Ortsnetz, 0->Österreich, 00->Ausland

; intern
exten => _[24]X,1,Set(Nebenstelle=${CALLERIDNUM})

;lokales Ortsnetz
exten => _Z.,2,Goto(enum,4355555${EXTEN:1},1) ;<-55555 mit deiner Ortsvorwahl ersetzen ;lokales Ortsnetz

;Östereich
exten => _0Z.,2,Goto(enum,43${EXTEN:1},1) ;Östereich

 ;Ausland
exten => _00Z.,2,Goto(enum,${EXTEN:2},1) ;Ausland

exten => _[24]X,2,Goto(nachenum${Nebenstelle},${EXTEN},1) ;alles andere

Wie kann ich am besten Kontexte testen, ohne einen Anruf zu tätigen? Ich möchte das Ergebnis der zusammengesetzten Nummer auf der Konsole mit echo sehen, schaffe aber die Syntax nicht.
 
NoOp() ist Dein Freund:

Code:
exten => _00Z.,1,NoOp(== The quick brown fox jumps over the lazy dog ==)
 
Ich habe in einem Buch folgendes gefunden, ist das alternativ, oder geht es da um etwas anderes?

Code:
exten => 124,2,System(echo "This is a test of Festival" | /usr/bin/text2wave

Das sieht mir irgendwie nach bash aus, die von Asterisk aus aufgerufen wird.
 
Ja, dein Befehlt gibt auf der shell (oder bash) einen Text durch ein Pipe an ein Programm... Das hat aber nichts mit der Asterisk Console zu tun.
Wie Ottone gesagt hat, wenn du was auf der Console ausgeben willst benutze "NoOp".

Also z.B. so:
Code:
exten => _[24]X,1,NoOp("Interne Extension ${EXTEN} wurde gewählt!")
exten => _*20.,1,NoOp("Enum abfrage der nummer ${EXTEN:3} bitte!")
exten => _*2X.,1,NoOp("Anbieter ${EXTEN:1:2} soll ${EXTEN:3} anwählen")
 
Irgednwas mache ich da noch falsch

extension.conf
Code:
[test23_out]
exten => _*20.,1,Dial,SIP/${EXTEN:3}@23_yesss21|45|r
exten => _*20.,2,NoOp("Enum Abfrage der Nummer ${EXTEN:3} bitte!")

[erlaubt23]
include => test23_out

Code:
    -- Executing [*200043111111@erlaubt23:1] Dial("SIP/23-08214248", "SIP/0043111111@23_yesss21|45|r") in new stack
    -- Called 0043111111@23_yesss21
    -- SIP/23_yesss21-08210368 is making progress passing it to SIP/23-08214248
    -- SIP/23_yesss21-08210368 is ringing
  == Spawn extension (erlaubt23, *200043111111, 1) exited non-zero on 'SIP/23-08214248'

Ich sehe nicht ""Enum Abfrage ..."
 
Ohh, wahrscheinlich hast du ein Verboselevel < 3...
Auf der CLI:
Code:
set verbose 5
Du kannst auch beim reconencted zur Asterisk-CLI direkt das mindest-verbose-level angeben:
Code:
asterisk -rvvvvv
Alternativ, wenn du auch auf geringeren Verbose-levels etwas ausgeben willst benutze einfach Verbose statt NoOp.
NoOp("Text") ist praktisch das gleiche wie Verbose(3,"Text")

*edit* Zudem solltest du bedenken, dass der Programmfluss bei "Dial" verharrt, bis die angerufene Seite entweder nicht dran geht (timeout) oder nach dem Gespräch auflegt. Legt die anrufende Seite auf läuft das Programm an dieser Stelle garnicht weiter, sondern springt zur "h" extension (falls vorhanden). Du solltest also die Befehle eventuell in der Reihenfolge umtauschen.
 
Du solltest also die Befehle eventuell in der Reihenfolge umtauschen.

Genau das war es.

Code:
[test23_out]
exten => _*20.,1,NoOp("Enum abfrage der nummer ${EXTEN:3} bitte!")
exten => _*20.,2,Dial,SIP/${EXTEN:3}@23_yesss21|45|r

Nun kann ich besser testen was wann wo passiert. Vielen Dank!
 
Kostenlos!

Statistik des Forums

Themen
248,877
Beiträge
2,303,756
Mitglieder
378,545
Neuestes Mitglied
Patruc