Project

General

Profile

Dialplan

Wahlregeln sind ein essentieller Teil eines Telefonnetzes. Ohne sie funktionieren die angeschlossenen Telefone nicht, denn sie beitzen über keine "Eigenintelligenz". Das Netz selbst muss erkennen, zu welcher Gegenstelle ein Telefon Verbindung aufnehmen möchte und die Verbindung entsprechend schalten. Für die Dauer des Gespräches bleibt diese Verbindung dann bestehen. Damit unterscheidet sich ein Telefonnetz zum Internet. Telefonie funktioniert historisch nicht Paketorientiert. Routen sind im Gegensatz zum Internet eindeutig. Das bedeutet, dass ein Gespräch immer durch die gleiche Route übertragen wird und nicht, wie im Internet, zwei Pakete mit gleichen Ziel unterschiedliche Routen nutzen können. Die Endgeräte verlassen sich also auf die Wahlregeln. Diese sind in der extension.conf innerhalb des Asterisk-Server hinterlegt, dem sogenannten Dialplan.

Solch ein Dialplan lässt sich unterschiedlich realisieren. Im folgenden werden die Wahlregeln des RZ-GSM Netzes genauer beschrieben.

Kategorisieren der Anrufenden

Ausgehend, von wo ein Gesprächsaufbau aufgebaut wird, landet dieser in einem eigenen Kontext. So unterscheiden wir zur Zeit zwischen:
  • eingehenden ISDN-Rufen ([fromCAPI]),
  • dem eigenen GSM-Netz ([fromGSM]),
  • VoIP-Gesprächen ([SIP-incoming]),
  • Comsys-Testaccounts ([fromComsys]).

Innerhalb dieser Kontexte können dem Benutzer durch unterschiedliche Wahlregeln, gewisse Rufnummern gesperrt werden. Die Comsys-Accounts könnte man zum Beispiel für nur eine einzige Nummer freischalten oder nur Festnetzgespräche erlauben. Nach dieser Vorfilterung landen die Gespräche in einen zentralen Kontext: [incoming].

Routen der Gespräche

Innerhalb des Kontextes [incoming] wird entschieden, welche Route für welche Nummer genutzt wird. Wurde die gewünschte Rufnummer im Dialplan gefunden, wird in ein weiteren Kontext gesprungen. Die Vorteile solch einer Lösung sind schnell an einem Beispiel gezeigt:

Kostenpflichtige Rufnummern sollen gesperrt sein. Diese beginnen mit 01, 032 (mögliche, anfallende Kosten), 070 und 090. Ruft ein Nutzer diese Nummern an, soll er informiert werden, dass das Gespräch nicht aufgebaut wird. Er hört eine Standardansage von Asterisk. Diese Ansage ist in einem gesondertem Kontext definiert, und zwar unter [dialBlock]. Möchte man nun die Ansage ändern, lässt sich dies leicht innerhalb dieses Kontextes machen, ohne den gesamten Dialplan durchgehen zu müssen. Weitere Szenarien sind denkbar. Gewisse kostenpflichtige Nummern könnten für Studenten von Nutzen sein. Entschließe sich der Lehrstuhl, diese speziellen Nummern doch freizugeben, könnte die entsprechende Regel an zentraler Stelle (unter [dialBlock]) eingetragen werden und würde fortan für alle Nutzer gelten.

[incoming]
...
; calls to special (pay) numbers should be blocked
exten => _01[0123489]X.,1,Goto(dialBlock,${EXTEN},1)
exten => _032X.,1,Goto(dialBlock,${EXTEN},1)
exten => _070[01]X.,1,Goto(dialBlock,${EXTEN},1)
exten => _090[012]X.,1,Goto(dialBlock,${EXTEN},1)
...
[dialBlock]
exten => _X.,1,Playback(vm-goodbye)
exten => _X.,2,Hangup

Ein weiteres, nützliches Beispiel ist die Verwendung mehrere SIP-Dialouts. Somit sind mehrere gleichzeitige Gespräche ins Festnetz möglich. Anfangs zogen wir dies Option aber nicht in Betracht. Erst später, unter Verwendung von GROUP_COUNT wurde realisiert, dass Asterisk jede zur Verfügung stehende Leitung für einen Rufaufbau in Betracht zieht. Erst wenn keine Leitung mehr verfügbar ist, wird der Gesprächsaufbau abgebrochen. Die Änderungen, die hierfür nötig waren, beliefen sich innerhalb des Kontextes [dialLandline] für Festnetznummern. Die Funktionalität steht nun für alle Festnetznummern und allen (erlaubten) Benutzergruppen zur Verfügung.

Anhand dieser Beispiele lässt sich zeigen, dass es sinnvoll ist, ausgehende Rufnummern ebenfalls zu Kategorisieren.

Kategorisieren der Angerufenen

zur Zeit unterscheiden wir folgende Zielrufnummern:
  • Festnetznummern ([dialLandLine]),
  • interne VoIP-Nummern ([dialSIP]),
  • interne GSM-Nummern ([dialGSM]),
  • externe GSM-Nummern ([dialGSMout]),
  • Nummern die über die ISDN-Leitung angerufen werden sollen ([dialCAPI] - für spätere Zwecke),
  • Anrufe zu den Comsys-Accounts ([dialComsys]),
  • gesperrte Rufnummern ([dialBlock]),
  • spezielle Rufnummern mit Sonderfunktionen ([dialReserved]).

Als wichtiges Beispiel dienen hier Anrufe zu den externen Handy-Netze. Sie landen in dem Kontext ([dialGSMout]). Aufgrund der Rufnummernmitnahme (siehe GSM-Dialout) muss eine Datenbank abgefragt werden, die das Zielnetzwerk identifiziert (Vodafone, E-Plus, O2, T-Mobile). Durch die vorgenommene Aufteilung muss man dies nicht für jeden Nutzer einzeln eintippen, sondern schreibt die Änderungen in den entsprechenden Kontext:

[dialLandLine]
exten => _0N.,1,Set(CALLERID(all)="Anonymous" <>)
exten => _0N.,n,GotoIf($[${GROUP_COUNT(5782)} = 0]?sip5782)
exten => _0N.,n,GotoIf($[${GROUP_COUNT(5456)} = 0]?sip5456)
exten => _0N.,n,GotoIf($[${GROUP_COUNT(9375)} = 0]?sip9375)
; if we are here, no lines are available => hangup
exten => _0N.,n,Goto(hang)

exten => _0N.,n(sip5782),Set(GROUP()=5782)
exten => _0N.,n,NoOp(Anzahl Gruppen 5782: ${GROUP_COUNT(5782)})
exten => _0N.,n,NoOp(${GROUP()})
exten => _0N.,n,Dial(SIP/${EXTEN}@5782,${RINGTIME},r)
exten => _0N.,n,Goto(hang)

exten => _0N.,n(sip5456),Set(GROUP()=5456)
exten => _0N.,n,NoOp(Anzahl Gruppen 5456: ${GROUP_COUNT(5456)})
exten => _0N.,n,NoOp(${GROUP()})
exten => _0N.,n,Dial(SIP/${EXTEN}@5456,${RINGTIME},r)
exten => _0N.,n,Goto(hang)

exten => _0N.,n(sip9375),Set(GROUP()=9375)
exten => _0N.,n,NoOp(Anzahl Gruppen 9375: ${GROUP_COUNT(9375)})
exten => _0N.,n,NoOp(${GROUP()})
exten => _0N.,n,Dial(SIP/${EXTEN}@9375,${RINGTIME},r)
exten => _0N.,n,Goto(hang)

exten => _0N.,n(hang),Playback(ss-noservice)
exten => _0N.,n,Hangup

Sonderfall GSM-Teil

Der GSM-Teil des Netzes arbeitet unabhängig vom Lehrstuhl-Asterisk. Führen zwei Handys, die beide in das RZ-GSM eingebucht sind, ein Gespräch, wird dieses nicht über den Lehrstuhl-Asterisk vermittelt. Das Gespräch bleibt im OpenBSC-Asterisk. Dieses Verhalten bietet Vor- und Nachteile. Einerseits wird hierdurch die Latenz bei Gesprächen von Handy zu Handy minimiert, andererseits kann der Lehrstuhl-Asterisk das Gespräch nicht in seine Logdateien aufnehmen. Da die gesamten GSM-Daten aber sowieso nur innerhalb des OpenBSC-Asterisk geloggt werden können, ist dies verschmerzbar. Es spricht nichts dagegen, auch Handy-zu-Handy Gespräche über den Lehrstuhl-Asterisk zu vermitteln, falls zukünftige Pläne die verlangen würden.

Übersicht über die Kontexte

Vergabe der Rufnummern

Den einzelnen Teilnehmergruppen Telefonnummern zuzuweisen ist durch die Einteilung in verschiedene Kontexte einfach zu gestalten. Wir einigten uns auf Rufnummern mit drei Stellen, damit auch ältere Telefone das gesamte RZ-GSM Netz anrufen können. Alte Telefonanlagen und Telefone sind nicht im Stande, Rufnummern mit mehr als 15 Stellen anzuwählen. Das untere Bild verdeutlicht den Aufbau und Rufnummernplan des RZ-GSM Netzes.
  • Wir gingen davon aus, dass die Handys die größte Anzahl an Benutzern darstellen wird. Daher verteilten wir für den Kontext [dialGSM] (Handys im RZ-GSM) die Rufnummern von 2xx bis 7xx
  • Im alten Lehrstuhl-Asterisk waren bereits einige VoIP-Benutzer eingetragen. Diesen gaben wir also den Rufnummernblock 9xx
  • Um die Comsys Testaccounts anzurufen, gaben wir dem Kontext [fromComsys] den Rufnummernblock 8xx (nicht im unteren Bild enthalten)

Routing der ausgehenden Gespräche

Der Lehrstuhl-Asterisk besitzt mehrere Leitungen, um Gespräche nach außen weiterzuleiten: Drei SIP-Accounts und vier Anbindungen über GSM. Damit die Gespräche kostenneutral geführt werden können, müssen auch die ausgehenden Anrufe geroutet sein. Folgende Regeln verteilen die ausgehenden Gespräche:
  • Nummern, die mit 015, 016 oder 017 beginnen, sind für Handynetze reserviert. Diese Gespräche werden über den GSM-Dialout an das entsprechende Handynetz vermittelt.
  • Nummern, die mit 0, 0049 oder +49 beginnen, werden an die SIP-Accounts verteilt und sind für das Festnetz bestimmt

dialplan.png (111 KB) Richard Zahoransky, 10/14/2010 04:23 PM

schema.png (69.8 KB) Richard Zahoransky, 10/15/2010 12:40 PM