===== Dialplan =====
El Dialplan se fundamenta principalmente en el archivo /etc/asterisk/extensions.conf , aunque se pueden incluir archivos auxiliares adicionales.
Es un fichero en el cual se define cómo se van a comportar las llamadas que entran y salen del asterisk. Está compuesto por: contextos, extensiones, prioridades y aplicaciones.
==== Contextos ====
Un contexto es una sección del dialplan y se definen usando un nombre entre corchetes [ejemplo]. Distingue entre mayúsculas y minúsculas y podemos usar como nombre las letras de la **A-Z**, los números de **0-9** y los guiones **-_**
Un contexto empieza con su nombre entre corchetes y no termina hasta que se encuentre con la definición del siguiente contexto.
Inmediatamente después del nombre del contexto definimos las instrucciones que forman parte de nuestra lógica de extensiones.
Cada línea generalmente comienza con la instrucción ** exten => Patrón de la extension a marcar,Prioriodad,Aplicación ** donde :
Podemos hacer comentarios dentro de un contexto colocando **;** al principio de la línea
==== Patrones ====
Como patrón de marcado, además de usar números podemos usar
|** X** | Cualquier dígito del 0 y 9 |
|** Z ** | Cualquier dígito del 1 a 9 |
|** N** | Cualquier dígito de 2 a 9 |
| **[12347-9]** | Los dígitos entre corchetes. Se puede utilizar también el - para indicar un rango de números |
| * | El comodín equivale a cualquier número |
| **. ** | Coincide con 1 o más carácteres |
| **! ** | Coincide con 0 o más carácteres |
==== Prioridad ====
Prioridad: cada extensión puede tener varias instrucciones por lo que se tiene un número de prioridad que define el orden en el cual serán ejecutadas.
- En la primera línea exten=> de un contexto debe de tener siempre la prioridad **1**
- Para las siguientes prioridades y líneas si es para el mismo patrón podemos sustituir el patrón por la palabra **same =>**
- Para escribir la siguiente prioridad lo podemos hacer de modo numérico o simplemente poniendo una **n de next** en el sitio de la prioridad que le sumaría 1 a el número de la prioridad anterior.
==== Aplicación ====
Aplicación: son acciones de Asterisk. (Answer(), HungUp(),Dial())
| ${variable} | obtenemos el valor de la variable que previamente hemos definido |
| AGI | Permite lanzar scripts o aplicaciones externas |
| Answer([delay,[nocdr]]) | Responde a una llamada entrante |
| Background | Reproduce una locución |
| Busy | Indica que la extensión destino está ocupada |
| Congestion | congestión |
| Dial(Tecnologia/Trunk/Destino,Timeout,opciones) | Lanza una llamada |
| Gosub([context,[exten,]]priority[(arg1,[...][argN]])) | Salta al punto del dialplan indicado y vuelve cuando encuentra un **return** |
| Goto([context,[extensions,]]priority) | Salta a un punto del dialplan |
| Hangup | Colgar |
| NoOp([text]) | no hace nada . |
| Playback (archivo) | permite escuchar un archivo de sonido, pero no se permite marcar una extensión, hasta que no acabe la locución. |
| Queue | |
| Read | lee un valor y lo almacena en una variable |
| Record | graba en un fichero |
| Set(name=value) | Asigna un valor a una variable |
| verbose | enviar un mensaje a la salida **verbose** |
| voicemail | |
| voicemailmain | |
| wait | |
| waitexten | espera un tiempo a que el usuario introuzca una extensión |
==== Ejemplo ====
[Moviles]
;Inicio del contexto de llamadas a móvil
exten => _[67]XXXXXXXX,1,Noop(Llamadas a Moviles)
same => n,Dial(SIP/Trunkmoviles/${EXTEN},20,r)
same => n,Hangup()
;Fin del contexto Moviles
[Fijos]
;Inicio del contexto Llamadas a Fijos
exten => _[89]ZXXXXXXX,1,Noop(Llamadas a Fijos)
same => n,Dial(SIP/Trunkfijos/${EXTEN},20,r)
same => n,Hangup()
;Fin del contexto Fijos
[Internacionales]
;Inicio del contexto Llamadas a Internacionales
exten => _00.,1,Noop(Llamadas Internacionales)
same => n,Dial(SIP/Trunkinternacional/${EXTEN},20,r)
same => n,Hangup()
;Fin del contexto Internacionales
Explicación del ejemplo
*** exten => _[67]XXXXXXXX,1,Noop(Llamadas a Moviles)** \\ El número marcado empezará por 6 o por 7 seguido de 8 números del 0-9 con prioridad 1 \\ Noop hace que aparezca en la consola de asterisk el texto que hemos puesto entre paréntesis. Sirve entre otras cosas para ir debugenado por donde va el dialplan
* **same => n,Dial(SIP/Trunkmoviles/${EXTEN},20,r)** \\ same=>n La n de next sería lo mismo que poner _[67]XXXXXXXX y prioridad 2 \\ Dial(SIP/Trunkmoviles/${EXTEN},20,r) indica que usaremos SIP para la llamada. usando como salida el trunk llamado trunkmoviles hacia el número definido en la variable ${EXTEN}, durante 20sg y escucharemos un tono de llamada
La lista completa de opciones de Dial puede ser vista poniendo **show application Dial** en la consola de Asterisk
* **same => n,Hangup()** Colgaremos la llamada
===== Referencias =====
* https://proyectos.interior.edu.uy/projects/voip/wiki/DialPlan_o_Plan_de_marcaci%C3%B3n_(reglas_de_marcado_generales)
* https://www.minestron.it/asterisk-desconsolado/configuraciones-generales-general-settings
* http://ipphonet.com/explicacion-de-dialplan-basico-en-asterisk-pbx/
* http://jimenezra.blogspot.com/2011/01/teoria-de-contextos-en-asterisk-parte-i.html
* http://jimenezra.blogspot.com/2011/02/teoria-de-contextos-de-asterisk-parte.html
* https://www.voztovoice.org/?q=node/50
* http://telefonia.blog.tartanga.eus/2016/08/30/configuracion-practica-de-asterisk-1a-parte-la-aplicacion-dial/