Capítulo Básico #1
Introducción a Asterisk
Ing. Christian Cabrera R.
¿Qué es Asterisk?
Introducción a Asterisk 2
Es software open source
•Creado por Mark Spencer
•Creado como una alternativa a PBX propietarios •Convierte una PC ordinaria en un servidor de
comunicaciones
Es un proyecto, no un modelo ni fabricante
•Ante el crecimiento de Asterisk, se funda Digium, que es la
empresa que patrocina el desarrollo de Asterisk
Permite enlazar diferentes medios de comunicación, no solamente voz
Uso actual
Introducción a Asterisk 3 Más de 1 millón de servidores Asterisk en
producción hoy en día
• 1000+ descargas diarias en código fuente
Múltiples comunidades activas de usuarios
• http://voip-info.org
• http://asteriskmx.com
Varias distros listas para usarse
•Elastix, Trixbox, AsteriskNow, PBX in a Flash Muchos entornos de uso
• Oficinas, callcenters, corporativos, carriers, aplicaciones remotas
Versiones de Asterisk
Introducción a Asterisk 4
Versiones inferiores a 1.8 se consideran obsoletas
•Sin soporte oficial. Se recomienda actualizar.
Asterisk 11 es lo recomendado hoy en día
Versión Tipo Fecha de lanzamiento
Actualizaciones de
seguridad Fin de vida
1.4.X LTS Dic 2006 Abr 2011 Abr 2013
1.6.2.X Estándar Dic 2009 Abr 2011 Abr 2012
1.8.X LTS Oct 2010 Oct 2014 Oct 2015
10.X Estándar Dic 2011 Dic 2012 Dic 2013
11.X LTS Oct 2012 Oct 2016 Oct 2017
Dos tipos de versiones
Introducción a Asterisk 5
LTS (Long Term Support)
•Permanencia mínima de 5 años en el mercado •Orientado a estabilidad
•Mejor opción para empresas
Estándares
•Dos años de vida
•Orientado a impulsar nuevas funcionalidades •Apta para entusiastas y desarrolladores de nuevas
tecnologías
Diferencias con un PBX
convencional
Introducción a Asterisk 6
No se requiere hardware propietario
•Muchos fabricantes ofrecen productos similares •Hardware “genérico” intercambiable
•Diferentes soluciones de diferentes fabricantes •Libre competencia = mejores precios y productos
Sigue una arquitectura universal de PC
•Procesador, memoria, motherboard y almacenamiento •Es posible instalar Asterisk en una µPC (ej. Raspberry Pi)
Free software: tanto libre como gratis
•Sin pago de licencias
Diferencias (2)
Introducción a Asterisk 7 Totalmente programable y configurable
•No es necesario solicitar servicios especiales ni
comprar módulos extras
•Todo se hace a través de software
Ofrece servicios adicionales de datos
•Puede integrarse con cualquier sistema que pueda
correr en una PC con Linux
Bases de datos, consultas web, lectura de archivos, etc. Puede interactuar con conmutadores existentes
•Interconexión a través de puertos análogos/digitales
Escenarios de uso
Introducción a Asterisk 8
Hay muchas maneras en las que podemos aprovechar las características de Asterisk, entre ellas:
•PBX tradicional
•PBX IP •PBX híbrido
•Pasarela (Gateway) VoIP •Aumento de funcionalidades •Call center
PBX tradicional
Introducción a Asterisk 9PBX VoIP
Introducción a Asterisk 10PBX híbrido
Introducción a Asterisk 11Pasarela VoIP
Introducción a Asterisk 12Aumento de
funcionalidades
Introducción a Asterisk 13¿Qué es lo que SI es
Asterisk?
Introducción a Asterisk 14Es un SIP registrar
•Entidad SIP que mantiene el registro de diferentes usuarios y de su ubicación
Es un back-to-back user agent (B2BUA)
•Se comporta como un servidor y un teléfono de manera simultánea
•Controla una llamada estableciendo comunicación individual con cada parte (y luego puentea la
llamada)
•Es un cliente multi-sesión, multi-usuario •Convierte la comunicación entre canales
B2BUA vs Proxy
Introducción a Asterisk 15Proxy
Llamada 1 Llamada 2 Llamada¿Qué es lo que NO es
Asterisk?
Introducción a Asterisk 16 No es un SIP proxy•Por definición, un proxy nunca es parte del fin de la
llamada (ej. Voicemail, IVRs, etc)
•Un proxy solo hace reenvío de paquetes, manejando las
llamadas en nombre de otros usuarios (Asterisk las procesa completamente en señalización y RTP)
No es un sistema plug-and-play
•Podemos crear complejas aplicaciones con él, pero es necesario configurarlo primero
Requisitos de hardware
Introducción a Asterisk 17
Lo más importante es la estabilidad
• Siempre usar hardware de marca (HP, IBM, Dell).
• Evitar equipos armados con componentes de dudosa procedencia.
• Procurar siempre ofrecer soluciones de redundancia en los componentes de fallas más comunes:
Discos duros Fuentes de poder
El procesamiento necesario se mide según los requerimientos
• No existe una regla fija de cuanto se necesita.
• Lo más importante es la cantidad de llamadas concurrentes.
• Soluciones basadas en ARM son aptas para pequeños entornos.
Pueden usarse entornos virtualizados
• Limitados a hardware PSTN externo conectado por IP
Requisitos de hardware (2)
Introducción a Asterisk 18
Si nuestro sistema es 100% IP, no necesitamos tarjetas
•El hardware adicional se usa solamente cuando queremos
conectarnos directamente a la PSTN.
El CPU depende de las tareas a realizar
•Adicional a las llamadas, cada nueva acción (grabar, consultar BD, reproducir audios, etc) reducen la capacidad del sistema
Cualquier PC es buena para pruebas
•Asterisk 1.2 en Celeron 333 Mhz con 32 MB RAM
•Es posible usar µPCs (ej. Raspberry Pi)
Espacio en disco dependiente de grabaciones
•Códec * horas de llamada * llamadas simultáneas * dias a
permanecer
Requisitos de software
Introducción a Asterisk 19
Preferentemente, Linux nativo
•FreeBSD y Mac OS tienen soporte parcial
Asterisk requiere de paquetería adicional:
•Recuerda instalar las versiones -devel
GCC Ncurses Termcap Newt OpenSSL LibUUID
En CentOS instalamos estas dependencias con: yum install -y gcc gcc-c++
ncurses-devel libtermcap-ncurses-devel openssl-devel newt-openssl-devel libuuid-openssl-devel En Debian instalamos todas con
apt-get build-dep asterisk
DAHDI
Introducción a Asterisk 20
Para la interacción con tarjetas (Digium, Sangoma,
Openvox, etc), Asterisk requiere de las librerías de DAHDI
•Digium Asterisk Hardware Device Interface
DAHDI son un conjunto de controladores que le permiten a Asterisk entenderse con las tarjetas
•Esto solo aplica para dispositivos USB y PCI/PCI-e
•Para conectar hardware externo se hace a través de protocolos como SIP o IAX
En si, DAHDI no es un requisito obligado para Asterisk
•Pero se recomienda instalar siempre para tener disponible el
módulo dahdi_dummy que se usa al crear conferencias con Meetme y troncales IAX.
DAHDI (2)
Introducción a Asterisk 21
DAHDI tiene su propia lista de dependencias
• Principalmente, necesitamos los encabezados de la misma
versión del kernel de Linux que estamos usando
• Los headers podemos conseguirlos fácilmente:
En CentOS:yum install kernel-devel
En Debian:apt-get install linux-headers-<versión>
Si queremos usar enlaces digitales (E1s), necesitamos más librerías:
• libopenr2 si usaremos enlaces con R2 modificado
• libpri si usaremos enlaces con ISDN PRI
En nuestra práctica de DAHDI aprenderemos como compilar estas librerías para su uso
Librerías extras para
Asterisk
Introducción a Asterisk 22
Cualquier librería que agregue funcionalidades a Asterisk (ej. openr2 o libsrtp) debe ser instalada antes de compilar Asterisk.
En caso de que Asterisk ya esté instalado, tendremos que repetir el proceso de instalación para que use las nuevas librerías.
•Siempre es posible agregar funcionalidades sobre la marcha.
•Durante el curso tendremos que recompilar Asterisk en
varias ocasiones para aprender a agregar librerías.
Instalando Asterisk
Introducción a Asterisk 23
Tenemos 2 alternativas:
• Instalar desde RPMs o DEBs (fácil) • Compilar desde código fuente (difícil)
Los RPMs nos permiten instalar paquetes de manera fácil y rápida, así como cumplir sus dependencias
• Sin embargo, son paquetes pre-hechos, lo que quiere decir que no es tan fácil personalizarlos
Compilar el código fuente nos da máximo control
• Toma más tiempo, es más trabajo, más cosas pueden salir mal,
pero creamos un sistema a la medida
Obviamente, nos iremos por el camino difícil ;-)
Compilando Asterisk
Introducción a Asterisk 24
La última versión de Asterisk está disponible desde
http://asterisk.org
•El histórico de versiones, parches y otros componentes, se
consigue desde http://downloads.digium.com
El proceso para compilar es muy parecido al de otros paquetes de software:
•Descargar el paquete (normalmente, con wget, o también podemos copiarlo desde nuestro equipo por SFTP).
•Desempaquetar el código fuente (usando tar). •Entrar al directorio ya desempaquetado.
•Compilar (normalmente con make) •Instalar
Compilando Asterisk
Introducción a Asterisk 25
Dentro del proceso de compilación hay varios comandos:
./configure : Revisar dependencias
make menuselect : Escoger las opciones a compilar make : Compilar código fuente
make install : Copiar a las carpetas necesarias make config : Crear scripts de autoarranque make samples : Crear ejemplos de configuración
Al terminar estos comandos habremos dejado Asterisk instalado
•El siguiente paso sería arrancarlo y configurarlo.
Algunas notas precautorias
Introducción a Asterisk 26
En caso de que ./configure nos arroje errores, quiere decir que nos faltan dependencias
•En caso de que make nos arroje errores, probablemente
tengamos dependencias incompatibles
Nunca debemos ejecutar make samples en un sistema que ya fue configurado
•De lo contrario sobreescribiremos nuestra configuración
con los archivos de ejemplo
make y make install pueden ejecutarse cuantas veces necesitemos para compilar nuevas funcionalidades
•Estos pasos serán repetidos constantemente durante el
curso.
Iniciando Asterisk
Introducción a Asterisk 27
Hay 2 maneras en las que podemos ejecutar Asterisk:
• Como un comando en primer plano • Como un servicio
Al ejecutar Asterisk como un comando, la consola se queda pegada a la sesión del usuario que estemos ocupando (normalmente root)
• Si cerramos nuestra sesión de usuario, Asterisk se cerrará
también.
• Por esta razón, este método se ocupa solamente cuando
queremos hacer pruebas y debug de nuestro sistema.
Al ejecutarlo como servicio, permanece activo aunque nuestra sesión se cierre
• Asterisk sigue corriendo en segundo plano.
Iniciando Asterisk (2)
Introducción a Asterisk 28
Para arrancar Asterisk en primer plano:
asterisk –vvvc
La v significa ‘verbosidad’ (más detalle)
Para arrancarlo como servicio
/etc/init.d/asterisk start
Una vez que Asterisk ya está ejecutándose:
•Para acceder a la consola lo hacemos con:
asterisk –r
•Si nos da un error de conexión, arranquémoslo primero como servicio y reintentemos
Deteniendo Asterisk
Introducción a Asterisk 29
Para detener el servicio completo (desde el CLI):
/etc/init.d/asterisk stop
Desde adentro del CLI de Asterisk
*CLI> core stop now
Matando el proceso (desde el CLI)
•Usar como último recurso:
ps –eF | grep asterisk kill -9 <PID de Asterisk>
Reiniciando Asterisk
Introducción a Asterisk 30
Solo hay que cambiar stop/start por restart:
/etc/init.d/asterisk restart *CLI> core restart now
En varias ocasiones se nos pedirá reiniciar el servicio de Asterisk
•Es conveniente familiarizarse con los comandos.
Práctica 1.1
Instalación de Asterisk
Configurando Asterisk
Introducción a Asterisk 32
La manera más simple de configurar Asterisk es a través de archivos de texto
•En modalidades más avanzadas podemos usar el CLI, el AMI o bases de datos
•Veremos todo eso más adelante
Los archivos se ubican en /etc/asterisk
•Tienen extensión *.conf
Archivos de configuración
Introducción a Asterisk 33
Hay muchos, pero estos son los más importantes:
Archivo Función
asterisk.conf Especifica las rutas default y ajusta opciones generales de todo el conmutador
extensions.conf Controla las reglas del plan de llamadas sip.conf Todo lo relacionado al protocolo SIP iax.conf Igual que el anterior, pero para IAX2 chan_dahdi.conf Configura las tarjetas DAHDI
asterisk.conf
Introducción a Asterisk 34
Archivo maestro de configuración
•Le indica a Asterisk donde buscar o crear otros archivos
Configuraciones que afectan a todo el sistema:
•Límite de llamadas en general •Estructura de archivos de sonido
•Nombre de este equipo (en caso de tener más de uno)
Raramente necesita ser editado
•Se recomienda mucho colocar verbose=3 para subir la
verbosidad del sistema por default
sip.conf
Introducción a Asterisk 35
Configuración del canal SIP
•El archivo de muestra viene lleno de ejemplos
2 tipos de configuraciones
•Campos que afectan a todos los usuarios
•Campos que afectan de manera individual a cada usuario
Aquí se configuran tanto teléfonos SIP como proveedores (troncales) SIP
•No confundir usuarios SIP con extensiones
•Las extensiones se declaran en el extensions.conf
iax.conf
Introducción a Asterisk 36
Configura lo relacionado al canal IAX2
•Igual que con SIP, configura valores generales e
individuales para usuarios
Se definen conexiones con dispositivos IAX así como con troncales IAX
chan_dahdi.conf
Introducción a Asterisk 37
Toda la tarjetería se configura aquí:
•Enlaces digitales (E1s) •Troncales análogas (FXO) •Extensiones análogas (FXS)
Requiere de la configuración equivalente dentro del /etc/dahdi/system.conf
•Dedicaremos un capítulo a explicar esto
Se verá más a detalle adelante
extensions.conf
Introducción a Asterisk 38
Aquí se define el plan de llamadas
•Los permisos a los que cada usuario tiene derecho para
marcar (clases de servicio)
•Se construye por contextos, extensiones, prioridades y
aplicaciones
Los archivos de SIP e IAX controlan quien puede acceder a él
•El archivo de extensiones controla que es lo que ese
alguien puede hacer
Similar a un archivo de programación
La mayoría del curso se centra en este archivo
En resumen
Introducción a Asterisk 39
Asterisk fue escrito por Mark Spencer
• Una alternativa open source a conmutadores cerrados.
Corre en cualquier distro de Linux
• Siempre y cuando, cumplamos sus dependencias
No es un proxy, es un B2BUA
• Actúa como un teléfono y un servidor al mismo tiempo
Necesitamos cumplir dependencias para instalar Asterisk
• Muy recomendado instalar DAHDI
• Los archivos de configuración se guardan en /etc/asterisk
Capítulo Básico #2
Configuración de Asterisk
Introducción
Configuración de Asterisk 41
La configuración inicial de Asterisk es a través de archivos de texto
•Conforme avancemos en el curso veremos métodos más
complejos
Todos los archivos pueden ser modificados directamente desde la consola
•nano, pico, emacs, vi, vim, cualquier editor nos sirve
Sintaxis de archivos *.conf
Configuración de Asterisk 42
Son similares a un archivo *.ini
•Se contruye a partir de un encabezado y varios campos
El contexto determina el nombre de la sección en la que estamos trabajando
•Los campos especifican los detalles de configuración
Estructura base:
[contexto] ; <-- Este es el contexto
campo1=valor1
campo2=valor2 ; <-- Estos son los campos
Comentarios
Configuración de Asterisk 43
Los archivos de configuración en Linux tienen comenarios que se especifican con el símbolo #
Sin embargo, los de Asterisk reciben comentarios con el ; (punto y coma)
• Todo lo que esté a la derecha del ; será ignorado
También podemos declarar comentarios multilínea:
• Usamos los tags de ;-- y --;
Ejemplo ;--- Todo esto es un comentario ---;
Ejemplo de sintaxis
Configuración de Asterisk 44 Archivo res_mysql.confInclusión de archivos
Configuración de Asterisk 45
Si un archivo es muy grande, puede resultar difícil de administrar
•Podemos separar el contenido en archivos más pequeños •Esta idea es muy usada por interfases como FreePBX
Sintaxis: #include “mi_otro_archivo.conf” Ejemplo: sip.conf [general] #include “sip_general_custom.conf” #include “sip_general_additional.conf” ; Aquí comienza la configuración de usuarios #include “sip_custom.conf”
#include “sip_additional.conf”
Inclusión de archivos (2)
Configuración de Asterisk 46
También es posible incluir configuración a partir de la ejecución de scripts usando #exec.
•Todo lo que el comando imprimiría a pantalla, es
interpretado como código de configuración por Asterisk
Ejemplo:
#exec “/bin/database_config.sh”
Esto puede usarse para generar la configuración desde un sistema externo (ej. base de datos)
•Considerar que esto puede afectar el rendimiento •Sin embargo, nos da mucha flexibilidad
Contextos
Configuración de Asterisk 47
Son secciones que identifican un grupo de campos
•Se les identifica por escribirse entre [ ]
•Según el archivo en que se ocupe, el [contexto] puede
significar algo diferente
sip.conf: Un usuario SIP
extensions.conf: Un grupo de extensiones voicemail.conf: Un conjunto de buzones de voz
Un [contexto] permanece abierto hasta que se encuentre con otro [contexto]
•Al abrir un nuevo contexto hay que cuidar no romper los ya
existentes
Usuarios SIP/IAX <>
extensiones
Configuración de Asterisk 48
Usuario SIP/IAX no es igual a extensión
•Confusión creada por distribuciones como Elastix/Trixbox. •Un usuario se refiere al dispositivo que se conectará con
Asterisk (archivo sip.conf/iax.conf).
•Las extensiones representan lo que se puede marcar
(archivo extensions.conf).
El campo context define los derechos de marcación de un usuario SIP
Dejando en claro la
diferencia
Configuración de Asterisk 49
El teléfono requiere del sip.conf para autenticarse El usuario requiere de las reglas del extensions.conf para poder marcar
Empezaremos por la configuración del sip.conf
Fuente: Asterisk The Definitive Guide Fuente: Asterisk The Definitive Guide Fuente: Asterisk The Definitive Guide
sip.conf
Configuración de Asterisk 50
Aquí se define todo lo relacionado con SIP
•Configuración de usuarios y troncales
Tiene 2 secciones: [general] y área de usuarios
•[general]contiene valores que afectan a todos los usuarios, así como al canal SIP mismo. Es la configuración
default.
•El área de usuarios define la configuración específica de
cada usuario.
En caso de que el mismo campo esté configurado en ambas secciones, la individual gana
•Cualquier dato que no exista, se tomará su valor default.
sip.conf (2)
Configuración de Asterisk 51
Hay muchos campos diferentes que podemos configurar para cada usuario SIP
• Hay más de 30, y la lista crece en cada versión nueva de Asterisk.
Para dar de alta un usuario SIP existen 3 campos obligatorios:
• type
• host
• context
• El nombre del usuario es lo que aparece como el [encabezado]
Cualquier campo no especificado se usará su valor default
Campos básicos
Configuración de Asterisk 52 Campo Valores posibles Función type user, peer o friendControla las llamadas que hace/recibe, así como interpretar la autenticación del dispositivo
user: Se autentica por username. Solo puede
hacer llamadas hacia Asterisk
peer: Se autentica por dirección IP y puerto. friend: Combinación de ambas
host <dirección IP>o dynamic
Especifica si el equipo (el teléfono) tiene una IP fija o si puede tomar cualquiera (dinámica). También indica si el teléfono tiene que registrarse hacia Asterisk o no.
context <nombre del contexto> Determina el contexto (el conjunto de reglas de marcación) al que podrá acceder el usuario. secret <contraseña> Especifica la contraseña para el usuario
Algunos campos
adicionales
Configuración de Asterisk 53
Algunos campos adicionales por usuario:
Para conocer todos los campos, consultar los comentarios del archivo muestra sip.conf
Campo Valores posibles Función
allow /
disallow <códec>
Habilita o deshabilita el uso de ciertos códecs
language <código de idioma> Permite cambiar el lenguaje default de este
usuario
dtmfmode auto, inband, rfc2833 Determina como se enviarán los códigosDTMF
mailbox <buzón>@<contexto> Hace que el teléfono consulte el buzón de voz por nuevos mensajes permit
/deny
<Dirección IP> /<Máscara>
Limita el registro a dispositivos cuya IP coincida con la indicada aquí.
El orden de deny/permit es importante.
Básico [usuario1] context=agentes type=friend host=dynamic Avanzado [usuario2] context=supervisor type=peer host=192.168.1.34 secret=abcde12345 dtmfmode=auto disallow=all allow=g729 language=es mailbox=200@default
Ejemplos de usuarios SIP
Configuración de Asterisk 54
Esto permite que un teléfono se registre hacia Asterisk sin contraseña Seguro [usuario2] context=supervisor type=friend host=dynamic secret=JuK!23+c9 deny=0.0.0.0/0 permit=192.168.1.0/24 El usuario tiene más argumentos configurados
Esto limita a una contraseña más segura y obliga a que tenga que tener una IP local
Control de nombres
Configuración de Asterisk 55
Debemos llevar un control de nombre de los dispositivos
•Evitar que se repitan
•Dar seguridad
•Facilitar la administración
Diferentes esquemas de nombrado de dispositivos tiene sus propias ventajas y desventajas
•Debemos decidir cual se adapta mejor a nuestras
necesidades
Control de nombres (2)
Configuración de Asterisk 56 Método Ejemplo Seguridad Crear/cambiarusuarios recordarFácil de
Extensiones 101 201 320 Baja fáciles de adivinar Difícil Cambiar equipos sin cambiar
extensión Muy Fácil Dígitos simples Personas/ Ubicaciones jortiz sala_juntas Media Difícil Imaginar casos donde el
mismo usuario tiene 2 dispositivos, o 2 personas se llaman igual en la compañía
Muy Fácil Nombres sencillos
Direcciones
MAC 00121419AEFF Difícil de adivinarAlta
Sencillo Nuevos dispositivos tienen
nuevas MAC Difícil Contraseñas tel-aJ13K74 Máxima Virtualmente imposible de adivinar Sencillo Es muy simple crear nuevas
Un poco más de seguridad
Configuración de Asterisk 57
Adicional al campo secret, siempre que sea posible debemos utilizar el permit y deny.
•Solo en aquellos usuarios
externos dinámicos no será posible aplicarlo
El orden es importante
•Lo común es negar todo y luego permitir lo que queremos Podemos usar nomenclatura estándar (/255.255.255.0) o abreviada (/24) [juan] type=friend context=agentes host=dynamic deny=0.0.0.0/0 permit=192.168.5.1/24 [carrier] type=peer contect=from-trunk host=201.194.200.9 deny=0.0.0.0/0.0.0.0 permit=201.194.200.9/255.255.255.255
Es posible crear plantillas de usuarios
• Los campos comunes se aplican una única vez y de ahí se reutilizan las veces que sean necesarias
• Ahorro de código al no tener
que redeclarar valores
Se declaran con (!)
Es posible aplicar múltiples plantillas al mismo tiempo
[usuario](!) type=friend context=micontexto host=dynamic [local](usuario,!) nat=no deny=0.0.0.0/0 permit=10.1.1.2/24 [100](usuario) secret=55tDyXID [200](local) secret=32nAc5Tt
Plantillas
Configuración de Asterisk 58Ejemplo general sip.conf
Configuración de Asterisk 59
[general]
disallow=all ; Negamos todos los codecs a todos
allow=alaw ; y solo permitimos alaw
[usuarios](!) ; Creamos una plantilla para
host=dynamic ; homologar nuestros usuarios
type=friend context=micontexto deny=0.0.0.0/0 permit=192.168.1.0/24
[usuario1](usuarios) ; Invocamos la plantilla y solo
secret=abcde12345 ; declaramos la contraseña
[usuario2](usuarios) ; Mismo caso. Podemos repetir cuantas
secret=fghij9876 ; veces queramos
[micarrier] ; Una troncal SIP para enviar llamadas
username=ccabrera ; No podemos reaprovechar la plantilla
secret=$uYjOpa2! ; porque los campos son muy diferentes
context=from-trunk type=peer
#include “sip_extra.conf” ; Podemos tener la configuración en más ; distribuida en varios archivos
Práctica 2.1
Creación de usuarios SIP y configuración de softphone
Práctica 2.2
Configurar un teléfono IP
Plan de marcación
Configuración de Asterisk 62
Se define en el archivo extensions.conf Contiene 3 secciones:
•[general]
•[globals]
•Área de contextos
[general] configura el manejo del archivo de
extensiones (comúnmente no se altera)
[globals] define constantes que pueden ser
referenciadas desde cualquier parte del dialplan
El área de contextos declara los diferentes contextos que definen el plan de llamadas
Sintaxis
Configuración de Asterisk 63
La sintaxis general del plan de llamadas es:
<extensión> es cualquier valor alfanumérico
<prioridad> es el orden con el que se ejecutarán las
diversas aplicaciones
<aplicación> es el comando a ejecutar
[contexto]
exten => <extensión>,<prioridad>,<aplicación>
Ejemplo de extensiones
válidas
Configuración de Asterisk 64 exten => 123,1,Answer exten => 123,2,Wait(5) exten => 123,3,Hangup exten => hola,1,Noop(nada) exten => hola,2,Playback(welcome) exten => hola,3,Dial(SIP/100) exten => 5546144330,1,Wait(3) same => 2,Dial(DAHDI/g0/${EXTEN}) same => 3,Hangup *1.6.2+ Notar el uso de same =>para abreviar extensionesExtensiones especiales
Configuración de Asterisk
Extensión Significado Función
t timeout Extensión que llega al no ingresar dígitos dentro
del tiempo establecido
T absolutetimeout
Se activa automáticamente cuando la llamada cumple con la duración especificada por ${TIMEOUT(absolute)}
h hangup Activada al colgar un canal
i invalid Activada al teclear una extensión que no existe
en el contexto
a,o operator
Utilizadas para escapar de un Voicemail al presionar * o cero al momento de escuchar la bienvenida
s start Extensión default de entrada
65
Extensión “s” (start)
Configuración de Asterisk 101 101 MEX GDL ¿ Llamada hacia SIP/GDL ? Llamada hacia SIP/GDL/101 s 66Prioridades
Configuración de Asterisk 67Determinan el orden de ejecución de los comandos de una extension
•Siempre deben comenzar con 1, de lo contrario Asterisk
invalidará toda la extensión
•El orden debe ser consecutivo
Al numerarlas, pueden ser escritas en cualquier orden
•Asterisk las ordenará en memoria
El uso de la prioridad ‘n’ (next) facilita la escritura
•Facilita hacer inserciones o cambios
Ejemplos de prioridades
Configuración de Asterisk 68
Extensión escrita en desorden pero numerada
exten => 100,3,Hangup exten => 100,1,Noop exten => 100,2,Answer
La misma extensión escrita con prioridad ‘n’
exten => 100,1,Noop exten => 100,n,Answer exten => 100,n,Hangup O bien: exten => 100,1,Noop same => n,Answer same => n,Hangup
Prioridades (2)
Configuración de Asterisk 69
Para diferenciar una prioridad de otra, la prioridad ‘n’ puede contener etiquetas:
[default]
exten => 100,1,Answer same => n,Wait(2)
same => n(bienvenida),Playback(welcome) same => n,Hangup
La referencia a estas etiquetas se puede hacer mediante un Goto
exten => 100,n,Goto(default,100,bienvenida)
Esto nos permite controlar el flujo de nuestro plan de marcación
Práctica 2.3
Plan de llamadas sencillo
Plan de llamadas
Configuración de Asterisk 71 Usuarios SIP micontextoPatrones
Configuración de Asterisk 72No es posible definir todas las posibles extensiones
Los patrones son caracteres especiales que reemplazan un rango de dígitos:
Todos los patrones deben ser precedidos por “_” para no ser descartados al momento de marcarlos
Patrón Dígitos que reemplaza
X Dígitos entre 0 y 9
Z Dígitos entre 1 y 9
N Dígitos entre 2 y 9
[x-y] Cualquier dígito comprendido en el rango
Ejemplos
Configuración de Asterisk 73
Patrón Dígitos que reemplaza
_0133ZXXXXXXX _0181ZXXXXXXX _0155ZXXXXXXX Llamadas de LDN hacia MGM _01NXXZXXXXXX Llamadas de LDN a provincia _01900XXXXXXX Llamadas a 01900 _ZXXXXXXX Llamadas locales
_ZXXXXX00 Llamadas locales que terminen en 00
_0[347]0 Servicios 030, 040 y 070
_9. Todo lo prefijado por 9
_1XZ Extensiones 101-199, excepto 100, 110, 120, etc.
Patrones (3)
Configuración de Asterisk 74
En caso de que más de un patrón coincida, Asterisk los ordena del más específico al más general:
1. Números/letras (1 única coincidencia) 2. Rangos [ ] (coincidencias de 1 a 7 dígitos) 3. N (8 coincidencias)
4. Z (9 coincidencias) 5. X (10 coincidencias) 6. . (infinitas coincidencias)
Por lo que si marcamos un número 019001234567:
•_01NXXXXXXXXX
•_01900XXXXXXX
Siempre coincide primero el 01900 por ser el más específico
Considerar esto al momento de permitir/negar patrones
Atención especial a los
patrones
Configuración de Asterisk 75
Si marcáramos hacia 019001234567, ¿la llamada pasaría o se colgaría?
R: La llamada pasaría
• Si bien no hay un Dial explícito que la deje salir, al no colgarse la llamada coincide con el patrón _01ZXXXXXXXXX prioridad 2.
• Siempre colgar la llamada cuando no deba continuar.
[largadistancia]
exten => _01ZXXXXXXXXX,1,Noop(Llamada de LD) same => n,Dial(SIP/carrier/${EXTEN})
exten => _01900ZXXXXXX,1,Noop(No permitir llamada)
Variables
Configuración de Asterisk 76
Mismo concepto que en un lenguaje de programación
•Son etiquetas que hacen referencia a un valor •Podemos extraer el valor en cualquier momento
Hay 4 tipos de variables
•Globales
•De canal (definidas por el usuario o pre-definidas)
•De entorno •Heredadas
Se declaran conforme al tipo de variable Se identifican por los símbolos ${ }
Variables globales
Configuración de Asterisk 77
Se declaran en la sección [globals] del archivo extensions.conf
Si se actualiza el archivo, todas las referencias a la variable cambian
Disponibles desde todos los canales
• Es global porque puede accederse desde cualquier lado
[globals] celular=0445512345678 [micontexto] exten => 911,1,Dial(DAHDI/g0/${celular})
Variables de canal
Configuración de Asterisk 78Asociadas con una única instancia (copia) del canal
•Diferentes copias del canal no cruzan sus variables
•Al colgar un canal, se destruyen las variables asociadas con él
Se declaran con la aplicación Set
exten => s,1,Set(MIVAR=hola)
Hay algunas variables pre-definidas por el sistema:
•${CONTEXT}: el contexto actual
•${EXTEN}: la extensión actual (marcada)
•${PRIORITY}: la prioridad de procesamiento actual
•${DIALSTATUS}: el estado del último comando Dial ejecutado
Variables de entorno
Configuración de Asterisk 79
Variables de Linux que se pueden acceder desde Asterisk
Se acceden con la función ${ENV(variable)}
Ejemplo:
exten => 123,1,Noop(El path de Linux es ${ENV(PATH)})
Variables heredadas
Configuración de Asterisk 80 Heredadas
•Llevan un guión bajo _
•Solo están disponibles para el primer canal creado por el canal padre
Heredadas indefinidamente
•Llevan dos guiones bajos __
•Disponibles para todos los canales generados por el padre
[micontexto]
exten => 100,1,Set(VAR1=1) same => n,Set(_VAR2=2) same => n,Set(__VAR3=3)
same => n,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3}) same => n,Dial(Local/nivel1@micontexto)
exten => nivel1,1,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3}) ; Var1 dará vacío, Var2 dará 2y Var3 dará 3
same => n,Dial(Local/nivel2@micontexto)
exten => nivel2,1,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3}) ; Var1 dará vacío, Var2 dará vacíoy Var3 dará 3
Manipulando variables
Configuración de Asterisk 81
Se usa la sintaxis:
${<nombre variable>[:<offset>:[<cantidad>]]}
•Ejemplo
${MIVAR} = holamundo
${MIVAR:3} = amundo ${MIVAR:-5} = mundo ${MIVAR:3:2} = am
•¿Cómo nos quedaríamos solo con 'hola'?
Útil para reformatear números:
Noop(${EXTEN}) ;015546144330
Set(EXTEN=52${EXTEN:2})
Noop(${EXTEN}) ;525546144330
Práctica 2.4
Uso de patrones y variables
Considerar cada contexto como un grupo de
permisos único
Reutilizar contextos declarados previamente
•Pueden incluirse contextos dentro de otros
Contextos de extensión
Configuración de Asterisk 83[nivel3]
Celulares
[nivel2]
LDN
[nivel1]
Locales
Contextos de extensión (2)
Configuración de Asterisk 84 Notar lo siguiente:Al marcar 50181181 dentro de [largadistancia] obtendremos
siempre un hangup, a pesar que en [locales] se permite
•Contexto principal siempre tiene preferencia sobre contextos incluidos [internas] exten => _ZXXX,1,Dial(SIP/${EXTEN}) [locales] include => internas exten => _ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN}) [largadistancia] include => locales exten => _01ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN}) exten => _ZXXXXXXX,1,Hangup
Contextos de extensión (3)
Configuración de Asterisk 85
Pueden incluirse contextos basados en tiempo Sintaxis:
include => contexto,<hora>,<dia>,<dia mes>,<mes>
Ejemplo:
Es recomendable incluir primero lo más específico y al último lo más general [micontexto] include => gratis,21:00-23:59,mon-fri,*,* include => gratis,*,sat-sun,*,*
Prioridades de ejecución
Configuración de Asterisk 86 Exten vs. Exten•Gana el que tenga el patrón de marcación más específico
Exten vs. Include
•Siempre gana el exten
Include vs. Include
•Gana el que esté declarado primero
Evaluador
Configuración de Asterisk 87
Podemos evaluar una operación lógica o aritmética
usando $[ ]
Ejemplo:
Esto puede usarse para hacer reemplazos o evaluar condicionales
• Asterisk no evalúa operaciones por default
Operadores válidos +, -, *, /, %, >, >=, <, <=, =, !=, &, |, ~ exten => s,1,Set(MiValor=$[10/2]) same => n,Noop(${MiValor}) ; 5
Funciones
Configuración de Asterisk 88Permiten procesar valores o datos que normalmente no estarían accesibles:
Se despliegan con el comando core show functions desde el *CLI
Se escriben completamente en mayúsculas
Se acceden como si fueran variables ${FUNC()}
•No perder de vista el orden de los { ( ) }
Funciones (2)
Configuración de Asterisk 89
Algunas funciones guardan valores, otras sólo los
despliegan
Ejemplo: LEN() regresa la longitud de una cadena
Set(MIVAR=“hola mundo”)
Noop(${LEN(${MIVAR})}) ; 10
Ejemplo: CALLERID(num) permite cambiar o mostrar el caller id
Set(CALLERID(num)=5544332211) Noop(El valor es ${CALLERID(num)})
Subrutinas
Configuración de Asterisk 90
Conjuntos de acciones agrupadas que reciben parámetros
•Hechas por el usuario
•Útiles para procesos repetitivos con cambios entre invocaciones
Reemplazan el concepto de macros de versiones anteriores de Asterisk
•Las subrutinas no tienen límite de anidamiento
Al ejecutar una subrutina, se brinca hacia el contexto-extensión-prioridad que la subrutina indique
•Es necesario agretar un Return() para regresar al punto desde el que se invocó a la subrutina.
Subrutinas (2)
Configuración de Asterisk 91
Cuando se invoca una subrutina, se pueden proporcionar argumentos
•Se usan para personalizar la subrutina •Se crean automáticamente en las variables
${ARG1}, ${ARG2}, ${ARG3}, etc
Cada subrutina tiene variables individuales
•Los argumentos no se mezclan entre si
Se invocan con la aplicación Gosub
•Gosub(<contexto>,<extensión>,<prioridad>([argumentos]) )
Cualquier extensión puede convertirse en subrutina
Ejemplo de una subrutina
Configuración de Asterisk 92
De esta manera, pueden alterarse todas las acciones modificando solamente la subrutina
• En este ejemplo el Return sobra porque de cualquier manera, la llamada se cuelga antes de llegar a él.
[sub-llamada]
exten => s,1,Answer ; Este es el código que
same => n,Dial(${ARG1},20) ; declara la subrutina.
same => n,Voicemail(${ARG2}) ; No sirve de nada hasta
same => n,Hangup ; que no la invoquemos
same => n,Return [default]
exten => 100,1,Gosub(sub-llamada,s,1(SIP/chris,${EXTEN}) ) exten => 110,1,Gosub(sub-llamada,s,1(SIP/juan,${EXTEN}) ) exten => 120,1,Gosub(sub-llamada,s,1(SIP/carlos,${EXTEN}))
En resumen
Configuración de Asterisk 93 Cada archivo en Asterisk tiene una labor específica
• Usuarios SIP en sip.conf
• Plan de llamadas en extensions.conf
Cada extensión debe tener una prioridad y aplicación para ejecutarse
• No repetir extensiones/prioridades
Los patrones nos ahorran extensiones
• Muchas extensiones coinciden con una sola línea
Las variables almacenan valores que podemos reutilizar Podemos agrupar tareas usando subrutinas
• E invocarlas las veces que sean necesarias cambiando solo los argumentos
Práctica 2.5
Subrutinas e inclusionesPlan de llamadas
Configuración de Asterisk 95 Usuarios SIP micontexto internas adicional llamadaCapítulo Básico #3
Arquitectura de Asterisk
Antecedentes
Arquitectura de Asterisk 97 Los módulos de Asterisk se configuran de manera independiente •Alto nivel de control En el núcleo, Asterisk solo es un conmutador •Ajeno a cualquier tecnología Fuente: wiki.asterisk.orgSistema de archivos
Arquitectura de Asterisk 98Asterisk coloca sus archivos en diferentes carpetas:
Tipo de archivo Ubicación
Configuración /etc/asterisk Módulos /usr/lib/asterisk/modules Logs /var/log/asterisk AGIs /var/lib/asterisk/agi-bin Sonidos /var/lib/asterisk/sounds Voicemail /var/spool/asterisk/voicemail Grabaciones /var/spool/asterisk/monitor
Salida de llamadas /var/spool/asterisk/outgoing
Ajeno a cualquier tecnología
•Podemos hacer crecer a Asterisk agregando el módulo que le brinde las nuevas
funcionalidades
Provee las interfaces de configuración y control del sistema
•AMI, AGI, CLI
Responsable de
•Administrar módulos •Carga de configuración •Sincronía del sistema •Manejo de canales •Control del plan de
llamadas
Núcleo de Asterisk
Arquitectura de Asterisk 99
Haciendo crecer a Asterisk
Arquitectura de Asterisk 100
Para agregar/quitar funcionalidades, controlamos los módulos que Asterisk carga
•Editando /etc/asterisk/modules.conf limitamos cuales
módulos serán cargados
Tenemos 4 clases principales de módulos:
•Canales •Códecs
•Aplicaciones/funciones •Recursos adicionales
Lista de módulos
Arquitectura de Asterisk 101 app_originate.so app_page.so app_parkandannounce.so app_playback.so app_playtones.so app_privacy.so app_queue.so app_readexten.so app_read.so app_record.so app_sayunixtime.so app_senddtmf.so app_sendtext.so app_sms.so app_softhangup.so app_speech_utils.so app_stack.so app_system.so app_talkdetect.so app_test.so app_transfer.so app_url.so app_userevent.so app_verbose.so app_voicemail.so app_waitforring.so app_waitforsilence.so app_waituntil.so app_while.so app_zapateller.so bridge_builtin_features.so bridge_multiplexed.so bridge_simple.so bridge_softmix.so cdr_custom.so cdr_manager.so cdr_syslog.so chan_agent.so chan_bridge.so chan_dahdi.so chan_iax2.so chan_local.so chan_multicast_rtp.so chan_sip.so codec_adpcm.so codec_alaw.so codec_a_mu.so codec_dahdi.so codec_g722.so codec_g726.so codec_g729.so codec_gsm.so codec_ilbc.so codec_lpc10.so codec_resample.so codec_ulaw.so format_g719.so format_g723.so format_g726.so format_g729.so format_gsm.so format_h263.so format_h264.so format_ilbc.so format_jpeg.so format_pcm.so format_siren14.so format_siren7.so format_sln.so format_vox.so format_wav_gsm.so format_wav.so func_aes.so func_audiohookinherit.so func_base64.so func_blacklist.so func_callcompletion.so func_callerid.so func_cdr.so func_channel.so func_config.so func_cut.so func_db.so func_devstate.so func_dialgroup.so func_dialplan.so func_enum.so func_env.so func_extstate.so func_frame_trace.so func_global.so func_groupcount.so func_hangupcause.so func_iconv.so func_jitterbuffer.so func_lock.so func_logic.so func_math.so func_md5.so func_module.so func_pitchshift.so func_presencestate.so func_rand.so func_realtime.so func_sha1.so func_shell.so func_sprintf.so func_srv.so func_strings.so func_sysinfo.so func_timeout.so func_uri.so func_version.so func_vmcount.so func_volume.so pbx_ael.so pbx_config.so pbx_loopback.so pbx_realtime.so pbx_spool.so res_adsi.so res_ael_share.so res_agi.so res_calendar.so res_clialiases.so res_clioriginate.so res_config_sqlite3.so res_convert.so res_crypto.so res_fax.so res_format_attr_celt.so res_format_attr_h263.so res_format_attr_h264.so res_format_attr_silk.so res_limit.so res_monitor.so res_musiconhold.so res_mutestream.so res_realtime.so res_rtp_multicast.so res_security_log.so res_smdi.so res_speech.so res_stun_monitor.so app_adsiprog.so app_alarmreceiver.so app_amd.so app_authenticate.so app_cdr.so app_celgenuserevent.so app_chanisavail.so app_channelredirect.so app_chanspy.so app_confbridge.so app_controlplayback.so app_dahdiras.so app_db.so app_dial.so app_dictate.so app_directed_pickup.so app_directory.so app_disa.so app_dumpchan.so app_echo.so app_exec.so app_externalivr.so app_festival.so app_flash.so app_followme.so app_forkcdr.so app_getcpeid.so app_ices.so app_image.so app_macro.so app_milliwatt.so app_minivm.so app_mixmonitor.so app_morsecode.so app_mp3.so app_nbscat.soMódulos: Canales
Arquitectura de Asterisk 102Asterisk puede interactuar con cualquier medio para el cual tenga un canal para comunicarse
•SIP, IAX2, H323, DAHDI, Local, Unicall, etc
Cada canal es responsable de manejar su propia lógica y memoria
•El funcionamiento de un canal no afecta a los demás
Algunos canales representan un protocolo (ej. SIP), mientras que otros solo siguen argumentos lógicos (ej. Local)
Módulos: Aplicaciones
Arquitectura de Asterisk 103
Ejecutan acciones durante una llamada
Se cargan dinámicamente conforme se necesitan Ejecutadas síncronamente
• Se invoca la aplicación al momento en que se le manda llamar,
sin que previamente esté corriendo
Podemos aumentar la serie de comandos que Asterisk puede ejecutar en cada llamada
• Asterisk carga 180+ aplicaciones al momento de arrancar el
sistema
Pueden consultarlas usando
*CLI> core show applications
Módulos: Aplicaciones (2)
Arquitectura de Asterisk 104
Algunas aplicaciones:
Aplicación Acción
Dial Marca hacia la tecnología/canal especificado Wait Espera ‘x’ segundos
Goto Brinca hacia la prioridad especificada GotoIf Brinca condicionalmente
Macro Permite agrupar más aplicaciones y repetirlas AGI Invoca un AGI script externo
Playback Reproduce un archivo de sonido
Background Igual que Playback, pero permite ingresar DTMFs Read Pide dígitos al usuario y los almacena en una variable Hangup Cuelga la llamada
Módulos: Recursos
Arquitectura de Asterisk 105
Integran a Asterisk con recursos externos
•Bases de datos •Calendarios •Música en espera •Monitoreo (grabación)
Se cargan de manera estática
•Requieren una recarga de módulo al modificarse
Pueden operar simultáneamente en varios canales
•Cada canal recibe lo mismo que los otros
Asterisk CLI
Arquitectura de Asterisk 106
La interfaz humano-Asterisk
•Nuestra principal herramienta de control en el curso
Le permite al administrador:
•Consultar el estado del sistema •Recargar o reiniciar el sistema •Actualizar valores en tiempo real •Desplegar ayuda
•Hacer debug
Módulos pueden agregar comandos al *CLI
•Ej. sip show peers depende del módulo chan_sip.so
AGI: Asterisk Gateway
Interface
Arquitectura de Asterisk 107
Ejecuta scripts externos a Asterisk Escritos en diferentes lenguajes
•Perl, PHP, Python, Bash, etc
Permite que Asterisk sea una puerta de enlace (gateway) entre un teléfono y una aplicación
no-telefonica
•Encuestas, IVRs, juegos, etc
Se verá más a detalle en un capítulo propio
AMI: Asterisk Manager
Interface
Arquitectura de Asterisk 108
A diferencia del CLI, esta es una interfaz
computadora-Asterisk
Permite ejecutar comandos o monitorear al sistema Al igual que el CLI, algunos módulos agregan
comandos
Usada por aplicaciones como el FOP, popups de agente para callcenter, sistemas de click-to-call, etc Se verá más a detalle al final del curso
Práctica 3.1
Instalando un módulo desde source: format_mp3 para música en espera
Práctica 3.2
Instalando un módulo precompilado: Códec G729
Práctica 3.3
(opcional)
Cambiando el idioma de Asterisk
Capítulo Básico #4
Aplicaciones
Introducción
Aplicaciones de Asterisk 113
Existen muchas aplicaciones en Asterisk
•Más de 150+
Cada aplicación tiene su propia sintaxis
•No es necesario aprenderlas todas, pero si las más importantes
Todas son consultables desde el *CLI
core show applications
core show application <aplicación>
Buzones de voz
Aplicaciones de Asterisk 114
Ofrecer funcionalidad de dejar mensaje a un usuario. Los buzones se crean en archivo voicemail.conf
•Allí se definen los usuarios, sus nombres, contraseñas y
correos para envio de mensajes
Se usa a través de 2 aplicaciones:
•Dejar el mensaje: Voicemail
•Recuperar los mensajes: VoicemailMain
Es necesario programar estas aplicaciones en el extensions.conf
voicemail.conf
Aplicaciones de Asterisk 115
Aquí configuramos los buzones y sus contraseñas Configuración general y múltiples contextos de buzones de voz
Si queremos tener activo el envío de correos debemos instalar un MTA (Mail Transfer Agent) en Linux
[general]
; Aquí va la configuración general de los buzones de voz
[default]
101 => 1234,Juan Pérez,[email protected],,attach=yes 102 => 1234,Jorge López,[email protected],,attach=yes
Voicemail
Aplicaciones de Asterisk 116
Permite dejar un mensaje de voz al buzón especificado
•El buzón/contexto deben existir en el voicemail.conf •Podemos dejar un mensaje en más de un buzón a la vez
Sintaxis:
Voicemail(<buzón>[@<contexto>],<opciones>)
Ejemplos:
Voicemail(100,b) Voicemail(201&202,u)
VoicemailMain
Aplicaciones de Asterisk 117
Desde aquí escuchamos nuestros mensajes
• Permite también configurar las opciones del buzón, tales como
las bienvenidas
• Es importante vaciar el buzón para evitar que se llene
Podemos saltar la autenticación
• Hacer que no se le pida contraseña al usuario y pasar directo a
los mensajes Sintaxis: VoicemailMain([buzón],[opciones]) Ejemplos: VoicemailMain(100,s)
VMAuthenticate
Aplicaciones de Asterisk 118Autentica al usuario a partir de la contraseña de su buzón
•Las contraseñas están definidas en el voicemail.conf
Usando VoiceMailMain, el usuario final puede actualizar sus contraseñas sin intervención del administrador
•El usuario se debe hacer responsable de su contraseña y su uso
•Permite personalizar contraseñas a nivel individual
3 intentos fallidos y la llamada es colgada Sintaxis: VMAuthenticate([buzón][@contexto],[opciones]) Ejemplos: VMAuthenticate(101@default)
Ejemplos de uso
Aplicaciones de Asterisk 119 ; voicemail.conf [default] 101 => 1234,Juan Pérez,[email protected],,attach=yes ; extensions.conf [sub-llamar] exten => s,1,Dial(${ARG1},20)same => s,n,Voicemail(${ARG2}@default) same => s,n,Hangup
same => s,n,Return [internas]
include => larga-distancia exten => _*86,1,VoicemailMain()
exten => _1XX,1,Gosub(sub-llamar,s,1(SIP/${EXTEN},${EXTEN})) [larga-distancia]
exten => _01ZXXXXXXXXX,1,VMAuthenticate(${CALLERID(num)}@default) same => n,Dial(SIP/carrier/${EXTEN})
Práctica 4.1
Agregar servicio de voicemail para nuestras extensiones
Interacción con el usuario
Aplicaciones de Asterisk 121
En ocasiones tenemos necesidades como:
•Repetir alguna grabación (bienvenidas) •Dar opciones de menu
•Capturar dígitos ingresados en el teléfono •Reproducir números
Asterisk permite reproducir archivos de audio
•Se soportan diferentes códecs, además de diferentes
idiomas para los archivos de sonido
•Los sonidos se buscan por default en
/var/lib/asterisk/sounds
Playback
Aplicaciones de Asterisk 122
Reproduce el sonido especificado
•Obliga al usuario a escucharlo (no puede saltarse) •No pueden recibirse tonos mientras se reproduce
La extensión del archivo se omite
•Asterisk escogerá el mejor códec disponible
•Lo mismo aplica para el resto de las aplicaciones de sonidos
Sintaxis: Playback(<archivo>,[opciones]) Ejemplo: Playback(bienvenida)
Background
Aplicaciones de Asterisk 123Muy parecida a Playback, salvo que al usuario se le permiten ingresar dígitos
•Asterisk transferirá al usuario a la extensión marcada
•Si el número marcado no existe, transferirá a la extensión i
(inválida) Sintaxis: Background(<archivo>) Ejemplo: Background(digite-opciones)
Read
Aplicaciones de Asterisk 124Pide dígitos al usuario
•No se hace nada con ellos, solo se almacenan en una
variable para uso posterior
Sintaxis:
Read(<var>,[archivo],[maxdigitos],[opciones], [intentos],[timeout])
Ejemplo:
Entendiendo la diferencia
Aplicaciones de Asterisk 125
Read pide datos para almacenar o procesar
•Ej. Contraseñas o números de cuenta
Background transfiere hacia la ext. marcada
•Ej. «Para ventas, digite 1. Soporte digite 2»
Playback solo reproduce archivos
•Obligamos al usuario a que escuche la grabación
SayDigits
Aplicaciones de Asterisk 126
Reproduce un número dígito por dígito
•12345 = Uno dos tres cuatro cinco
Se usa para reproducir números que no correspondan a una cantidad •Números de contrato •Números de cuenta •Contraseñas Ejemplo: SayDigits(123192)
SayNumber
Aplicaciones de Asterisk 127Lee un número como una cantidad
•12345 = Docemil trescientos cuarenta y cinco
Debe recibir solamente números enteros
•No hace distinción de números o cadenas
Ejemplo:
Saynumber(123192)
Sobre las aplicaciones
de audio
Aplicaciones de Asterisk 128
Todos los sonidos se buscan por default en
/var/lib/asterisk/sounds
Para cambiar el idioma de los sonidos, hay 2 maneras:
•Cambiar el campo language=XX dentro del sip.conf, iax.conf o chan_dahdi.conf
•Hacer un Set(CHANNEL(language)=XX) en el plan de llamadas •XXes el código de idioma deseado (es, fr, it, en, etc)
Si algún archivo de sonido no existe en el idioma deseado, se usará el mismo archivo en inglés
Ejemplo
Aplicaciones de Asterisk 129 [from-pstn] include => horario-habil,9:00-18:00,mon-fri,*,* include => fuera-de-horario [horario-habil] include => internasexten => s,1,Background(bienvenida)
same => n(opciones),Background(digite-opcion)
same => n,Goto(opciones) [fuera-de-horario]
exten => s,1,Playback(recordamos-horarios-operacion)
same => n,Hangup
Práctica 4.2
Rutinas con reproducción de audio
Control de llamadas
Aplicaciones de Asterisk 131
Para asegurar que el audio fluya a través del canal, es recomendable contestarlo primero
•Algunas aplicaciones lo hacen automáticamente
Es ocasiones es necesario insertar silencios antes o después del audio
•Dar mejor espacio entre llamadas o dar oportunidad al
usuario a que ingrese dígitos
Answer
Aplicaciones de Asterisk 132
Contesta un canal y comienza la tarificación
•Puede especificarse un tiempo de espera antes de continuar
con la siguiente prioridad
Procurar no usar Answer sino dejar que otra aplicación haga un contestado implícito Sintaxis:
Answer([milisegundos])
Ejemplo:
Wait
Aplicaciones de Asterisk 133
Hace al usuario esperar un tiempo obligatorio
•No se pueden ingresar dígitos mientras se espera •Puede especificarse el tiempo que dure el silencio en
decimales
•Es equivalente a un Playback en silencio
Sintaxis: Wait(<segundos>) Ejemplo: Wait(10)
WaitExten
Aplicaciones de Asterisk 134Funciona igual que Wait, pero el usuario puede ingresar dígitos
•Asterisk intentará comunicar al usuario a la extensión
marcada
•Útil para dar tiempos adicionales en IVRs
•Es equivalente a un Background en silencio
Sintaxis: WaitExten(<segundos>,[opciones]) Ejemplo: WaitExten(3.5)
Comunicación entre
usuarios
Aplicaciones de Asterisk 135La tarea más importante en un conmutador es
comunicar extensiones
Asterisk ofrece la posibilidad de comunicar
varios usuarios en una misma llamada
Dial
Aplicaciones de Asterisk 136
Permite enlazar usuario con usuario
•Siempre debe contener una tecnología y un usuario •Asterisk puede convertir entre los protocolos
Podemos marcar a más de un usuario a la vez Sintaxis:
Dial(<tech/user>,[timeout],[opciones])
Ejemplo:
Dial(SIP/100,30,tT)
Meetme
Aplicaciones de Asterisk 137 Establece cuartos de conferencia
• Une a ‘n’ personas en una sola llamada
Tiene muchas opciones disponibles:
• Solo hablar, solo escuchar, grabar conferencia, ejecutar AGI en el fondo, usar contraseña, etc
Si no se proporciona el número de la conferencia, se le pedirá uno al usuario
• Al colgar el último usuario, la conferencia se cierra
Sintaxis: MeetMe([conferencia][,opciones[,nip]]) Ejemplo: Meetme(8500,d) Meetme(8501,D,2198)
Controles de flujo
Aplicaciones de Asterisk 138El dialplan sigue una programación secuencial
•Cada evento que ocurre va después de otro •Es posible alterar el flujo haciendo saltos
Podemos evaluar condiciones para saber si es necesario saltar o no
También es posible evaluar acciones directamente
Goto
Aplicaciones de Asterisk 139
Hace saltos incondicionales hacia cualquier contexto-extensión-prioridad
Puede recibir 1, 2 o 3 parámetros
• 1: Solo prioridad (misma ext. y contexto) • 2: Extensión y prioridad (mismo contexto)
• 3: Contexto, extensión y prioridad
Sintaxis:
Goto([contexto],[extensión],<prioridad>)
Ejemplos: Goto(opciones) Goto(s,continua) Goto(default,s,1)
GotoIf
Aplicaciones de Asterisk 140Igual que Goto, pero solo brinca si la condición se cumple
•Dos posibles destinos
•Es importante evaluar la condicional
Sintaxis:
GotoIf(<condición>?<verdadero>:[falso])
Ejemplos:
ExecIf
Aplicaciones de Asterisk 141
Permite ejecutar una aplicación única basada en una condicional
•Útil para hacer variaciones en un solo comando
Ejemplo:
ExecIf($[${var}>1]?Playback(hola):Playback(adios))
Ejemplo global: IVR
Aplicaciones de Asterisk 142 [from-pstn] include => internas exten => s,1,Answer(3000) same => n,Playback(bienvenida) same => n,Wait(1) same => n(opciones),Background(digite-opcion) same => n,WaitExten(4) same => n,Goto(opciones) exten => 1,1,Dial(SIP/100) exten => 2,1,Dial(SIP/201&SIP/202) exten => 3,1,Read(password,dame-tu-pass) same => n,GotoIf($[${password}=“1234”]?bien:mal) same => n(mal),Playback(pbx-invalid) same => n,Goto(s,opciones) same => n(bien),Playback(demo-congrats) same => n,Goto(s,opciones) exten => 5,1,Meetme(5000) same => n,Goto(s,opciones) exten => i,1,Goto(s,opciones)
Práctica 4.3
Crear un menu IVR
Práctica 4.4 (opcional)
Plan de llamadas
Aplicaciones de Asterisk Usuarios SIP micontexto internas adicional saldo llamada contador menu servicios 145Capítulo Básico #5
Conexión con la PSTN
usando DAHDI
Ing. Christian Cabrera R.
Introducción
Interconexión por DAHDI 147
Asterisk tiene la posibilidad de interactuar con
la PSTN
•Se requiere de hardware adicional o rentar un servicio de terceros
Para la interconexión directa pueden usarse
gateways externos o tarjetas internas
•Los gateways se configuran por SIP •Nos centraremos en las tarjetas
Al no usar protocolos propietarios, la libre competencia ha reducido los costos del equipo Los 3 principales
fabricantes del mercado:
•Digium •Sangoma •Openvox
Cualquiera de sus tarjetas funciona con Asterisk, solo se configuran un poco diferente
Fabricantes
Tarjetas analógicas
Interconexión por DAHDI 149 FXO (Foreign Exchange Office)
• Reciben corriente (de la telefónica)
• Aquí conectas una línea que viene de la calle (Telmex, Axtel, Alestra, etc)
FXS (Foreign Exchange Station) • Entregan corriente hacia el teléfono
• Conectas un teléfono convencional (Panasonic, Alcatel, Siemens, etc)
Puertos analógicos
Interconexión por DAHDI 150
Son los más comunes
•Estos son los puertos que usaríamos para poner un PBX en
casa
Limitados a una llamada simultánea por canal
•El par de cobre está dedicado a un único circuito
En otros conmutadores se llaman diferente:
•FXO = CO •FXS = EXT
¡Nunca conectar FXS-FXS!
•Podrías quemar los puertos
Tarjetas digitales
Interconexión por DAHDI 151 Todas soportan tanto E1s como T1s
• Configurable por software
T1: Estándar Americano
• 23 canales de voz + 1 señalización
E1: Estándar Europeo
• 30 canales de voz + 1 de señalización + 1 de sincronía
Conexión física
Interconexión por DAHDI 152
Las tarjetas digitales tienen puertos RJ45 (8 pines), pero los enlaces normalmente vienen en G703 (coaxial)
•Es necesario un convertidor que además de adaptar el conector, acople las impedancias correctamente
Puertos digitales
Interconexión por DAHDI 153
Son troncales de múltiples canales digitales (DS-0)
• Usando TDM (Time Division Multiplexing) es posible agrupar
muchos canales en un solo enlace
Usados en entornos de grandes oficinas o corporativos
• Hasta 30 canales de voz con muchos DIDs diferentes
Son tecnológicamente superiores que los análogos:
• Mayor calidad
• No son susceptibles al ruido
• Confiabilidad
Las tarjetas son más caras
• Aunque la renta del servicio digital suele ser mas cara • El costo puerto por puerto es más barato
Sincronía
Interconexión por DAHDI 154
Dado que los enlaces digitales están multiplexados en tiempo, requieren de una fuente de sincronía
Las tarjetas digitales tienen 2 opciones:
•Tomar la sincronía que proviene del enlace (recomendado si es
que estamos conectados con la telefónica)
•Generar la sincronía propia (cuando Asterisk es el equipo maestro)
Sin una fuente de sincronía precisa, tendremos problemas
•Ruidos en la línea
•Puede ocasionar que las llamadas se desconecten
Deberemos configurar este parámetro en el system.conf
Framing
Interconexión por DAHDI 155
Según el tipo de enlace, hay diferentes tipos:
Tanto D4 como CAS son tecnologías viejas y no deberían usarse
•Desafortunadamente, en Latinoamérica usamos principalmente R2 modificado, el cual usa CAS
T1s (EUA y CAN) E1s (resto del mundo)
D4 – Super Frame
(obsoleto)
CAS – Channel Associated Signaling(obsoleto)
ESF – Extended Super Frame CCS – Common Channel Signaling
Comparación ISDN vs
R2MFC
Interconexión por DAHDI 156 E1s con ISDN PRI E1s Canalizados (R2 MFC)
30 canales de voz 30 canales de voz
Usa CCS Usa CAS
Canal 1 se usa para framing. Canal 16 se usa para señalización
Canal 1 se usa para framing. Canal 16 se usa para señalización Soporta Euro ISDN, tanto en modo
de CPE como red (esclavo / maestro) Soporta FXS, FXO, E&M Comúnmente usa CRC para
corroborar errores en transmisión
Obsoleto en Europa Común en América Latina Más caro, por ser tecnología nueva
Ofrece mucho más información por llamada
Interconexión con
otros PBX
Interconexión por DAHDI 157
Es posible interconectar Asterisk con otros sistemas no IP
•FXS-FXO o FXO-FXS es lo más común, pero te limita a una
sola llamada por puerto
•También es posible usar E1s con cable cruzado
Asterisk puede actuar como maestro (simular ser la telefónica) o actuar como esclavo (dejando al otro PBX ser el maestro)
•Puede adaptarse fácilmente a las necesidades del otro
conmutador
¿Qué es un DID?
Interconexión por DAHDI 158
Direct Inward Dialing
•Es el número telefónico al cual marcamos
Un DID debe estar asociado con un canal para poder recibir las llamadas
•No confundir el DID con la línea/canal para recibir (similar a usuarios SIP y extensiones)
Es posible comprar DIDs virtuales que lleguen por SIP
•Esto evita tener que comprar tarjetas
Un enlace digital puede tener múltiples DIDs
•Al recibir la llamada, la telefónica indica a que DID marcó el
cliente
•Una línea análoga tiene un DID único asignado
Interacción en software
Interconexión por DAHDI 159
Asterisk /etc/asterisk/chan_dahdi.conf DAHDI /etc/dahdi/system.conf Tarjetas Digium Wanpipe /etc/wanpipe/wanpipe1.conf Tarjetas Sangoma OpenR2
Solo en caso que usemos R2 MFC
/etc/dahdi/system.conf
Interconexión por DAHDI 160
Archivo base de configuración de las tarjetas
•Liga los módulos de DAHDI con los puertos de las tarjetas
Por cada puerto digital, declaramos un span
•Se configura el framing y el coding que el enlace use (según sean
ISDN PRI, R2 MFC, etc)
•Adicionalmente, deben declararse los canales de cada span
Los puertos análogos de declaran cruzados
•FXO se declaran como FXS y viceversa
Los canales deben ser consecutivos de acuerdo al orden en que se cargan los módulos