L'article parlera du PBX gratuit 
Askozia version 6 . Lors du développement d'un central téléphonique, l'une des premières tâches a été l'organisation des appels sortants.
Comment c'était
Dans l'ancienne version d'Askozia, des 
modèles de «plan de numérotation» standard 
étaient utilisés.
- X! - tous les numéros de téléphone
- XXX - nombres à trois chiffres
- .! - absolument tous les numéros de téléphone
Un exemple de contexte peut être décrit schématiquement:
[outgoing] exten => _XXXXXX!,1,NoOp(Start outgoing calling...) same => n,Dial… 
Cette approche ne nous a pas semblé suffisamment flexible. Il n'y a aucun moyen de décrire la règle suivante:
- Le nombre commence à 79
- Il suit soit 35 ou 26
- Le reste du numéro est composé de 7 chiffres
Sous la coupe, notre approche et le résultat du développement sont décrits. 
Implémentation actuelle
Nous avons décidé d'implémenter cette fonctionnalité différemment, en utilisant 
REGEX .
Exemple de modèle:
 79(25|26)[1-9]{7} 
- (25 | 26) est 25 OU 26
- [0-9] - un chiffre de 0 à 9, occurrence à partir de la 1ère fois ou plus
- {7} - nombre d'occurrences du caractère précédent
La syntaxe de la fonction REGEX est:
 REGEX("regular expression" string) Return '1' on regular expression match or '0' otherwise 
Un exemple d'utilisation dans 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() 
Pour les appels sortants, un point d'entrée est organisé - le contexte « 
sortant », la fonction « 
ExecIf » y est appelé:
 ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"] 
Si le numéro de téléphone spécifié dans la variable « 
$ {EXTEN} » correspond au modèle, alors l'appel est acheminé vers le 
sous-contexte à l'aide de la fonction « 
Gosub ».
Si l'appel n'a pas été interrompu dans le 
sous-contexte , alors l'ensemble se déroulera selon la règle appropriée suivante.
De cette façon, nous avons résolu le problème avec les lignes à canal unique. Si la ligne est occupée, l'appel passe par le suivant jusqu'à ce qu'il soit répondu.
Exemples de contexte:
 [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 
Obligatoire dans « 
sub » - le contexte vérifie « 
DIALSTATUS ». Si l'appel est répondu, après la conversation, le canal sera interrompu à l'aide de la fonction « 
Raccrocher () ». Si cela n'est pas fait, à la fin de l'appel par le client, une nouvelle numérotation du numéro de client peut se produire.
Une subtilité importante, lorsque vous utilisez " 
Gosub " ou " 
Goto ", nous 
ne modifions 
pas intentionnellement 
$ {EXTEN} . Même si vous devez modifier le numéro de téléphone (ajouter / supprimer le préfixe).
Le fait est que lorsque 
EXTEN est modifié, Asterisk modifiera la valeur de la variable 
CDR (dst) , ce qui conduira à un résultat mal prévu dans la table d'historique des appels CDR. Je pense qu'il est important dans l'histoire de conserver le numéro composé par un employé.
Soyez prudent lorsque vous décrivez une expression régulière. Utilisez les caractères « 
^ », le début de la ligne et « 
$ » - la fin de la ligne, sinon vous pourriez obtenir des résultats inattendus.
Par exemple, le motif « 
[0-9] {6} » correspondra à tous les nombres où il y a 6 chiffres ou plus. Le modèle « 
^ [0-9] {6} $ » correspond uniquement aux nombres à 6 chiffres.
Résumé
Nous avons obtenu un sous-système flexible pour décrire le routage sortant vers le PBX.
La liste des règles s'affiche comme suit:

Un exemple de carte «Règles» spécifique:
