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:
