Letzte Woche => Endspurt!Montag den 29.01.07 geht das Buch in die Produktion. Bis dahin laeuft der Beta-Test noch in vollem Umfang. Bitte melden Sie Fehler! Siehe Beta-Test FAQ. Erscheinungstermin: 03.03.07. Das Buch wird auf dem Asterisk-Tag.org in Chemnitz vorgestellt und kann dort auch erworben werden. 10 Tage spaeter wird es im Buchhandel sein. Wer nicht in Chemnitz sein kann, sollte das Buch vorbestellen: Amazon oder direkt beim Verlag Asterisk-Schulungen und Consulting vom Autor dieses Buches finden Sie auf http://www.amooma.de. Naechste Asterisk-Schulung: 12.02. - 13.02.07 (noch 2 Plaetze frei) - Ach ja, ... wir suchen auch noch Asterisk Entwickler! => http://www.amooma.de/jobs/ |
Mit unserem bisherigen Wissen müssen wir pro möglicher Rufnummer immer eine eigene Extension schreiben. Dies würde schon nach kurzer Zeit sehr lange und fehleranfällige Dialpläne nach sich ziehen. Sollen z.B. die Rufnummern 100 bis 109 jeweils immer den hello-world Sprachbaustein abspielen, so würde die extensions.conf wie folgt aussehen:
[general] [apfelmus] exten => 100,1,Answer() exten => 100,2,Playback(hello-world) exten => 100,3,Hangup() exten => 101,1,Answer() exten => 101,2,Playback(hello-world) exten => 101,3,Hangup() exten => 102,1,Answer() exten => 102,2,Playback(hello-world) exten => 102,3,Hangup() exten => 103,1,Answer() exten => 103,2,Playback(hello-world) exten => 103,3,Hangup() exten => 104,1,Answer() exten => 104,2,Playback(hello-world) exten => 104,3,Hangup() exten => 105,1,Answer() exten => 105,2,Playback(hello-world) exten => 105,3,Hangup() exten => 106,1,Answer() exten => 106,2,Playback(hello-world) exten => 106,3,Hangup() exten => 107,1,Answer() exten => 107,2,Playback(hello-world) exten => 107,3,Hangup() exten => 108,1,Answer() exten => 108,2,Playback(hello-world) exten => 108,3,Hangup() exten => 109,1,Answer() exten => 109,2,Playback(hello-world) exten => 109,3,Hangup()
Unter Verwendung einer Regular Expression
Definition Regular Expression:
"Reguläre Ausdrücke (Abk. RegExp oder Regex, engl. regular expressions) dienen der Beschreibung von (Unter-)Mengen von Zeichenketten mit Hilfe syntaktischer Regeln. Sie finden vor allem in der Softwareentwicklung Verwendung; für fast alle Programmiersprachen existieren Implementierungen." (zitiert aus http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck )
sieht der gleiche Dialplan gleich viel handlicher aus:
[general] [apfelmus] exten => _10X,1,Answer() exten => _10X,2,Playback(hello-world) exten => _10X,3,Hangup()
Eine Regular Expression wird immer mit einem Unterstrich (_
) vor dem eigentlichen Pattern (Suchmuster) eingeleitet:
exten => _Regular Expression,Prioritaet,Applikation
Eine Regular Expression kann in Asterisk aus den folgenden Elementen[43] bestehen:
[ABC]
Die Ziffern A, B und C. Beispiel für die Zahlen 34, 37 und 38:
exten => _3[478],1,NoOp(Test)
[A-B]
Beliebige Ziffer von A bis B. Beispiel für alle Zahlen von 31 bis 35:
exten => _3[1-5],1,NoOp(Test)
(z.B. auch [25-8]
möglich für die Ziffern 2,5,6,7,8)
X
Beliebige Ziffer von 0 bis 9. Beispiel für alle Zahlen von 300 bis 399:
exten => _3XX,1,NoOp(Test)
Z
Beliebige Ziffer von 1 bis 9. Beispiel für alle Zahlen von 31 bis 39:
exten => _3Z,1,NoOp(Test)
N
Beliebige Ziffer von 2 bis 9. Beispiel für alle Zahlen von 32 bis 39:
exten => _3N,1,NoOp(Test)
.
Eine oder mehrere beliebige Ziffer(n). Beispiel für alle Nummer, die mit einer 0 beginnen:
exten => _0.,1,NoOp(Test)
Das Pattern _.
sollten Sie nicht verwenden! Es trifft auch auf besondere Extensions wie i
, t
oder h
zu. Benutzen Sie stattdessen _X.
oder _X
falls nötig.
!
Eine oder mehrere beliebige Ziffer(n) - ab Asterisk 1.4. Dieser besondere Platzhalter trifft zu, sobald unzweifelhaft nicht eine andere explizite Nummer im Dialplan gewählt wird. Hebt dann sofort die Leitung ab für „overlap dialing“. Hier nur der Vollständigkeit halber erwähnt.
Pattern Matchin in Asterisk ist bei großen Dialplänen eine trickreiche Angelegenheit. Asterisk geht nämlich nicht wie allgemein angenohmen wird plump von oben nach unten den Dialplan durch. Nein, es priorisiert innerhalb der Patterns!
Je exakter ein Pattern matcht, desto höher ist die Wahrscheinlichkeit das es matcht. Asterisk geht allerdings - bevor es eine Entscheidung trifft - den ganzen Context durch. Es könnte ja sein, das ein anderes Pattern noch besser matcht.
Beispiel:
[verkauf] exten => _12X.,1,NoOp{12X} exten => 12345,1,NoOp(12345} exten => _1234.,1,NoOp{1234.}
Wenn in diesem Beispiel die 12345 gewählt wird, dann wird die zweite Zeile ausgeführt, denn sie stellt den optimalen Treffer da. Wenn die 12346 gewählt wird, dann trifft die letzte Zeile, denn sie macht besser als die erste.
Es gibt eine Sonderregel für das Pattern _.
"_." matcht immer und hat auch immer die höchste Priorität. Es ist also egal, was Sie sonst noch in diesem Context für Regeln haben! Es wird immer nur die Regel mit dem Pattern "_." ausgeführt. Man sollte also lieber ein "_X." nehmen, ausser man ist sich absolut sicher und weiss man man tut.
Auch wenn die Reihenfolge von Pattern nicht immer ganz trival ist, gibt es eine einfache Debugging Möglichkeit. Mit show dialplan 12345@verkauf lässt sich der Dialplan für die gewählte Nummer 12345 im Context verkauf auflisten. So kann man für spezielle Nummern überprüfen, ob auch die dafür vorgesehene Regel matcht.
[43] Es gibt noch weitere Elemente, die im deutschen Sprachraum aber im Allgemeinen wenig Sinn machen. Aus diesem Grund werden sie hier nicht aufgeführt.
© by Stefan Wintermeyer