Der Artikel wird über die kostenlose PBX
Askozia Version 6 sprechen. Bei der Entwicklung einer Telefonzentrale war eine der ersten Aufgaben die Organisation ausgehender Anrufe.
Wie war es
In der alten Version von Askozia wurden Standard-Wählplanvorlagen verwendet.
- X! - alle Telefonnummern
- XXX - dreistellige Zahlen
- .! - absolut alle Telefonnummern
Ein Beispiel für einen Kontext kann schematisch beschrieben werden:
[outgoing] exten => _XXXXXX!,1,NoOp(Start outgoing calling...) same => n,Dial…
Es schien uns, dass dieser Ansatz nicht flexibel genug ist. Es gibt keine Möglichkeit, die folgende Regel zu beschreiben:
- Nummer beginnt bei 79
- Es folgt entweder 35 oder 26
- Der Rest der Nummer besteht aus 7 Ziffern
Im Rahmen des Schnitts werden unser Ansatz und das Ergebnis der Entwicklung beschrieben.
Aktuelle Implementierung
Wir haben uns entschlossen, diese Funktionalität mit
REGEX anders zu
implementieren .
Vorlagenbeispiel:
79(25|26)[1-9]{7}
- (25 | 26) ist 25 ODER 26
- [0-9] - eine Ziffer von 0 bis 9, die ab dem 1. oder mehreren Mal auftritt
- {7} - Anzahl der Vorkommen des vorherigen Zeichens
Die Syntax für die REGEX-Funktion lautet:
REGEX("regular expression" string) Return '1' on regular expression match or '0' otherwise
Ein Anwendungsbeispiel in Askozia 6:
[outgoing] exten => _X!,1,NoOp(Start outgoing calling...) same => n,Ringing() same => n,ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-1-out,${EXTEN},1)) same => n,ExecIf($["${REGEX("^(7|8)[0-9]{10}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-2-out,${EXTEN},1)) same => n,Hangup()
Für ausgehende Anrufe ist ein Einstiegspunkt organisiert - der "
ausgehende " Kontext, in dem die "
ExecIf " -Funktion aufgerufen wird:
ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"]
Wenn die in der Variablen „
$ {EXTEN} “ angegebene Telefonnummer mit dem Muster übereinstimmt, wird der Anruf mit der Funktion „
Gosub “ an den
Unterkontext weitergeleitet.
Wenn der Anruf im
Unterkontext nicht unterbrochen wurde, wird der Satz gemäß der folgenden entsprechenden Regel ausgeführt.
Auf diese Weise haben wir das Problem mit Einkanalleitungen gelöst. Wenn die Leitung besetzt ist, wird der nächste Anruf weitergeleitet, bis er beantwortet wird.
Kontextbeispiele:
[SIP-PR-1] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-1/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return [SIP-PR-2] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-2/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return
Obligatorisch in "
sub " - der Kontext prüft "
DIALSTATUS ". Wenn der Anruf entgegengenommen wird, wird der Kanal nach dem Gespräch mit der Funktion „
Hangup () “ beendet. Wenn dies nicht erfolgt, kann es am Ende des Anrufs durch den Client zu einem erneuten Wählen der Client-Nummer kommen.
Eine wichtige Subtilität: Wenn Sie "
Gosub " oder "
Goto " verwenden, ändern wir absichtlich
nicht $ {EXTEN} . Auch wenn Sie die Telefonnummer ändern müssen (Präfix hinzufügen / entfernen).
Tatsache ist, dass Asterisk beim Ändern von
EXTEN den Wert der
CDR- Variablen
(dst) ändert , was zu einem schlecht vorhergesagten Ergebnis in der CDR-Anrufverlaufstabelle führt. Ich denke, es ist in der Geschichte wichtig, die von einem Mitarbeiter gewählte Nummer beizubehalten.
Seien Sie vorsichtig, wenn Sie einen regulären Ausdruck beschreiben. Verwenden Sie die Zeichen "
^ ", den Zeilenanfang und "
$ " - das Zeilenende, da sonst unerwartete Ergebnisse auftreten können.
Beispielsweise entspricht das Muster "
[0-9] {6} " allen Zahlen mit 6 oder mehr Ziffern. Das Muster "
^ [0-9] {6} $ " entspricht nur 6-stelligen Zahlen.
Zusammenfassung
Wir haben ein flexibles Subsystem zur Beschreibung des ausgehenden Routings zur TK-Anlage.
Die Liste der Regeln wird wie folgt angezeigt:

Ein Beispiel für eine bestimmte "Regel" -Karte:
