El artículo hablará sobre la
versión gratuita de PBX
Askozia 6 . Al desarrollar una central telefónica, una de las primeras tareas fue la organización de las llamadas salientes.
Como fue
En la versión anterior de Askozia,
se usaban
plantillas estándar de "plan de marcado".
- X! - todos los números telefónicos
- XXX - números de tres dígitos
- .! - absolutamente todos los números de teléfono
Un ejemplo de un contexto puede describirse esquemáticamente:
[outgoing] exten => _XXXXXX!,1,NoOp(Start outgoing calling...) same => n,Dial…
Nos pareció que este enfoque no es lo suficientemente flexible. No hay forma de describir la siguiente regla:
- El número comienza en 79
- Sigue a 35 o 26
- El resto del número son 7 dígitos.
Debajo del corte, se describe nuestro enfoque y el resultado del desarrollo.
Implementación actual
Decidimos implementar esta funcionalidad de manera diferente, usando
REGEX .
Ejemplo de plantilla:
79(25|26)[1-9]{7}
- (25 | 26) es 25 O 26
- [0-9] - un dígito de 0 a 9, ocurrencia desde la 1ra o más veces
- {7} - número de ocurrencias del personaje anterior
La sintaxis para la función REGEX es:
REGEX("regular expression" string) Return '1' on regular expression match or '0' otherwise
Un ejemplo de uso en 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()
Para las llamadas salientes, se organiza un punto de entrada: el contexto "
saliente ", la función "
ExecIf " se llama en él:
ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"]
Si el número de teléfono especificado en la variable "
$ {EXTEN} " coincide con el patrón, la llamada se enruta al
subcontexto utilizando la función "
Gosub ".
Si la llamada no se interrumpió en el
subcontexto , el conjunto irá de acuerdo con la siguiente regla apropiada.
De esta manera, resolvimos el problema con líneas de un solo canal. Si la línea está ocupada, la llamada pasa por la siguiente hasta que se responde.
Ejemplos de contexto:
[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
Obligatorio en "
sub ": el contexto verifica "
DIALSTATUS ". Si se responde la llamada, luego de la conversación, el canal se terminará utilizando la función "
Colgar () ". Si esto no se hace, al final de la llamada del cliente, se puede volver a marcar el número del cliente.
Una sutileza importante, cuando usamos "
Gosub " o "
Goto ", intencionalmente
no cambiamos
$ {EXTEN} . Incluso si necesita modificar el número de teléfono (agregar / eliminar prefijo).
El hecho es que cuando se modifica
EXTEN , Asterisk modificará el valor de la variable
CDR (dst) , lo que conducirá a un resultado mal pronosticado en la tabla de historial de llamadas de CDR. Creo que es importante en la historia mantener el número marcado por un empleado.
Tenga cuidado al describir una expresión regular. Use los caracteres "
^ ", el comienzo de la línea y "
$ " - el final de la línea, de lo contrario, puede obtener resultados inesperados.
Por ejemplo, el patrón “
[0-9] {6} ” corresponderá a todos los números donde haya 6 o más dígitos. El patrón "
^ [0-9] {6} $ " solo coincide con números de 6 dígitos.
Resumen
Tenemos un subsistema flexible para describir el enrutamiento de salida a la central.
La lista de reglas se muestra de la siguiente manera:

Un ejemplo de una tarjeta específica de "Reglas":
