Subido por D.O H.C

Asterisk PBX Instalacion configuracion y puesta en marcha

Anuncio
PRIMERA EDICION
Asterisk : La Guía en Español
PBX
Bernard Pérez
SNC IT
Rep. Dom.
Asterisk PBX: Instalación, Configuración y puesta en marcha, Primera Edición.
Por Bernard Pérez
Copyright © 2014 Bernard Pérez. Todos los derechos reservados.
Impreso en República Dominicana.
Este libro puede ser adquirido para uso educacional únicamente.
Edición disponible solo en formato electrónico (PDF), descargable en línea.
Para obtener más información, póngase en contacto openbookrd / [email protected].
Primera Edición:
Enero 2014
Visite openbookr.com si precisas más información.
Logotipo, imágenes, nombres comerciales, otros son marcas registradas por los fabricantes y
vendedores para distinguir sus productos, cuándo esa designaciones aparecen en este libros solo sea
hace con fines educativos. Sus respectivos propietarios conservan el derecho de retirar cualquier
mención o marca registrada de este libro.
Si bien todas las precauciones se han tomado en la preparación de este libro, el autor no asume
responsabilidad alguna por errores u omisiones, o por los daños que resulten del uso de la información
contenida en el presente documento.
Tabla de Contenido
1. Introducción a la Telefonía Tradicional…………………………………………………………………… 10
Historia de la Telefonía
Principios y transmisión de la voz humana
Digitalización de la voz
Redes orientadas a circuitos
Redes orientadas a paquetes
Red Pública Telefónica (PSTN)
Circuitos Analógicos
Circuitos digitales
Protocolos de señalización digital
2. Introducción a la Telefonía VoIP…………………………………………………………………………………
21
Protocolos VoIP
Codificación de la Voz
Protocolos IP
Protocolos de Transporte
3. Introducción a Asterisk PBX……………………………………………………………………………………….
¿Qué es Asterisk?
32
Breve Historia de Asterisk
El Proyecto Zaptel (DAHDI)
Versiones de Asterisk
Preparando su sistema Asterisk
Directorio de Asterisk
Asterisk CLI
4. Arquitectura de Asterisk……………………………………………………………………………………………. 39
Módulos
Módulos de Aplicaciones
Módulos Puentes
Módulos de Grabación de Detalles de Llamadas (CDR)
Módulos de Registro de Eventos de Canales
Módulos de Drivers de Canales
Traductores de CODEC
Interprete de Formatos
Funciones del Dialplan
Módulos PBX
Módulos de Recursos
Módulos Adicionales
Módulos de Prueba
Estructura de Archivos
Archivos de configuración
Módulos
Librerías de Recursos
Spool
Logging
El Dialplan
Hardware para Asterisk
5. Instalación de Asterisk………………………………………………………………………………………………
52
Instalación del Linux CentOS Server
Actualizando CentOS
Habilitando NTP para Sincronizar la Hora del Sistema
Agregando Usuarios al Sistema
Instalando Ubuntu Server
Instalación del Sistema Base
Actualizando Ubuntu
Habilitando NTP para Sincronizar la Hora del Sistema Ubuntu
Software Dependencias
Descargando lo que Necesita para la Instalación de Asterisk
Obtener los Fuentes a través de Subversión
Obtener los Fuentes a través de wget
¿Cómo instalar?
DAHDI
LibPRI
Asterisk
Definiendo los permisos de Archivos
Configuración Básica de Asterisk
Deshabilitar SeLinux
Borrar reglas de iptables
Configuración inicial de Asterisk
indications.conf
asterisk.conf
modules.conf
musiconhold.conf
make menuselect
Uso de menuselect
Interface de menuselect
Instalación de las dependencias para menuselect
Menuselect scripting
Problemas comunes en la instalación
6. Tareas de configuración inicial…………………………………………………………………………………… 82
Asterisk.conf
La sección [directories]
Sección [opciones]
Sección[compat]
modules.conf
La sección [modules]
indications.conf
musiconhold.conf
Convirtiendo música en formato que trabaje mejor con Asterisk
Archivo predeterminado musiconhold.conf
Archivos de configuración adicionales
7. Dispositivos de usuarios…………………………………………………………………………………………….
Configuración de los dispositivos de usuarios
92
Tipos de dispositivos de usuarios
Teléfonos físicos
Softphones
ATAS
Configuración de Asterisk
Como trabajan los Archivos de configuración de canales con el Dialplan
sip.conf
IAX.conf
Modificar los archivos de configuración de canales de acuerdo a su entorno
Cargando su nueva configuración de los canales
Asterisk CLI
Verificando que los dispositivo se hayan registrado
Métodos para conectar los teléfonos análogos con Asterisk
Dialplan básico para probar sus dispositivos
Realizando su primera llamada
8. Fundamentos del Dialplan……………………………………………………………………………………….. 112
¿Qué es el Dialplan?
Sintaxis del Dialplan
Contexto
Extensiones
Prioridad
Prioridades sin numeral
El operador same=>
Prioridades etiquetadas
Aplicaciones
Answer()
Answer()
Playback()
Hangup()
Ejemplo de un Dialplan simple
Construyendo un Dialplan Interactivo
Aplicaciones Goto, Background y WaitExten
Manejando entradas invalidad y Tiempo de espera (Timeout)
La aplicación Dial()
Argumento 1: Destino
Argumento 2: Timeout
Argumento 3: Opción
Argumento 4: URI
Actualizando el Dialplan
Argumentos en blanco
Usando variables en el Dialplan
Variables globales
Variables de canales
Variables de ambiente
Agregando variables a nuestro dialplan
Patrones de Marcado
Sintaxis de los patrones de marcado
Ejemplos de patrones de marcado
Usando la variable de canal ${EXTEN}
La directiva include
9. Conectividad con el mundo exterior…………………………………………………………………………
Fundamentos de Trunking
133
Dialplan básico para conectividad con el mundo exterior
Circuitos PSTN
Troncales PSTN tradicionales
Telefonía Análoga
Telefonía Digital
Instalando un Troncal PSTN
Descargando e instalando DAHDI
Configurando un circuito digital
PRI ISDN
BRI ISDN
MFC/R2
Configurando un circuito Análogo
La extensión S
VOIP
Terminación PSTN
Originación PSTN
De VOIP a VOIP
Configurando troncales VOIP
Configurando un troncal SIP entre dos sistema Asterisk
Conectando dos sistema Asterisk
Conectando un sistema Asterisk con el proveedor VOIP
Encriptando las llamadas SIP
Configurando troncales IAX entre dos sistema Asterisk
Llamadas de emergencias
10. Correo de voz…………………………………………………………………………………………………………..
¿Qué es comedian mail?
Estructura del archivo voicemail.conf
Sección general
Sección zonemessages
Sección de contexto
Telefonía Digital
Configuración básica del archivo voicemail.conf
Integración con sip.conf
Integración con el dialplan
La aplicación del dialplan VoiceMail()
La aplicación del dialplan VoiceMailMain()
La aplicación Directory()
Introducción a Jitterbuffer
162
11. Internacionalización………………………………………………………………………………………………..
Dispositivos externos al servidor Asterisk
191
PSTN
Conectividad DAHDI
Tarjetas Digium
Teléfonos Análogos
Asterisk
CallerID
Idioma y/o acentos de los mensajes del sistema
Hora/Fecha y pronunciación
12. Dialplan Avanzado……………………………………………………………………………………………………
Manipulación de expresiones y variables
203
Expresiones básicas
Operadores
Funciones del dialplan
Sintaxis
Ejemplo de funciones del dialplan
Bifurcaciones condicionales
La aplicación Gotoif()
Bifurcaciones condicionales basada en tiempo GotoifTime()
Macros
Definiendo macros
Llamando macros desde el dialplan
Utilizando argumentos en los macros
GoSub
Definiendo Subrutinas
Llamando subrutinas desde el dialplan
Usando argumentos en la subrutinas
Retornando desde una subrutina
Canales locales
Usando Asterisk Database (AstDB)
Almacenando datos en AstDB
Recuperando datos desde AstDB
Borrando datos desde AstDB
Usando AstDB en el dialplan
Característica útiles de Asterisk
Zapateller
Call Parking
Conferencias con MeetMe()
13. Operadora Automática (Auto Attendant)…………………………………………………………………
La operadora automática, No es un IVR.
Diseñando su operadora automática
El saludo
El menú principal
Selección 1
Selección 2
Selección #
Selección 3
Selección 9
235
Selección 0
Tiempo de espera (Timeout)
Entradas invalidad (invalid)
Marcado por extensiones
Construyendo su operadora automática
Grabando sus mensajes
Creando grabaciones desde el dialplan
El dialplan
Enviando las llamadas entrantes a la operadora automática
Introducción a un IVR
Creando la cola de ventas y soporte
Capı́tulo I
Introducción a la Telefonía
Breve historia de la telefonía
Lo que hoy conocemos como teléfonos se originó con un interesante movimiento ha mediado del siglo
19.
En 1849 un médico de origen Italiano llamado Antonio Meucci, considerado por muchos como el
inventor del teléfono, llevo a cabo una demostración de un dispositivo capaz de transmitir la voz en La
Habana. Un tiempo después, en 1854, en la ciudad de Nueva York, Meucci hace una nueva
demostración de su invento.
Pero la idea de construir un telégrafo parlante no era exclusiva de Meucci, y es así como 1860 el alemán
Johann Philipp Reis construye un dispositivo capaz de transmitir voz basado en la idea original de
Charles Bourseul, quien en 1854 había descrito la construcción de dicho dispositivo pero nunca lo
construyó. Reis continuó mejorando su aparato y un año más tarde ya estaba transmitiendo voz a más
de 100 metros de distancia.
Un par de años más tarde Innocenzo Manzetti construye el esperado “telégrafo parlante”, pero no se
interesa en patentarlo.
Las Patentes
Hasta este momento ya existían prototipos de teléfonos pero nadie lo había patentado.
Meucci fue el primero en tratar de patentar su invento, quien en 1871 suscribió un documento de “aviso
de patente” pero por sus condiciones económicas nunca pudo pagar el dinero para terminar este
trámite y su “aviso de patente” expiró pocos años después.
Para 1875, un año después de expirar el trámite de patente de Meucci, el escocés Alexander Graham
Bell, radicado en los Estados Unidos, logra patentar un aparato similar y es el primero en hacerlo.
Gracias a la patente Bell pudo hacer de la idea del teléfono un negocio rentable y tiene el mérito de
haber desarrollado la idea y convertirla en algo práctico para la sociedad.
Ya para 1886, existían 150,000 abonados telefónicos en los Estados Unidos.
A partir de entonces la telefonía se empezó a convertir en un servicio básico de la sociedad actual.
Evolución de la tecnología telefónica
Al principio, para que un abonado telefónico se comunicara con otro este tenía que solicitarle la llamada
a una operadora, quien manualmente conectaba los cables para conmutar un punto con otro. En 1891
se inventó un teléfono “automático” que permitía marcar directamente.
Bell en un principio fue casi exclusivamente la única compañía en explotar la tecnología debido sus
patentes. Sin embargo, cuando estas expiraron surgieron cientos de pequeñas compañías que
empezaron a dar servicios, la mayoría en sitios rurales donde Bell aún no llegaba. Poco a poco estas
compañías empezaron a crecer y ya a inicios del siglo 20 tenían en su conjunto más abonado que la
propia Bell.
A finales de la segunda guerra mundial el servicio telefónico llegaba a millones de abonados.
En 1947, científicos de Bell inventaron el transistor y cambian el curso de la historia de la humanidad. En
1948 ganan el Premio Nobel por su trabajo.
En los años 60s se lanzan los primeros satélites de comunicaciones y las comunicaciones entre
continentes se facilitan. Todo esto fue posible gracias a la invención del Transistor.
Principios y transmisión de la voz humana
La voz humana está compuesta por ondas acústicas que viajan a través del aire a la velocidad del
sonido, esto es a 1,244 Km/h (o 340 m/s). Más rápido que un avión comercial. Pero esta rapidez no
significa que me pueda comunicar fácilmente con puntos distantes pues la voz humana se atenúa
rápidamente, perdiendo energía a medida que viaja. Luego de unos pocos metros ya no podemos
escuchar una conversación.
La voz humana es de la misma naturaleza que el resto de ondas acústicas y estos ya se conocía desde
antes de la invención del teléfono.
También antes de la invención del teléfono se conocía que existían otros tipos de ondas llamadas
ondas eléctricas que podían ser transmitidas a través de un conductor metálico como un cable de cobre.
Las ondas eléctricas son de naturaleza diferentes a las ondas acústicas y viajan a la velocidad de la luz, es
decir aproximadamente 300,000 km/s. La atenuación de esta onda es fácil de controlar y transmitir a
grandes distancias.
Con estos hechos conocidos ya a mediados del siglo 19 es más fácil comprender que muchos
persiguieran la idea de transformar las ondas acústicas en ondas eléctricas para así poder transmitirlas
luego a grandes distancias a través de conductores metálicos. La cuestión es que había que inventar un
dispositivo para hacer dicha transformación y allí estaba la clave del asunto. Este dispositivo, conocido
como micrófono en nuestros días es una parte importante de cualquier aparato telefónico.
Rango de frecuencia de la voz humana
Otra característica importante de la voz humana es que las cuerdas vocales modulan la voz en un amplio
espectro de frecuencias que van de graves a agudos en un rango aproximado de 20Hz a 20kHz.
Esto nos hace suponer que un micrófono debe ser capaz de capturar y transmitir todo este rango de
frecuencias. Sin embargo, en la actualidad sabemos que para transmitir voz "entendible" no es
necesario transmitir todas las frecuencias sino un rango mucho menor y transmitir un rango menor de
frecuencias tiene sus ventajas pues facilita la transmisión como veremos más adelante. Por lo tanto los
teléfonos comerciales solo transmiten un rango aproximado de 400Hz a 4kHz. Esto distorsiona un
poquito la voz pero de todas maneras se puede entender. Es por eso que cuando oímos a alguien por
teléfono su voz suena ligeramente diferente que en la vida real pero aun así podemos entender la
conversación.
El micrófono
El micrófono fue un elemento clave en la invención del teléfono pues era el dispositivo que realizaba la
conversión de las ondas mecánicas a ondas eléctricas.
Hay muchos tipos de micrófonos que operan sobre diferentes principios. Uno que se usó por mucho
tiempo en teléfonos era el de carbón que consistía en una cápsula llena de granitos de carbón entre dos
placas metálicas. Una de las placas era una membrana que vibraba con las ligeras presiones de las ondas
de voz; de esta manera la resistencia eléctrica de la cápsula variaba con la voz y se generaba una señal
eléctrica correspondiente.
Otro tipo de micrófono muy común en la actualidad es el dinámico o electro-magnético que consiste en
una bobina de hilo de cobre enrollada sobre un núcleo de material ferromagnético. Este núcleo se
encuentra sujetado a un diafragma que vibra con la presión de las ondas de voz. De esta manera se
induce una ligera corriente eléctrica en la bobina que es amplificada luego al interior del teléfono.
En la figura anterior podemos observar algunos componentes del micrófono electromagnético
reaccionando frente al estímulo de las ondas de voz.
1 Ondas de voz
2 Diafragma
3 Bobina
4 Núcleo ferromagnético
5 Corriente inducida
Ancho de banda y capacidad de información
Podemos decir que el ancho de banda es la medida de la cantidad de información que podemos
transmitir por un medio por unidad de tiempo. Debido a que es una medida por unidad de tiempo
muchas veces se hace una analogía con la velocidad.
El ancho de banda puede pensarse como el número de carriles de una avenida, es decir el número de
carriles hará que los autos (la información) transiten y por lo tanto lleguen a destino más rápido o más
lento.
Medidas comunes para expresar el ancho de banda son los bits por segundo. Esta medida también
equivale a bits/s, bps o baudios.
Cuando se trata de telefonía el ancho de banda es un término muy importante, las comunicaciones en
tiempo real necesitan un ancho de banda mínimo asegurado para entregar una comunicación de
calidad.
Digitalización de la Voz
Digitalizar una señal de voz es tomar muestras (a intervalos de tiempos regulares) de la amplitud de la
señal analógica y transformar esta información a binario. Este proceso es denominado muestreo.
Además de la etapa de muestreo en el proceso de digitalización de la voz intervienen otras etapas como
son:
La cuantificación
El proceso de cuantificación convierte las muestras analógicas en muestras que pueden tomar un
conjunto discreto de valores. De esta manera, los valores de las muestras se “cuantifican” en cantidades
discretas.
Al pasar de infinitos valores (señal analógica) a un conjunto discreto de valores, se introduce
naturalmente una distorsión a la señal original. Esta distorsión se conoce normalmente como “Ruido de
Cuantificación”.
Codificación
Para poder procesar los “valores discretos” obtenidos en cada muestra, es necesario “codificarlos”, es
decir, asignarles un valor numérico.
El proceso de cuantificación y codificación adoptado en telefonía implementa un algoritmo no lineal, de
manera de obtener una calidad de voz aceptable, minimizando la cantidad de “niveles de
cuantificación”. Este algoritmo se basa en tener distorsiones pequeñas para las amplitudes pequeñas de
la señal, y distorsiones mayores para las amplitudes mayores de la señal.
Teorema de Nyquist
Harry Nyquist, un ingeniero Suizo que trabajaba para AT&T, resolvió en 1928, el dilema de cuanto es
necesario muestrear una señal como mínimo para poder reconstruirla luego de forma exacta a la
original.
El teorema propuesto decía que como mínimo se necesita el doble de ancho de banda como frecuencia
de muestreo. Esto queda reflejado de mejor manera con la siguiente expresión.
fm ≥ 2 BWs
Hagamos un breve cálculo mental acerca de cuál sería la frecuencia de muestreo para poder
convertir una señal de voz humana a digital y luego poder reconstruirla en destino.
Ya habíamos dicho que para que la voz humana sea entendible es suficiente transmitir un rango de
frecuencias de entre 400Hz a 4,000Hz. Por lo tanto, según el teorema de Nyquist como mínimo
deberíamos muestrear al doble de la frecuencia mayor, es decir a 8,000Hz.
Luego veremos que es precisamente esa frecuencia de muestreo de 8,000Hz la que se usa en la mayoría
de codecs.
Redes orientadas a circuitos
Las redes orientadas a circuitos (circuit switched) son aquellas donde se estable un circuitos exclusivo o
dedicado entre los nodos antes de que los usuarios se puedan comunicar.
Una vez que se establece un circuito entre dos puntos que quieren comunicarse, el resultado
básicamente es el equivalente a conectar físicamente un par de cables de un extremo a otro. Una vez
establecido el circuito, éste ya no puede ser usado por otros.
En cada circuito el retardo es constante, lo cual es una ventaja. Sin embargo, este tipo de redes es
costoso debido al mismo hecho de que se necesita un circuito dedicado para cada abonado.
Este tipo de redes es el tradicionalmente usados por compañías telefónicas alrededor del mundo y es el
mismo que usó Bell en sus inicios; guardando las distancias tecnológicas correspondientes.
Es común que ciertas personas confundan las redes de circuitos con las redes analógicas pero es
necesario aclarar que las redes de circuitos bien pueden transportar datos digitalmente.
Redes orientadas a paquetes
Una red de paquete es aquella que por un mismo medio pueden pasar simultáneamente diferentes
flujos de información. Para hacer esto divide el tráfico de cada flujo de información en fragmentos o
paquetes que envía intercaladamente. Luego, en el destino los paquetes se reensamblan para
reproducir el mensaje original.
Un ejemplo de este tipo de redes son las redes IP como es el caso del Internet, donde por una misma
conexión pueden llegarnos distintos flujos de información. De esta manera podemos estar haciendo
video-conferencia al mismo tiempo que enviamos un correo electrónico o navegamos por el Web.
Inclusive por este tipo de redes pueden circular simultáneamente flujos de información para diferentes
destinos o direcciones IP.
A diferencia de las redes orientadas a circuitos, en este tipo de redes el ancho de banda no es fijo ya que
depende del tráfico de la red en un momento dado. Adicionalmente cada paquete de un mismo flujo de
información no está obligado a seguir el mismo camino por lo que los paquetes que originalmente
fueron generados en secuencia pueden llegar desordenados a su destino. Este tipo de factores son muy
importantes a tener en cuenta cuando se trafica voz sobre una red de paquetes ya que afectan la calidad
de la llamada.
Las redes de paquetes se han vuelto populares, principalmente porque optimizan recursos debido al
hecho de poder utilizar el mismo medio para enviar varios flujos de información.
Red Pública Telefónica (PSTN)
La Red Pública Telefónica o PSTN (por sus siglas en inglés) es esencialmente una red basada en circuitos.
Esta red cubre tanto telefonía fija como móvil y es la red que hace posible que podamos comunicarnos
con cualquier persona en nuestra ciudad o alrededor del mundo.
Originalmente fue una red analógica pero actualmente es una red en su mayoría digital; por tanto
existen dos tipos de circuitos: analógicos y digitales.
Circuitos analógicos
Los circuitos analógicos son comúnmente pares de cobre que llegan a los abonados del servicio
telefónico y por donde se transmite la señal eléctrica de la voz de manera analógica. El mismo circuito
lleva adicionalmente la señalización necesaria para establecer, mantener y terminar una llamada. Estos
circuitos analógicos se deben conectar a un switch telefónico encargado de direccionar la comunicación
entre los abonados.
Los circuitos analógicos están en decadencia pues las compañías telefónicas encontraron muchas
ventajas en las comunicaciones digitales y es por esa razón que pese a que en la actualidad aún vemos
circuitos analógicos esto se trata tan solo de la “última milla”. En cierto punto de la red telefónica esta
comunicación es convertida a digital y transmitida a un switch telefónico digital.
La circuitería analógica comúnmente se asocia con el término de “telefonía tradicional”.
Como en el pasado era más común que los teléfonos pudieran estar ubicados en áreas rurales donde no
llegaba la electricidad se decidió que la red telefónica proveyera cierto voltaje de alimentación. Es por
eso que algunos modelos de teléfonos analógicos no necesitan conectarse a la alimentación eléctrica.
En todo caso la OC (Oficina Central) genera 48 Voltios de corriente directa para alimentar a los teléfonos
de los abonados. Usando léxico estricto deberíamos decir -48 Voltios debido a que este voltaje se mide
con respecto a uno de los conductores. Sin embargo para ser prácticos en este libro usaremos
indistintamente 48V o -48V para referirnos a lo mismo.
Señalización analógica
Para que las llamadas telefónicas funcionen correctamente es necesario contar con indicaciones o
señales eléctricas que nos permitan intercambiar información entre el abonado y la OC. En breve
veremos en qué consisten las señales más comunes.
Existen básicamente 3 métodos de señalización analógica que la industria ha desarrollado a través de los
años. Estos se llaman loop start, ground start y kewlstart. Es importante cuando se configura una
central telefónica que va conectada a una línea analógica que escojamos el método de señalización
adecuado pues en caso contrario podemos encontrarnos con problemas extraños como que la línea se
cuelga inesperadamente o que no podemos colgar la línea correctamente, entre otras cosas.
La diferencia entre loop start y ground start radica en la manera en la que el teléfono requiere tono de
marcado a la OC (proceso también llamado seizure). Ground start requiere tono de marcado aterrizando
(de allí el término ground) uno de los conductores de la línea telefónica mientras que loop start lo hace
realizando un corto circuito entre ambos conductores (es decir creando un lazo o loop).
Kewlstart es una evolución de loop start que le añade un poco más de inteligencia a la detección de
desconexiones (colgado de la llamada) pero básicamente sigue siendo un loop start.
Debido a que ground start no es muy común en nuestros días, casi siempre nos veremos usando loop
start.
A continuación explicaremos más al detalle la señalización analógica para los eventos más comunes.
Para hacerlo nos basaremos en el progreso de una llamada típica usando señalización loop start. El
progreso de una llamada lo podemos dividir en seis instancias: colgado (on-hook), descolgado,
marcación, conmutación, ringado y conversación.
Colgado
Mientras el teléfono está colgado la OC provee un voltaje DC de 48 Voltios. El teléfono mantiene un
circuito abierto con la línea telefónica; es decir que actúa como si no estuviera conectado y por lo tanto
no fluye corriente por la línea.
Este estado también es conocido como on-hook por su significado en inglés.
Descolgado
Cuando el usuario descuelga el auricular el teléfono envía una señal a la OC. Esta señal consiste en cerrar
el circuito, es decir que internamente el teléfono conecta entre sí los dos cables de la línea telefónica a
través de una resistencia eléctrica.
Apenas la OC se da cuenta de esto envía tono de marcado al teléfono. Este tono de marcado le indica al
abonado que ya puede marcar el número.
En gran parte de América el tono de marcado consiste en dos ondas senoidales enviadas
simultáneamente. Estas ondas son de 350 Hz y 440 Hz. En Europa el tono de marcado consiste en una
sola onda de 425 Hz. Sin embargo hay países en los que estos valores podrían ser diferentes.
Marcación
La marcación puede ser por pulsos o por tonos. Los pulsos ya casi no se usan y fueron populares en los
tiempos de los teléfonos de disco. Los tonos son pares de frecuencias asociadas con los dígitos
telefónicos. Estas frecuencias se transmiten hasta la OC quien traduce estos tonos a números.
Conmutación
Una vez recibidos los dígitos la OC tratará de asociar este número marcado con el circuito de un
abonado. En caso de que el destinatario no fuera un abonado local, enviará la llamada a otro switch
telefónico para su terminación.
Timbrado o Ringado
Una vez que la OC encuentre al abonado destino tratará de timbrarlo (ringing). La señal de ring es una
onda sinusoidal de 20 Hz y de 90 Voltios de amplitud.
Adicionalmente a la señal de ring que la OC envía al destinatario también envía una notificación a quien
originó la llamada. Este tono audible recibe el nombre de ring-back y consiste en dos ondas sinusoidales
superpuestas de 440 Hz y 480 Hz. Estas ondas van intercaladas con espacios de silencio.
En caso de que el destinatario se encuentre ya en una llamada activa entonces en lugar del ring-back se
devuelve un tono de ocupado a quien originó la llamada. Este tono de ocupado consiste en dos ondas
sinusoides superpuestas de 480 Hz y 620 Hz intercaladas con espacios de silencios de medio segundo.
Conversación
Si el destinatario decide contestar la llamada el teléfono cerrará el circuito telefónico (de la misma
manera que ocurrió con el teléfono que originó la llamada en la etapa de descolgado). Esta señal le
informará a la OC que el destinatario decidió contestar y completará la conexión. La llamada telefónica
está finalmente en curso.
DTMFs
Frecuentemente es necesario enviar dígitos a través de la línea telefónica tanto para marcar como en
medio de una conversación. Con esta finalidad se pensaron los DTMFs. DTMFs es un acrónimo de Dual-
Tone Multi Frequency. Es decir que cada DTMF es en realidad dos tonos mezclados enviados
simultáneamente por la línea telefónica. Esto se hace así para disminuir los errores.
1209 Hz
1
4
1
*
697 Hz
770 Hz
852 Hz
941 Hz
1336 Hz
2
5
8
0
1477 Hz
3
6
9
#
1633 Hz
A
B
C
D
Ilustración de los pares de frecuencias para cada digito.
Como se puede ver en la tabla también hay correspondencias para los signos * y # así como también
para los caracteres A, B, C y D.
El teléfono análogo
Este es un componente importante de la red telefónica recordemos que su invención fue lo que marcó
el desarrollo del negocio de la telefonía.
También es importante hablar del teléfono analógico porque todavía es el tipo de teléfono más común
en el planeta y porque la comprensión de su funcionamiento nos permitirá entender en el futuro
algunos conceptos clave como por ejemplo el eco.
En realidad el teléfono, en su forma más básica, es un dispositivo sencillo compuesto de pocos
componentes.
•
Auricular
•
Micrófono
•
Switch para colgado/descolgado
•
Convertidor de dos a cuatro hilos (también llamado híbrido)
•
Marcador (dialer)
•
Campana o dispositivo de timbrado
La mayoría de los componentes se explican por si solos. Sin embargo algunos se preguntarán ¿de qué se
trata el convertidor de 2 a 4 hilos?
Convertidor de 2 a 4 hilos.
Un componente importante de un teléfono es el convertidor de dos a cuatro hilos, conocido también
como dispositivos 2H/4H, bobina hibrida o simplemente hibrido. Este dispositivo es necesario para
separar la señal de audio de ida de la de venida ya que son dos participantes en una conversación y solo
existe un par de cables para esto. Si existieran tres o cuatro cables (2 de ida y 2 de venida) el convertidor
de 2 a 4 hilos no fuera necesario.
Circuitos digitales
La PSTN también sirve a sus abonados con circuitos digitales. Estos circuitos ofrecen la ventaja de poder
multiplexar más de una línea en el mismo medio por lo que resulta atractivo para abonados con
necesidades de un gran número de líneas telefónicas, por lo general empresas.
DS-0
DS-0 es un canal digital de 64Kbit/s. Un DS-0 es por tanto una medida de canal estándar o unidad que
nos sirve para definir múltiplos mayores como los circuitos que veremos a continuación.
Circuitos T-carrier y E-carrier
Los circuitos T-carrie (o portadora-T) fueron diseñados como nomenclatura para circuitos digitales
multiplexados y fueron desarrollados por Laboratorios Bell hace más de cincuenta años. Los circuitos Ecarrier son la equivalente europea.
El más conocido de los circuitos T-carrier es el popular T1 (y su contraparte E1). Un T1 es un circuito
digital compuesto de 24 DS-0’s mientras que un E1 está compuesto por 32 DS-0’s. En un circuito T1 se
envían 1.544 Mbit/s mientras que un E1 2048 Mbit/s.
Además de los circuitos T1 también tenemos circuitos como T2, T3, T4 y T5.
SONET y Circuitos Ópticos
SONET (Synchronous Optical Networking) fue desarrollado con el objetivo de contar con una
nomenclatura similar a las T-carrier pero usando la tecnología de fibra óptica. SONET utiliza múltiplos de
T3 para sus anchos de banda y su circuito base es el llamado OC-1.
Luego del OC-1 tenemos los OC-3, OC-12, OC-24, OC-48, entre otros.
Protocolos de Señalización Digital
Los protocolos de señalización se utilizan para transmitir información de estado del canal de
comunicaciones (como “desconectado”, “timbrando”, “respondió”), información de control y otra
información como DTMFs, callerID, entre otros.
Los protocolos de señalización se pueden agrupar en dos tipos llamados CAS (Channel Associate
Signaling) y CCS (Common Channel Signaling). La diferencia es que mientras CAS transmite la
señalización en el mismo canal en que viaja la información, CCS la transmite en un canal separado. Por
este hecho es que con CAS se reduce ligeramente el ancho de banda disponible o útil para la
comunicación ya que una parte de él se está usando para señalización. Esa es una de las razones por las
cuales las compañías telefónicas han adoptados en su mayoría CCS.
No confunda el lector CAS y CCS con protocolos de señalización. Tan solo son tipos de protocolos que
se explican aquí para hacer más fácil la categorización o agrupación de los mismos.
Señalización Asociada al Canal (CAS)
El protocolo CAS más conocidos es robbed-bit y es usado en circuitos T1 y E1 alrededor del mundo.
Robbed-bit toma (o “roba”, de allí su nombre) el octavo bit de cada canal de comunicación cada seis
frames y lo remplaza por información de señalización. El bit original robado simplemente se pierde.
Hay que aclarar de lo anterior que esto es posible debido a que la voz no es muy sensible que digamos a
la pérdida de ese bit de información ya que es el bit menos significativo. Pero cuando transportamos
data la pérdida de un bit no puede pasar desapercibida y la calidad de la transmisión se degrada de
manera sensible.
Otro protocolo CAS que aún subsiste en nuestros días es R2. Se trata de un protocolo que fue popular
en los años 60s. En realidad R2 es una familia de protocolos en donde cada implementación se
denomina “variante”. Existen variantes dependiendo del país o inclusive de la compañía telefónica que
lo ofrece.
Señalización de Canal Común (CCS)
ISDN
ISDN (Integrated Services Digital Network) nos permite transmitir voz y datos simultáneamente sobre
pares telefónicos de cobre con calidad superior a las líneas telefónicas analógicas.
El objetivo de ISDN fue el de facilitar las conexiones digitales para poder ofrecer una amplia gama de
servicios integrados a los usuarios. ISDN establece dos tipos de interfaces para cumplir su fin.
•
BRI: Basic Rate Interface
•
PRI: Primary Rate Interface.
BRI estuvo orientada a hogares. Un BRI supone 2 canales útiles (llamados canales B) de 64Kbit/s cada
uno más un canal de señalización de 16Kbit/s (llamado canal D) que en total suman 144Kbit/s.
PRI es la opción para usuarios de mayor envergadura como negocios o empresas pues puede aglutinar
más canales B. Actualmente es muy popular y se transmite sobre circuitos T-carrier y E-carrier.
Capı́tulo 2
Introducción a la Telefonía VoIP
La voz sobre IP o VoIP consiste en transmitir voz sobre protocolo IP.
La industria de las telecomunicaciones se ha extendido por más de 100 años, y Asterisk integra la
mayoría --si no todas-- de las principales tecnologías que se haya hecho uso en el último siglo.
Para sacar el máximo provecho de Asterisk, no es necesario ser un profesional en todos los ámbitos,
pero comprender las diferencias entre los distintos CODECS y protocolos le dará una mayor apreciación
y comprensión del sistema en su conjunto.
Este capítulo explica los conceptos de Voz sobre IP y lo que hace que las redes de VoIP sean diferentes a
las redes de voz con conmutación de circuitos tradicionales.
En este tema vamos a ver porque son necesarios los protocolos VoIP, haremos un breve resumen de la
historia y el futuro potencial de cada uno. También veremos las consideraciones de seguridad y las
habilidades de estos protocolos para trabajar dentro de topologías NAT (traducción de direcciones de
red). Se tratarán los siguientes protocolos de VoIP (algunos más breve que otros):
•
IAX
•
SIP
•
H.323
•
MGCP
•
Skinny/SCCP
•
UNISTIM
Los CODEC son los medios por los cuales la voz análoga puede ser convertida a una señal digital y llevada
a través del Internet. El ancho de banda en cualquier localización es limitado, y el número de
conversaciones simultáneas que cualquier conexión puede llevar está directamente relacionado al tipo
de códec que se implemente. En este módulos también hablaremos de las diferencias entre los
siguientes codecs independientemente de los requerimiento de ancho de banda (nivel de comprensión)
y calidad.
•
G711
•
G726
•
G729A
•
GSM
•
ILBC
•
Speex
•
MP3
Para finalizar el modulo, discutiremos como el tráfico de voz puede ser enrutado fiablemente, que
causas el ECO y como tratar con este, y como Asterisk controlas la autenticación de las llamadas
entrantes y salientes.
¿Por qué son necesarios los Protocolos VoIP?
La necesidad básica de los protocolos VoIP es la paquetización del audio para ser transportado sobre las
redes basadas en los protocolos de Internet.
Los retos para lograr esto se refieren a la manera en que los humanos se comunican. No sólo es
necesario que la señal llegue esencialmente de la misma forma que se transmite, pero tiene que hacerlo
en menos de 150 milisegundos. Si los paquetes se pierden o se retrasan, habrá degradación de la calidad
de las comunicaciones, lo que significa que dos personas tienen dificultades para mantener una
conversación telefónica.
Los protocolos de transporte que en su conjunto son llamados “Internet” no fueron originalmente
diseñados con transmisión de streaming de audio en tiempo real en mente. Se espera que los nodos
receptores resuelvan el problema de las pérdidas de paquetes por esperar un largo tiempo para que el
paquete arribe, solicitando la retransmisión, o en algunos casos, considerando la información perdida
como buena y simplemente seguir adelante. Nuestras conversaciones no se adaptan bien a la pérdida de
letras o palabras, ni de ningún retraso apreciable entre transmisión y recepción.
La PSTN tradicional fue diseñada especialmente para el propósito de transmisión de voz, y es
perfectamente adecuada para esta tarea desde el punto de vista técnico. Desde un punto de vista más
flexible, sin embargo, sus defectos son evidentes incluso para las personas con un conocimiento muy
limitado de la tecnología. VoIP mantiene la promesa de incorporar las comunicaciones de voz en todos
los otros protocolos que llevamos en nuestras redes, pero debido a las exigencias especiales de una
conversación de voz, se necesitan habilidades especiales para diseñar, construir y mantener estas redes.
El problema con la transmisión de voz basada en paquetes se deriva del hecho de que la forma en la que
hablamos es totalmente incompatible con la forma en que IP transporta datos. Hablar y escuchar
consiste en la retransmisión de una secuencia de audio, mientras que los protocolos de Internet están
diseñados para dividir todo, encapsular los bits de información en miles de paquetes, y luego entregar
cada paquete de cualquier manera posible para el extremo receptor. Es evidente que se requiere alguna
forma de lidiar con esto.
Protocolos VoIP
Es por lo expuesto anteriormente que surgen los protocolos para VoIP, cuyo mecanismo para conexión
implica una serie de transacciones de señalización entre los puntos finales (y entre gateway), que cargan
dos flujos de audio para cada dirección de la conversación. Hay varios protocolos en existencias para
manejar esto. En esta sección, vamos a hablar de los protocolos que en general son importantes para
VoIP y especialmente para Asterisk.
El Protocolos IAX (Inter-Asterisk Exchange)
IAX es un protocolo abierto, lo que significa que cualquiera puede descargarlo, modificarlo o mejorarlo a
su gusto.
En Asterisk, IAX es implementado a través módulo de chan_iax2.so. Este protocolo fue desarrollado
por Digium con el propósito de comunicarse con otros servidores Asterisk, y entre servidores y clientes
que también utilizan el protocolo IAX. Es muy importante señalar que IAX no está en lo absoluto
limitado a Asterisk. Es un estándar abierto para que cualquiera lo use, y es apoyado por muchos otros
proyectos de telecomunicaciones de código abierto, así como por varios proveedores de hardware. IAX
es un protocolo de transporte (como SIP) que usa un solo puerto UDP (4569) para ambos canales de
señalización y datos. Permite manejar una gran cantidad de códecs y un gran número streams, lo que
significa que puede ser utilizado para transportar cualquier tipo de dato.
El protocolo IAX2 fue deliberadamente diseñado para trabajar detrás de dispositivos NAT. El uso de un
único puerto UDP tanto para la señalización y la transmisión de datos, el tráfico de voz es transmitido inband, hacen de IAX un protocolo casi transparente a los cortafuegos y realmente eficaz para trabajar
dentro de redes internas. Está diseñado para darle prioridad a los paquetes de voz sobre redes IP. En
esto se diferencia de SIP, que utiliza cadena RTP out-of-band (fuera-de-banda) para entregar la
información.
IAX2 soporta Trunking, donde un simple enlace permite enviar datos y señalización por múltiples
canales. Cuando se realiza Trunking, los datos de múltiples llamadas son manejados en un único
conjunto de paquetes, lo que significa que un datagrama IP puede entregar información para más
llamadas sin crear latencia adicional. Esto es una gran ventaja para los usuarios de VoIP, donde las
cabeceras IP son un gran porcentaje del ancho de banda utilizado.
SIP
El protocolo de Inicialización de Sección (SIP) es un protocolo desarrollado por el grupo de trabajo
MMUSIC del IETF con la intención de ser el estándar para la iniciación, modificación y finalización de
sesiones interactivas de usuario donde intervienen elementos multimedia como el video, voz,
mensajería instantánea, juegos en línea y realidad virtual.
El protocolo SIP trata cada extremo de una conexión como un par (un peer) y se encarga de negociar las
capacidades entre ambos extremo. Lo que hace a SIP atractivo es que es un protocolo relativamente
simple, con una sintaxis similar a la de otros protocolos conocidos, como HTTP y SMTP. SIP es soportado
en Asterisk a través del módulo chan_sip.so.
Historia
El 22 de febrero de 1996, Mark Handley y Eve Schooler presentaron al IETF un borrador del Protocolo de
Invitación de Sección conocido ahora como SIPv1. El mismo estaba basado en trabajos anteriores de
Thierry Turletti (INRIA Video conferencing System o IVS) y de Eve Schooler (Multimedia Conference
Control o MMCC). Su principal fortaleza, heredada por la versión actual de SIP, era el concepto de
registro, por el cual un usuario informaba a la red dónde (en qué host de Internet) podía recibir
invitaciones a conferencias. Esta característica permitía la movilidad del usuario.
Ese mismo día el Dr. Henning Schulzrinne presentó un borrador del Simple Conference Invitation
Protocol (SCIP), que estaba basado en el HTTP (Hypertext Transport Protocol). Usaba TCP (Transmission
Control Protocol) como protocolo de transporte. Como identificadores de los usuarios utilizaba
direcciones de correo electrónico para permitir el uso de una misma dirección para recibir correos
electrónicos e invitaciones a conferencias multimedia. No utilizaba al SDP para la descripción de los
contenidos sino que creaba un mecanismo propio.
El IETF decidió combinar ambos en un único protocolo denominado Session Initiation Protocol, (es decir
cambiando el significado de la inicial I en el acrónimo "SIP") y su número de versión fue la 2, dando
origen al SIPv2. En diciembre de 1996 los tres autores (Schulzrinne, Handley y Schooler), presentaron el
borrador del SIPv2. El mismo luego de ser discutido en el grupo de trabajo MMUSIC (Multiparty
Multimedia Session Control) del IETF alcanzó el grado de "estándar propuesto" en la RFC 2543 publicada
en febrero de 1999.
En septiembre de 1999 se creó el grupo de trabajo SIP en el IETF que continuó con el desarrollo del
protocolo y en junio de 2002 se publicó la RFC 3261 que reemplazó a la anterior introduciendo
modificaciones propuestas durante el trabajo del grupo SIP. Los autores de esta última RFC, hoy vigente
son: Jonnathan Rosenberg, Henning Schulzrinne, Gonzalo Camarillo, Allan Johnston, Jon Peterson,
Robert Sparks, Mark Handley y Eve Schooler.
SIP es un protocolo de señalización de capa de aplicación que usa el puerto bien conocido 5060 para
comunicación. SIP puede ser transportado con los protocolos de capa de transporte ya sea UDP o TCP.
SIP no transporta datos entre dispositivos finales. Al contrario es un protocolo de transporte en tiempo
real (RTP) y es usado para este propósito. RTP utiliza una numeración de puertos altos, o puertos no
privilegiados en Asterisk (10.000 – 20.000, por defecto).
SIP no fue el primer protocolo, y no es el único usado hoy día (existen otros como: H.323, MGCP, IAX,
entre otros). La ventaja del protocolo SIP es que es ampliamente aceptado y su flexibilidad
arquitectónica.
SIP y NAT
Probablemente el mayor obstáculo técnico de SIP es que tiene que conquistar el reto de llevar a cabo
transacciones eficientemente a través de NAT. Porque SIP encapsulas la información de
direccionamiento en frames de datos (o tramas), y NAT se lleva a cabo en la capa de red, la información
de direccionamiento no es modificada automáticamente, y por lo tanto los flujos de datos de
comunicación no tendrán la información de direccionamiento correcta necesaria para completar la
conexión cuando existe un dispositivo NAT de por medio. Adicional a esto, los firewalls normalmente
integrado con NAT no consideran los media stream entrantes como parte de una transacción SIP, y
bloquean la conexión. Los nuevos firewalls y los controladores de sección fronteriza (SBCs) son
conscientes de SIP pero todavía esto es considerado como una limitante en este protocolo.
Seguridad en SIP
SIP usa un sistema de demanda/repuesta para autenticar los usuarios. Un INVITE inicial es enviado al
proxy con el cual el dispositivo desea comunicarse. El proxy entonces responde con un mensaje de
solicitud de autorización (407), el cual contiene un conjunto aleatorios de caracteres que es referido
como un nonce. Este nonce se utiliza junto con la contraseña para generar un hash MD5, que es enviada
de vuelta en el INVITE posterior. Asumiendo que el hash MD5 coincida con el que el proxy ha generado,
el cliente es entonces autenticado.
Los Ataque de denegación de servicios (DoS) son probablemente los tipos de ataques más comunes en
las comunicaciones VoIP. Un ataque DoS puede ocurrir cuando un gran volumen de solicitud de INVITE
invalido son enviados para un servidor proxy en un intento de saturar el sistema. Esto ataques son
relativamente simple para implementar, y sus efectos sobres los usuarios del sistema son inmediatos.
SIP cuentas con varios métodos de minimizar los efectos de los ataques DoS, pero últimamente son
imposibles de prevenir. SIP implementa un sistema para garantizar la seguridad, un mecanismo de
transporte encriptado (llamado Transport Layer Security o TLS) es usado para establecer la
comunicación entre la persona que llama y el dominio del destinatario. Más allá de eso, la solicitud es
enviada de forma segura para el dispositivo final, basado sobre la política de seguridad local de la red.
H.323
Este protocolo fue originalmente diseñado para proveer un mecanismo de transporte IP para video
conferencias. H.323 es el estándar de los equipos de video conferencias basado en IP, y disfrutó de una
breve fama como un protocolo de VoIP también. Mientras muchos debates sobre si SIP o H.323 (o IAX)
será el protocolo VoIP que dominara el mundo, en Asterisk, H.323 ha quedado en desuso en gran
medida a favor de IAX y SIP. H.323 no ha tenido muchos éxitos entre los consumidores y las empresas, a
pesar de que todavía podría ser el protocolo de VoIP más usado entre las empresas telefónicas.
Asterisk soporta tres versiones de H.323 y son manejadas por los módulos chan_h323.so (suministrado
con Asterisk), chan_oh323.so (disponible como un complemento gratuito), y chan_ooh323.so
(suministrado con Asterisk-addons)
Historia
H.323 fue desarrollado por la Unión de Telecomunicaciones Internacional (ITU) en mayo de 1996 como
un medio para transmitir comunicación de voz, video, data y fax a través de las redes IP mientras
mantenían la conectividad con el PSTN. Desde entonces, H.323 ha pasado por varias versiones y anexos
(las cuales han agregado funcionalidad para el protocolo), permitiéndole operar en redes VoIP pura y
más ampliamente en redes distribuida.
Consideraciones de Seguridad.
H.323 es un protocolo relativamente seguro y no requiere muchas consideraciones de seguridad más
allá de la que son comunes para cualquier comunicación de redes con el Internet. Puesto que H.323 usa
el protocolo RTP para medio de comunicación, este no soporta de forma nativa las rutas de
comunicación encriptadas. El uso de VPN u otros túneles encriptados entre puntos finales es la manera
más común de encapsular la comunicación de forma segura.
H.323 y NAT
El estándar H.323 usa el protocolo RTP para transportar los datos entre los puntos finales. Debido a
esto, H.323 tiene los mismos problemas que tiene SIP cuando se trata de topologías de red que implica
un NAT. El método más fácil es simplemente redirigir los puertos apropiados a través de los dispositivos
NAT para el cliente interno.
Para recibir llamadas, usted siempre necesita redirigir el puerto TCP 1720 para el cliente. Adicional a
esto, usted necesita redirigir el puerto UDP para el medio RTP y el RTCP control streams. Los clientes
más viejos, como Microsoft NetMeeting, también requieren redireccionar el puerto TCP para el
tunneling H.245.
Si usted tiene un número de clientes detrás de un dispositivo NAT, necesitará utilizar un gatekeeper
(controlador de acceso) corriendo en modo proxy. El controlador de acceso requerirá una interfaz
conectada a la subred IP privada y la Internet pública. Su cliente H.323 sobre la subred IP privada tendrá
que registrarse con el controlador de acceso, el cual llamará al proxy en nombre del cliente. Tenga en
cuenta que cualquier cliente que desee llamar se le pedirá que se registre con el servidor proxy.
MGCP
El Media Gateway Control Protocol (MGCP) también nos llega del IETF. Mientras que la implementación
de MGCP está mucho más extendida de lo que se podría pensar, está perdiendo terreno rápidamente
antes protocolos como SIP y IAX. Pero Asterisk aún tiene soporte para él, aunque rudimentario.
Este fue diseñado para hacer los dispositivos finales (tales como teléfonos) tan simple como sea posible,
y tener todas la lógica y procesamiento de llamadas manejada por el media gateways y los agentes de
llamadas. Al contrario de SIP, MGCP usa un modelo centralizado. Los teléfonos MGCP no pueden llamar
directamente a otros teléfonos MGCP; siempre deben de ir a través de algún tipo de controlador.
Asterisk soporta MGCP a través del módulo chan_mgcp.so, y los dispositivos finales son definidos en el
archivo de configuración mgcp.conf.
Protocolos Propietarios
Por último, vamos a echar un vistazo a dos protocolos propietarios que son compatibles con Asterisk.
Skinny/SCCP
El Protocolo de Control de Cliente Skinny es propietario para los equipos VoIP Cisco. Este es el protocolo
por defecto para los dispositivos finales sobre una PBX Cisco Call Manager. Skinny es soportado por
Asterisk, pero sí usted están conectando teléfono Cisco para Asterisk, es generalmente recomendado
que usted obtenga una imagen SIP para cualquier teléfono y conecte este vía SIP.
UNISTIM
El soporte de Asterisk para el protocolo VoIP propietario de Nortel, UNISTIM, lo convierte en la primera
PBX en la historia para soportar de forma nativa terminales IP propietaria de dos grandes jugadores en
VoIP. Nortel y Cisco. El soporte de UNISTIM es totalmente experimental y todavía no trabaja bien pero
está en producción, pero el caso es que alguien se ha tomado la libertad para implementar este y
demostrar el poder de la plataforma Asterisk.
Codificación de la Voz
Debemos tener claro que para transportar la voz se utilizan algunos protocolos como SIP, IAX y otros
como RTP o RTCP. Pero la voz es una onda analógica que necesita transformarse a digital en algún
formato antes de ser transmitida sobre el medio. Como nos encontramos en una red de paquetes
debemos paquetizar esta información. Esa búsqueda de un formato óptimo generó algunas alternativas
de formatos de transmisión llamados CODECS.
CODECs
La palabra codec proviene de abreviar las palabras Codificación y Decodificación. Su función principal es
la de adaptar la información digital de la voz para obtener algún beneficio. Este beneficio en muchos
casos es la compresión de la voz de tal manera que podamos utilizar menos ancho de banda del
necesario.
Generalmente se entiende por Codecs que son varios modelos matemáticos usados para codificar (y
comprimir) la información de audio análoga. Muchos de estos modelos toman en cuenta la capacidad
del cerebro humano para formar una impresión a partir de información incompleta.
Todos hemos visto las ilusiones ópticas, del mismo modo, los algoritmos de compresión de voz se
aprovechan de nuestra tendencia a interpretar lo que creemos que debemos escuchar, en lugar de lo
que realmente escuchamos. El propósito de los diferentes algoritmos de codificación es estrictamente
mantener el balance entre la eficiencia y la calidad.
Antes de profundizar más en cada uno de los Codecs individuales, vamos a echar un vistazo en la
siguiente tabla.
CODEC
DATA BITRATE (KBPS)
¿REQUIERE LICENCIA?
G.711
64 Kbps
No
G.726
16, 24, 32 o 40 Kbps
No
G.729A
8 Kbps
Si
GSM
13 Kbps
No
ILBC
13.3 Kbps(30-ms frames) o 15.2 Kbps (20-ms frames)
No
Speex
Variables (entre 2.15 y 22.4 Kbps)
No
G.722
64 Kbps
No
G.711
G.711 es el códec fundamental de la PSTN. De hecho, si alguien se refiere a PCM con respecto a una red
telefónica, se le permite pensar en G.711. Dos métodos de comprensión son usados: ulaw en Norte
América y alaw en el resto del mundo. Cualquieras de los 2 métodos proporciona una palabra de 8 bit
transmitida 8,000 veces por segundo. Si saca cuentas, usted veras que se requieren 64,000 bits para ser
transmitidos por segundo.
Mucha gente le dirá que G.711 es un códec sin compresión. Esto no es exactamente cierto, como el
companding (compresión-expansión) es considerado una forma de compresión. Lo que es cierto es que
G.711 es el códec base desde el cual todos los demás se derivan.
G.711 impone una carga mínima (casi cero) en la CPU.
G.726
Este codec ha existido desde hace un tiempo (solía ser G.721, que ahora es obsoleto), y es uno de los
códecs comprimidos originales. Es también conocido como Adaptive Differential Pulse-Code Modulation
(ADPCM), y este puede correr en varias velocidades de bits (bitrates). Las velocidades más comunes son
16 Kbps, 24 Kbps y 32 Kbps. Hasta el momento de escribir estas líneas, Asterisk únicamente soportaba
el rate de ADPCM-32 que es el tipo más difundido y popular de este códec.
G.726 ofreces una calidad casi idéntica a G.711, pero este usa la mita de ancho de banda. Esto es posible
porque en lugar de enviar el resultado de la medición de cuantificación, se envía sólo información
suficiente para describir la diferencia entre la muestra actual y la anterior. G.726 cayó en desgracia en la
década de 1990 debido a su incapacidad para llevar las señales de fax y módem, pero debido a su
relación calidad-ancho de banda/CPU ahora está haciendo una reaparición. G.726 es especialmente
atractivo, ya que no requiere una gran cantidad de trabajo computacional del sistema.
G.729A
Teniendo en cuenta el poco ancho de banda que utiliza, G.729A ofrece una impresionante calidad de
sonido. Esto lo hace mediante el uso de Estructura Conjugada Predicción Lineal Algebraica con
Excitación por Código (CS-ACELP.). A causa de las patentes, no se puede utilizar G.729A sin tener que
pagar una cuota de licencia, sin embargo, es muy popular y está bien apoyado en muchos teléfonos y
sistemas diferentes.
Para lograr su impresionante relación de compresión, este codec requiere una igualmente
impresionante cantidad de esfuerzo por parte del CPU. En un sistema Asterisk, el uso de codecs muy
comprimidos agotará rápidamente los recursos del CPU.
G.729A utiliza 8 Kbps de ancho de banda.
GSM
El códec Sistema Global para Comunicaciones Móviles (GSM) es el favorito de Asterisk. Este codec no
viene gravado con un requisito de licencia de la manera que lo hace G.729A, y ofrece un excelente
rendimiento con respecto a la demanda de CPU.
La calidad de sonido se considera generalmente que es de un grado menor que la producida por G.729A,
pero gran parte de esto se reduce a opinión personal. GSM opera a 13 Kbps.
ILBC
El Internet Códec Low Bitrate (iLBC) ofrece una atractiva mezcla de bajo ancho de banda y calidad, y es
especialmente adecuado para mantener una calidad razonable en los enlaces de red con pérdidas.
Naturalmente, Asterisk soporta iLBC, pero no es tan popular como el codecs ITU, y este puede ser
compatible con los teléfonos IP comunes y sistemas de VoIP comerciales. IETF RFC 3951 y 3952 se han
publicado en apoyo de iLBC y iLBC está en la pista de las normas IETF.
Debido a que iLBC utiliza algoritmos complejos para lograr sus altos niveles de compresión, tiene un
costo bastante elevado en consumo de CPU en Asterisk.
Mientras que usted está autorizado para utilizarla iLBC sin pagar licencia, el titular de la patente iLBC,
Global IP Sound (GIPS), quiere saber cada vez que lo utilice en una aplicación comercial. La forma de
hacerlo es mediante la descarga y la impresión de una copia de la iLBC licencia, firmarlo y devolverlo a
GIPS.
iLBC opera a 13.3 Kbps (frames de 30 ms) y 15,2 Kbps (frames de 20 ms).
Speex
Speex es un códec de tasa de bits variable (VBR), lo que significa que es capaz de modificar
dinámicamente su tasa de bits para responder a las condiciones cambiantes de la red. Se ofrece en
versiones tanto de banda estrecha y de banda ancha, en función de si quieres calidad telefónica o mejor.
Speex es un codec totalmente gratis, licenciado bajo la variante Xiph.org de la licencia BSD.
Un proyecto de Internet para Speex está disponible, y más información sobre Speex se puede encontrar
en su página web (http://www.speex.org).
Speex puede funcionar a cualquier tasa de bits desde 2,15 hasta 22,4 Kbps, debido a su velocidad de
bits variable.
G.722
G.722 es un códec estándar ITU-T que fue aprobado en 1998. El códec G.722 produce una voz de mucho
más calidad en el mismo espacio que G.711 (64 Kbps) y está empezando a ser popular entre los
fabricantes de dispositivos de VoIP. Las patentes de G.722 han caducado, por lo que es de libre acceso.
Si tiene acceso a dispositivos que admiten G.722, usted quedará impresionado por la mejora de la
calidad.
MP3
Seguro está pensando, MP3 es un codec. En concreto, es el Moving Picture Experts Group Audio Layer 3
estándar de codificación. Con un nombre así, no es de extrañar que lo llamemos MP3! En Asterisk, el
codec MP3 se utiliza normalmente para la música en espera (MoH). MP3 no es un códec de telefonía, ya
que está optimizado para la música, no la voz, sin embargo, es muy popular entre los sistemas de
telefonía VoIP como un método de entrega de MoH.
Calidad de Servicios
QoS es un conjunto de tecnologías para administrar el tráfico de red de forma rentable a fin de
optimizar la experiencia del usuario tanto en entornos empresariales como en hogares y oficinas
pequeñas. Las tecnologías de QoS permiten medir el ancho de banda, detectar cambios en las
condiciones de la red (por ejemplo, congestión o disponibilidad del ancho de banda) y clasificar el tráfico
por orden de prioridad o limitarlo. Por ejemplo, se puede usar QoS para clasificar el tráfico por orden de
prioridad en aplicaciones dependientes de la latencia (como las aplicaciones de voz o vídeo) y para
controlar el impacto del tráfico dependiente de la latencia (como las transferencias masivas de datos).
Aunque no hay una regla fija, en general se acepta que si usted puede entregar el sonido producido por
el altavoz para el oído del oyente a menos de 150 milisegundos, es posible un flujo normal de
conversación. Si el retardo excede de 300 milisegundos, se hace difícil evitar la interrupción de uno al
otro. Más allá de 500 milisegundos, una conversación normal se vuelve cada vez más difícil y frustrante.
Además de conseguir que la información llegue a tiempo, también es esencial garantizar que la
información transmitida llegue intacta. Demasiados paquetes perdidos impedirán que en el otro
extremo se reproduzca completamente el audio muestreado, en casos graves, palabras o frases enteras
perdidas. Incluso la pérdida del 5 por ciento de paquetes puede obstaculizar gravemente una red VoIP.
Protocolo IP
El protocolo IP (Internet Protocol) es un protocolo que trabaja a nivel de red donde la información se
envía en paquetes llamados paquetes IP. Este protocolo ofrece un servicio “sin garantías” también
llamado del “mejor esfuerzo”. Es decir que nada garantiza que los paquetes lleguen a su destino, sin
embargo se hará lo posible por hacerlos llegar.
Protocolos de Transporte
TCP, UDP y SCTP
Si usted va a enviar datos en una red basada en IP, serán transportados mediante una de los tres
protocolos de transporte discutido aquí.
TCP (Transmission Control Protocol)
El protocolo de Control de Transmisión (TCP) es casi nunca usado para VoIP, como el protocolo IP no
garantiza que los datos lleguen a su destino. Solo hace su mejor esfuerzo para que lleguen. Era necesario
un protocolo que se encargue de controlar la transmisión de datos y por esta razón se crea el Protocolo
de Control de Transmisión o TCP. TCP es un protocolo de transporte que se transmite sobre IP.
TCP ayuda controlando que los datos transmitidos se encuentre libre de errores y sean recibidos por las
aplicaciones en el mismo orden en que fueron enviados. Si se pierden datos en el camino introduce
mecanismo para que estos datos sean reenviados.
Esto implica carga extra de información en el flujo de datos ya que hay que enviar información de
control adicional. Es por esto que TCP es un buen protocolo para control de sesiones pero no es bueno
para transmisión de datos en tiempo real. Por este motivo la voz no se envía usando este protocolo.
UDP (User Datagram Protocol)
UDP es otro protocolo de transporte. La principal diferencia con TCP es que a UDP no le importa si los
datos llegan con errores o no y tampoco le importa si llegan en secuencia. UDP divide la información en
paquetes, también llamados datagramas, los paquetes se colocan en el medio los más rápidamente
posible y se liberan para encontrar su camino al destino final, sin ninguna confirmación de si llegaron o
no.
Al no ser necesario incluir mucha información de control, el protocolo UDP reduce la cantidad de
información extra en los paquetes por lo que es un protocolo más rápido que TCP y adecuado para
transmisión de información que debe ser transmitida en tiempo real como la voz.
Es por esta razón que la voz en aplicaciones de VoIP es transmitida sobre el protocolo UDP.
Stream Control Transmission Protocol (SCTP)
Fue Aprobado por el IETF como un estándar propuesto en el RFC 2960, SCTP es un protocolo de
transporte relativamente nuevo. Desde el principio, fue diseñado para hacer frente a las deficiencias de
los protocolos TCP y UDP, especialmente en relación con los tipos de servicios que solían ser entregados
a través de redes de telefonía por conmutación de circuitos (circuit-switched).
Algunos de los objetivos de SCTP fueron:
•
Mejorar las técnica para evitar la congestión (especialmente, evitar los ataques de denegación
de servicios)
•
Estricta secuencia de los datos enviados.
•
Mínima latencia para mejorar la transmisión en tiempo real.
Capı́tulo 3
Introducción a Asterisk PBX
¿Qué es Asterisk?
Asterisk es un programa de software libre (bajo licencia GPL) que proporciona funcionalidades de una
central telefónica con capacidad para voz sobre IP.
Asterisk incluye muchas características que anteriormente sólo estaban disponibles en costosos
sistemas propietarios PBX, como buzón de voz, conferencias, IVR, distribución automática de llamadas, y
otras muchas. Los usuarios pueden crear nuevas funcionalidades escribiendo un dialplan en el lenguaje
de script de Asterisk o añadiendo módulos escritos en lenguaje C o en cualquier otro lenguaje de
programación soportado en GNU/Linux.
Esto ha hecho que muchas empresas consideren a Asterisk como una opción seria al momento de
planificar su proyecto telefónico y por esta razón Asterisk ha tenido gran acogida a nivel mundial.
Al ver la oportunidad de negocio muchos fabricantes se han sumado a ofrecer hardware telefónico
compatible con Asterisk, principalmente tarjetas PCI para conexión con la PSTN y esto ha hecho que la
oferta de centrales telefónicas basadas en Asterisk crezca en los últimos tiempos.
Breve historia de Asterisk
Asterisk fue desarrollado por Mark Spencer, para entonces estudiante de ingeniería de informática de la
Universidad de Aubum, Alabama. Mark había creado en 1999 la empresa “Linux Support Services” con el
objetivo de dar soporte a usuarios de GNU/Linux. Para ello necesitaba una central telefónica, pero ante
la imposibilidad de adquirirla debido a sus elevados precios, decidió construir una con un PC bajo Linux,
utilizando lenguaje C.
En 1999, cuando tuvo un código digno de mostrar al mundo decidió liberarlo bajo licencia GPL.
Mark se dio cuenta de que su software necesitaba interactuar con hardware telefónico y se topó con el
proyecto Zaptel, un proyecto de código abierto creado por Jim Dixon, que tenía el objetivo de crear
drivers abiertos para tarjetas telefónicas de computadoras. A partir de entonces Asterisk y Zaptel
caminarían de la mano; tanto así que en la actualidad los dos proyectos son mantenidos por la misma
compañía.
Para el año 2002 “Linux Support Services” se convertiría en “Digium”, redirigiendo sus objetivos al
desarrollo y soporte de Asterisk.
El proyecto Zaptel
El proyecto fue concebido por Jim Dixom en el año 2000 cuyo nombre era una abreviatura de Zapata
Telephony Project. Se le da este nombre al proyecto en honor a Emiliano Zapata, héroe de la revolución
mexicana.
La Tecnología Zapata se basa en el concepto de que el hardware de computadora es ahora lo
suficientemente rápido para manejar todo el procesamiento para aplicaciones de telefonía, incluyendo
lo que se había limitado tradicionalmente a DSP y controladores embebidos.
DSP está optimizado para aplicaciones de procesamiento de señales y funciones, y lo hacen mucho más
eficientemente que los procesadores tradicionales de propósito general, como los que se encuentran en
las computadoras y sistemas informáticos estándar. A pesar de su seria ventaja en este tipo de
aplicaciones, tienen muchas deficiencias logísticas que a menudo hacen que su uso se alejes del alcance
de los mortales comunes. Estas deficiencias incluyen arquitecturas totalmente propietaria, tanto
hardware como software, que requieren conocimientos y experiencia especializada, por no mencionar
muy especializada (y sobre manera muy costosos) en el desarrollo de hardware y software.
La tecnología de Zapata intenta direccionar estas limitaciones.
Los drivers fueron liberados bajo licencia GPL de modo que cualquiera puede tener acceso al código.
En un principio los drivers contenido en zaptel eran para tarjetas Tormenta fabricada por Zapata
Telecom, pero pronto Digium comenzó a mejorar los drivers y a extender el soporte para nuevos
modelos de hardware y se convierte en el principal desarrollador de Zaptel.
Por otro lado a pesar de que Asterisk es un software poderoso no puede hacer todo el trabajo. Zaptel es
uno de los paquetes de software que los complementa. Zaptel es un conjunto de drivers para controlar
hardware telefónico con las tarjetas PCI que nos permiten conectarnos a la PSTN.
Estos drivers se comunican con Asterisk a través de un módulo de Asterisk llamado chan_zap.so que se
configura a través del archivo zapata.conf.
Zaptel tiene su propio archivo de configuración, independiente de Asterisk, llamado zaptel.conf y está
ubicado en la carpeta /etc/.
Luego de varios años de Digium mantener Zaptel, se da cuenta de que Zaptel era una marca registrada
de Zapata Telecom y para evitar cualquier posible confusión decide cambiar de nombre a sus drivers,
los cuales son ahora llamados DAHDI.
A partir de la versión 1.6 de Asterisk, Digium ha anunciado oficialmente que Zaptel no será más
soportado.
Versiones de Asterisk
Existen múltiples versiones de Asterisk, incluyendo las versiones congeladas. Una vez que una serie se
pone a disposición, obtiene soporte por algún periodo de tiempo. Durante el periodo inicial, el soporte
incluye cambios para correcciones de errores que se han reportado. En algún punto, la serie liberada
será obsoleta y únicamente se mantiene con correcciones para solucionar problema de seguridad.
Finalmente, la versión llegara al final de su vida, donde no recibirá más soporte ni cambio de ningún
tipo.
El tipo de versión define cuánto tiempo va a ser apoyada. Una versión LTS (Long Term Support) tendrá
soporte total por 4 años, con un año adicional de mantenimiento para corregir problema de seguridad.
Las versiones estándar solo tienen soporte por un corto periodo de tiempo, que será por lo menos un
año de apoyo y un año adicional de mantenimiento de parches de seguridad.
En la siguiente tabla se muestran las líneas de tiempo de liberación para todas las versiones de Asterisk,
incluyendo aquellos que han alcanzado el final de la vida.
SERIES
TIPO
FECHA DE PUBLICACIÓN
SOLO REVISIÓN DE SEGURIDAD
EOL
2005-11-21
2007-08-07
2010-11-21
LTS
2006-12-23
2011-04-21
2012-04-21
1.6.0.X
Estándar
2008-10-01
2010-05-01
2010-10-01
1.6.1.X
Estándar
2009-04-27
2010-05-01
2011-04-27
1.6.2.X
Estándar
2009-12-18
2011-04-21
2012-04-21
1.8.X
LTS
2010-10-21
2014-10-21
2015-10-21
10.X
Standard
2011-12-15
2012-12-15
2013-12-15
11.x
LTS
2012-10-25
2016-10-25
2017-10-25
12.x
Standard
2013-10 (tentativo)
2014-10 (tentativo)
2015-10 (tentativo)
13.x
LTS
2014-10 (tentativo)
2018-10 (tentativo)
2019-10 (tentativo)
1.2.X
1.4.X
Nuevas versiones de Asterisk se harán más o menos una vez al año, alternando entre versiones estándar
y LTS. Dentro de una serie de lanzamientos con soporte total, actualizaciones de corrección de errores
se proporcionan aproximadamente cada 4 semanas.
Si no estás seguro de que versión utilizar, elija la última versión, la más actualizadas o la última versión
LTS para una plataforma que puede tener menos funciones, pero por lo general será por más tiempo.
Preparando un Sistema Asterisk
El tamaño de un sistema Asterisk en realidad no está dictado por el número de usuarios o extensiones,
sino más bien por el número de llamadas simultáneas que se espera que el sistema soporte. Tenga en
cuenta que ninguna guía puede decir exactamente cuántas llamadas un servidor Asterisk puede
manejar. Hay un número increíblemente alto de variables que pueden afectar al momento de darle una
respuesta a la pregunta de cuántas llamadas Asterisk puede manejar. La única forma de averiguar
cuántos llama un servidor puede manejar es probarlo usted mismo en su propio entorno. Así que
siéntase libre para experimentar y ver lo que funciona para usted.
La tabla a continuación enumera algunas pautas muy básicas que usted querrá tener en cuenta al
planificar su sistema.
PROPÓSITO
Sistema de Hobby o Prueba
Sistema SOHO (pequeña oficina/Hogar menos
de 3 líneas y 5 extensiones)
NO. DE CANALES
No más de 5
5 a 10
Sistema negocio pequeños
Hasta 25
Sistema Mediano a grande
Más de 25
MÍNIMO RECOMENDADO
400-Mhz x86,256 MB RAM
1-GHZ x86 512 MB RAM
3-GHZ x86, 1GB RAM
CPUs Dual o posiblemente múltiples
servidores distribuidos.
Con instalaciones grandes de Asterisk, es común implementar funcionalidad a través de varios
servidores. Una o más unidades centrales estarán dedicadas a procesamiento de llamadas, las cuales se
complementan con uno o más servidores auxiliares que manejan los periféricos (tales como un sistema
de base de datos, un sistema de correo de voz, un sistema de conferencia, un sistema de gestión, una
interfaz web, un servidor de seguridad, y así sucesivamente).
Selección del hardware del servidor
La selección de un servidor es a la vez simple y complicado: simple porque, en realidad, cualquier
plataforma basada en x86 será suficiente, pero complicado porque el rendimiento fiable de su sistema
dependerá del cuidado que se ponga en el diseño de la plataforma. Cuando este seleccionando su
hardware, usted debe considerar cuidadosamente el diseño global del sistema y la funcionalidad que
necesita que este soporte. Esto le ayudará a determinar los requisitos para CPU, motherboard y fuente
de alimentación. Si simplemente está configurando su primer sistema Asterisk con el propósito de
aprender, puede ignorar la información de esta sección. Sin embargo, si usted está construyendo un
sistema de misión crítica adecuado para la implementación, se trata de cuestiones que requieren una
reflexión.
Problemas de rendimiento
Entre otras consideraciones, a la hora de seleccionar el hardware para una instalación de Asterisk debe
tener en cuenta una pregunta que es fundamental: ¿Que tan poderoso debe ser mi sistema? Esta no es
una pregunta fácil de responder, porque la manera en que el sistema se valla a utilizar va a jugar un
papel importante en los recursos que este consuma. No hay tal cosa como una matriz de desempeño de
ingeniería de Asterisk, por lo que tendrá que entender cómo Asterisk utiliza el sistema con el fin de
tomar decisiones inteligentes acerca de que tipos de recursos serán necesarios. Usted tendrá que tener
en cuenta varios factores, entre ellos:
•
El número máximo de conexiones concurrente que se espera que el sistema soporte. Cada
conexión aumenta la carga de trabajo sobre el sistema.
•
El porcentaje de tráfico que requieren uso intensivo del procesador DSP de codecs comprimido
(tales como G.729 y GSM).
El procesamiento de señal digital (DSP) que se realiza en el software Asterisk puede tener un
impacto impresionante sobre el número de llamadas simultáneas que serán soportadas. Un
sistema que podría felizmente manejar 50 llamadas simultáneas usando el códec G.711 se
puede poner de rodillas por una solicitud de conferencia con 10 canales comprimidos usando el
códec G.729.
•
Si se va a proporcionar conferencia y que nivel de actividad de conferencia se espera. Si el
sistema será usado fuertemente? Las conferencias requieren que el sistema codifique
(transcodificación) cada stream de audio entrante en múltiples stream de audio saliente.
Mesclar múltiples streams de audio en tiempo casi real puede poner una carga de trabajo
significante al CPU.
•
Cancelación de Eco. La cancelación de eco puede ser necesaria sobre cualquier llamada donde
una interface de Red Telefónica Pública Conmutada (PSTN) esté involucrada. Ya que la
cancelación de eco es una función matemática, el sistema tendrá que realizarla, mayor será la
carga sobre el CPU.
•
Lógica scripting en el Dialplan. Si Asterisk tiene que pasar el control de la llamada para programa
externo, habrá una ligera pérdida de rendimiento. Si se usaran scripts externo, ellos deben ser
diseñados con consideraciones críticas de rendimiento y eficiencia.
Como el impacto de rendimiento de estos factores, es difícil de saber con exactitud. El efecto de cada
uno se conoce en términos generales, pero una calculadora de rendimiento preciso aún no ha sido
definida con éxito. Esto es en parte debido a que el efecto de cada componente del sistema depende de
numerosas variables, tales como la potencia del CPU, chipset del motherboard y sobre todo la calidad, la
carga de tráfico total sobre el sistema, la optimización del Kernel de Linux, el tráfico de redes, cantidad y
tipo de las interfaces PSTN, y el trafico PSTN, sin mencionar cualquier servicios de Asterisk que el
sistema corra concurrentemente. Echemos un vistazo a los efectos de varios factores clave:
Codecs y Transcodificación
En poca palabra, un códec (es la forma corta de codificar/decodificar, o comprimir/descomprimir) es un
conjunto de reglas matemáticas que define como una forma de onda analógica será digitalizada. La
diferencia entre los diferentes codecs se debe en gran parte al nivel de compresión y calidad que ellos
ofrecen. Generalmente hablando, a mayor compresión requerida, mayor será el trabajo que el DSP debe
realizar para codificar y decodificar la señal. Un códec sin compresión, pone mucho menos tensión
sobre el CPU, pero requiere mucho más ancho de banda. La selección de un códec debe ser
estrictamente balanceada entre el ancho de bando y el uso de procesador.
Unidad Central de Proceso (y unidad de punto flotante)
Un CPU está compuesto por varios componentes, uno de los cuales es la unidad de punto flotante (FPU).
La velocidad del CPU, junto con la eficiencia de su FPU, juega un papel significante en la cantidad de
conexiones concurrentes que un sistema puede efectivamente soportar.
Otros procesos corriendo concurrentemente sobre el sistema
Similar a Unix, Linux está diseñado para ser capaz de realizar múltiples tareas en diferentes procesos. Un
problema sucede cuando uno de estos procesos (tal como Asterisk) exige un nivel muy alto de la
capacidad de respuesta del sistema. Por defecto, Linux distribuye los recursos equitativamente entre
todas las aplicaciones que los soliciten. Si usted instala un sistema con muchas aplicaciones diferentes,
cada una de estas aplicaciones se le permitirá un uso razonable del CPU. Pero como Asterisk requiere
frecuentemente acceso de alta prioridad para el CPU, este no se llevara bien con otras aplicaciones, y si
Asterisk debe coexistir con otras aplicaciones, el sistema puede requerir optimización especial. Esto
primeramente involucra la asignación de prioridades para las varias aplicaciones en el sistema y, durante
la instalación, especial atención para cuales aplicaciones serán instaladas como servicios.
Optimización del Kernel
Un Kernel optimizado para el rendimiento de una aplicación específica es algo que muy poca
distribuciones de Linux ofrecen por defecto, y esto requiere pensar un poco. Como mínimo, --cualquiera
que sea la distribución que usted selecciones—usted debe descargar o compilar sobre su plataforma
una copia fresca del Kernel de Linux (disponible desde http://www.kernel.org). También puede ser
capaz de adquirir parches que mejoran el rendimiento, pero esto es considerado hackeo a los kernels
oficialmente soportado.
IRQ latencia
IRQ latencia es básicamente el retraso entre el momento que una tarjeta periférica (tal como una tarjeta
de interface telefónica) solicita el CPU para que pare lo que está haciendo y el momento cuando el CPU
responde y está listo para manejar la tarea. Periféricos de Asterisk (especialmente las tarjetas DAHDI)
han sido históricamente intolerante a la latencia de la IRQ, aunque han habidos mejoras considerables
de DAHDI para ayudar a mejorar estos problemas. Esto no se debe a ningún problema con las tarjetas,
sino que más bien es parte de la naturaleza de cómo un motor de TDM basado en software tiene que
trabajar.
Versión del Kernel
Asterisk es oficialmente soportado con Linux versión 2.6. Casi la totalidad de Asterisk en realidad no se
preocupa por la versión del kernel, pero DAHDI si requiere la versión 2.6.
Distribución Linux
Las distribuciones de Linux son muchas y variadas. Asterisk debería funcionar en todas ellas. Elija la que
usted se sienta más cómodo.
Directorio de Asterisk
Para la mayoría de las instalaciones de Asterisk, el cambio de los directorios no es necesario. Sin
embargo, esto puede ser útil para ejecutar más de una instancia de Asterisk, al mismo tiempo, o si le
gustaría almacenar los archivos en una ubicación diferente.
Asterisk organiza sus archivos en algunos directorios. En la tabla siguiente
importantes.
tenemos los más
DIRECTORIO
DESCRIPCIÓN
/etc/asterisk/
Contiene los archivos de configuración de Asterisk
/usr/lib/asterisk/modules/
Ubicación donde se almacenan los módulos cargables.
/var/lib/asterisk
La ubicación base para la información de estado de las variable
utilizada por varias partes de Asterisk.
/usr/sbin/
Reside el binario de Asterisk
/var/log/asterisk/
Directorio donde Asterisk guarda sus archivos de log.
/var/lib/asterisk/agi-bin/
Residen los scripts AGI
/var/lib/asterisk/mohmp3
Contiene archivos de sonidos para la música en espera.
/var/lib/asterisk/sounds
Sonidos que Asterisk utiliza como prompts de voz.
/var/spool/asterisk/
Directorio donde Asterisk guarda archivos que genera producto
de su funcionamiento como voicemail y grabaciones de
llamadas.
/var/run/asterisk
Archivos con información de los ID de procesos (PID).
/var/log/asterisk/
Aquí residen los archivos de log de Asterisk como el
/var/log/asterisk/full o el log de texto de CDRs
Asterisk CLI
Asterisk CLI es el nombre dado a la consola de Asterisk. Es decir es la línea de comando que nos permite
controlar Asterisk directamente. El CLI es la mejor manera para ver que está pasando con su sistema,
esta interface provee varios niveles de salida y ofrece una gran cantidad de utilidades para permitirle
afectar el funcionamiento de su sistema.
Para ingresar CLI de Asterisk debemos ingresar el siguiente comando asterisk –r desde la consola de
Linux. Como podemos notar obtenemos un prompt desde donde podemos ejecutar una seria de
comandos que veremos en breve.
El CLI también nos proporciona información en tiempo real de la actividad de Asterisk. Podemos
controlar el grado de detalles con el que queremos ver dicha información con algunos comandos. A
continuación algunos de los más usados.
Capı́tulo 4
Arquitectura de Asterisk
Asterisk se diferencia de las mayorías de la PBX tradicionales, en que el dialplan de Asterisk trata todos
los canales entrantes esencialmente de la misma manera.
En una PBX tradicional, hay una diferencia lógica entre estaciones (extensiones telefónicas) y trunks
(recursos que conectan con el mundo exterior). Esto significa, por ejemplo, que no se puede instalar un
gateway externo sobre un puerto de una estación y enrutar las llamadas externas sin necesidad de que
los usuarios marquen el número de extensión primero. Además, el concepto de un recurso fuera del
sitio (por ejemplo, un área de recepción) es mucho más difícil de implementar en una PBX tradicional, ya
que el sistema no permitirá que los recursos externos tengan acceso a las funciones internas.
Asterisk, por otra parte, no tiene un concepto interno de troncos o estaciones. En Asterisk, todo lo que
entra o sale del sistema pasa a través de un canal de algún tipo. Hay muchos tipos diferentes de canales,
sin embargo, el dialplan de Asterisk maneja todos los canales de una manera similar, lo que significa
que, por ejemplo, un usuario interno puede existir en el extremo de un tronco externo (por ejemplo, un
teléfono celular) y ser tratado por el dialplan exactamente de la misma manera que ese usuario sería
tratado si estuviera en una extensión interna. La imagen siguiente ilustra la diferencia entre estas dos
arquitecturas.
Asterisk vs. Arquitectura PBX
Los Módulos
Asterisk es construido sobre módulos. Un módulo es un componente cargable que proporciona una
funcionalidad específica, tal como un controlador de canal (por ejemplo, chan_sip.so), o un recurso que
permite una conexión a una tecnología externa (tales como func_odbc.so). Los módulos de Asterisk son
cargado basado en el archivo /etc/asterisk/modules.conf. Vamos a discutir el uso de muchos módulos
en este libro. En este momento sólo queremos introducir el concepto de módulos, y darle una idea de
los tipos de módulos que están disponibles.
En realidad, es posible iniciar Asterisk sin ningún módulo en absoluto, aunque en este estado no será
capaz de hacer cualquier cosa. Es útil comprender la naturaleza modular de Asterisk con el fin de
apreciar la arquitectura.
Los tipos de módulos en Asterisk incluyen los siguientes:
•
•
•
•
•
•
•
•
•
•
•
•
De Aplicaciones
Módulos Puentes
Módulos de grabación de detalles de llamadas (CDR)
Módulos de registro de eventos de Canales (CEL)
Drivers de canales
Traductores Codec
Interprete de formato
Funciones de Dialplan
Módulos PBX
Módulos de Recursos
Módulos Addons
Módulos de prueba
Vamos a echar un vistazo a los módulos, agrupados por tipo de módulo.
Módulos de Aplicaciones
Las aplicaciones de dialplan son usadas en el extensions.conf para definir las varias acciones que pueden
ser aplicadas a las llamadas. La aplicación Dial(), por ejemplo, es responsable de realizar las conexiones
salientes a los recursos externos y que es posiblemente la aplicación del dialplan más importante.
En la siguiente tabla veremos algunos módulos a modo de ejemplo, como el listado de módulos de
aplicaciones es amplio solo listaremos algunos de los más populares.
NOMBRE
PROPÓSITO
ESTATUS
app_stack
Provee Gosub(),GoSubIf(),Return(), Stack, Pop(), LOCAL(), y
LOCAL_PEEK()
Esencial
app_voicemail
Proporciona el correo de voz
Esencial
app_record
Graba el audio recibido para un archivo
Útil
app_read
Solicita la entrada de dígitos y asigna la entradas a una variables
Útil
app_sayunixtime
Reproduce el tiempo en un formato especifico
Útil
app_senddtmf
Transmite DTMF al que llama
Útil
app_softhangup
Solicita colgar el canal
Útil
app_transfer
Realiza una transferencia sobre el canal actual
Útil
app_cdr
Guarda los registros de CDR
Útil
app_chanspy
Permite escuchar desde un canal el audio en otro canal
Útil
app_directory
Presenta la lista de nombres de voicemail.conf
Útil
app_disa
Proporciona tono de marcado y acepta la entrada DTMF
Útil
app_meetme
Proporciona conferencia
Útil
app_queue
Provee distribución de llamadas automáticas (ACD)
Útil
Existen machismos más módulos de aplicaciones y que son bastante útiles y que a medida que sigamos
avanzando veremos en más detalles.
Módulos Puentes
Los módulos puentes realizan el puente de canales en las nuevas API puente. Cada uno provee diferente
funciones, los cuales son usados en diferentes situaciones dependiendo sobre que sea necesario un
bridge o puente. Estos módulos, listados en la tabla siguiente, son actualmente únicamente usados por
app_confbridge.
NOMBRE
PROPÓSITO
bridge_builtin_features
Realiza puenteo al utilizar las características incorporadas de usuario (como
las que se encuentran en los features.conf).
bridge_multiplexed
Realiza multiplexación compleja, como la requerida en un gran sala de
conferencias (múltiples participantes). Actualmente, sólo utilizado por
app_confbridge.
bridge_simple
Realiza un puenteo simple de canal a canal.
bridge_softmix
Realiza multiplexación simple, como la requerida en un gran sala de
conferencias (múltiples participantes). Actualmente, sólo utilizado por
app_confbridge.
Módulos de Grabación de Detalles de Llamadas, CDR.
Los módulos CDR, están diseñados para facilitar todos los métodos de almacenamiento de registros de
llamadas como sea posible. Usted puede almacenar CDRs para un archivo (método por defecto), una
base de datos, RADIUS, o syslog. Sin embargo, estos no fueron pensados para ser usado en aplicaciones
de facturación de llamadas complejas. Si usted requiere más control sobre la facturación y los reportes
de llamadas, usted tendrá que buscar en el registro de eventos de canal. La ventaja del CDR es que son
simples para trabajar. La tabla siguiente lista los módulos de grabación de detalles de llamadas.
NOMBRE
PROPÓSITO
cdr_adaptive_odbc
Permite escribir CDRs a través de framework ODBC con posibilidad de añadir
campos personalizados.
cdr_csv
Escribe los CDR en el disco como un archivo de valores separados por comas.
cdr_custom
Como el anterior, pero permite la adición de campos personalizados
cdr_manager
Salidas CDRs a Asterisk Manager Interface (AMI)
cdr_odbc
Escribe los CDRs a través de un framework ODBC.
cdr_pgsql
Escribe los CDRs para PostgreSQL.
cdr_radius
Escribe los CDRs para RADIUS, no soporta campos personalizados.
cdr_sqlite
Escribe los CDRs para la base de datos SQLite2, este es obsoleto, use
sqlite3_custom.
cdr_sqlite3_custom
Escribe los CDRs para la base de datos SQLite3, con campos personalizados.
cdr_syslog
Escribe los CDRs para syslog.
cdr_tds
Escribe los CDRs para Microsoft SQL o Sybase, requiere una versión vieja
libtds.
Módulos de Registro de Eventos de Canales, CEL
Los registros de eventos de canales proveen un control mucho más poderoso sobre los reportes de
actividades de llamadas. De la misma manera, se requiere planificar su dialplan con mucho más cuidado.
Los modules CEL de Asterisk son listados en la tabla siguientes.
NOMBRE
PROPÓSITO
cel_custom
Escribe CEL para el disco en un archivo
cel_manager
CEL para Asterisk Manager Interface (AMI)
cel_odbc
Escribe los CELs a través de un framework ODBC
cel_pgsql
Escribe los CELs para PostgreSQL
cel_radius
Escribe los CELs para RADIUS, no soporta campos personalizados.
cel_sqlite3_custom
Escribe los CELs para la base de datos SQLite3
cel_tds
Escribe los CELs para Microsoft SQL o Sybase, requiere una versión
vieja libtds.
Controladores de Canales
Sin drivers de canal, Asterisk no tendría manera de hacer llamadas. Cada controlador de canal específica
el tipo de protocolo o tecnología que este soporta (SIP, ISDN, etc.). Los módulos de canales actúan como
un gateway para el core o núcleo de Asterisk. Estos son listados en la tabla siguiente.
NOMBRE
PROPÓSITO
chan_agent
Proporciona un canal agente de Queue() (colas de llamadas)
chan_alsa
Proporciona conexión con Advanced Linux Sound Architecture
chan_bridge
Usado Internamente por la aplicación ConfBridge(); no se debe usar
directamente.
chan_console
Ofrece conexión para un puerto de audio.
chan_dahdi
Proporciona conexión a tarjetas PSTN que utilizan controladores de
canales DAHDI.
chan_gtalk
Conexión para Google Talk.
chan_h323
Proporciona conexión para terminales H.323; es ya obsoleto, usar
chan_ooh323.
chan_iax2
Proporciona conexión para terminales IAX2.
chan_jingle
Ofrece conexión a los puntos finales de Jingle.
chan_local
Provee un mecanismo para tratar una porción del dialplan como un
canal.
chan_mgcp
Controlador de canales Media Gateway Control Protocol.
chan_misdn
Proporciona conexión las tarjetas ISDN modular.
chan_multicast_rtp
Conexión para streams RTP multicast.
chan_nbs
Controlador de Canal Network Broadcast Sound; su uso es
insignificantes
chan_oss
Controlador Open Sound System
chan_phone
Controlador de interfaz de telefonía Linux (muy viejo, es insignificante)
chan_sip
Controlador de Canales de SIP (Protocolo de Inicialización de sección)
chan_skinny
Controlador de canales Cisco Skinny Control Protocol (SCCP)
chan_unistim
Proporciona conexión para el protocolo controlador de canal UNISTIM
de Nortel
chan_usbradio
Controlador de canal para tarjetas USB CM108 con interfaz de radio
chan_vpb
Controlador de canal Voicetronix; su uso es insignificante
Traductores Codec
Los traductores de códec les permiten a Asterisk convertir los formatos de stream de audio entre
llamadas. Así que si se recibe una llamada en un circuito PRI (usando G.711) y debe ser pasada a un
canal SIP comprimido (por ejemplo, usando G.729, uno de los muchos códecs que SIP puede manejar), el
traductor códec pertinente realizará la conversión.
En la tabla siguiente se listan los diferentes traductores de códec y su propósito.
NOMBRE
codec_adpcm
PROPÓSITO
Adaptive Differential Pulse Coded Modulation códec; es insignificante.
codec_alaw
A-law PCM codec utilizado en todo el mundo (excepto Canadá/EE.UU.) en
la PSTN; es esencial.
codec_a_mu
Convierte directamente A-law para mu-law.
codec_dahdi
Utilizado por las tarjetas de transcodificación propietaria de Digium.
codec_g722
Códec de audio de banda ancha.
codec_g726
Otro sabor de ADPCM; es insignificante.
codec_gsm
Codec Sistema Global para las Comunicaciones Móviles (GSM)
codec_ilbc
Internet Low Bitrate Codec; es insignificante.
codec_lpc10
Linear Predictive Coding vocoder (muy bajo ancho de banda); es
insignificante.
codec_resample
Muestreo linear entre 8bit y 16 bit.
codec_speex
Speex códec.
codec_ulaw
Mu-law PCM codec usado en Canadá/USA en la PSTN; es esencial.
Intérpretes de Formatos
Los Intérpretes de formatos realizan la función de traductores codec, pero hacen su trabajo en los
archivos en lugar de canales. Si usted tiene una grabación de un menú que se ha almacenado en
formato GSM, un intérprete de formato tendría que ser utilizado para reproducir la grabación a
cualquier canal que no utilice el codec GSM.
Si guarda una grabación en varios formatos (como WAV, GSM, etc.), asterisk determinar el formato de
menor costo para usar cuando un canal requiere que se reproduzca la grabación.
NOMBRE
REPRODUCE ARCHIVOS ALMACENADOS EN:
format_g723
G.723 .g723
format_g726
G.726 .g726
format_g729
G.729 .g729
format_gsm
RPE-LTP (original codec GSM) .gsm
format_h263
H.263—video .h263
format_h264
H.264—video .h264
format_ilbc
Internet Low Bitrate Codec .ilbc
format_jpeg
Archivos gráfico .jpeg .jpg
format_ogg_vorbis
Ogg contenedor. Ogg
format_pcm
Varios PCM, formato: .alaw, .al, .alw, .pcm,
.ulaw, .ul, .mu, .ulw, .g722, .au
format_siren14
G.722.1 Anexo C (14 kHz) .siren14
format_siren7
G.722.1 (7 kHz) .siren7
format_sln16
16-bit firmado lineal. Sln16
format_sln
8-bit firmado lineal .sln .raw
format_vox
.vox
format_wav
.wav
format_wav_gsm
Audio GSM en un contenedor WAV .WAV,
.wav49
Funciones del Dialplan
Las funciones del dialplan, complementan las aplicaciones del dialplan. Proporcionan muchas mejoras
útiles para cosas como manejo de cadenas, hora y fechas, y conectividad ODBC.
NOMBRE
PROPÓSITO
func_aes
Encripta/desencripta una cadena AES
func_audiohookinherit
Permite que las llamadas se graben después de ser transferida
func_base64
Codifica/decodifica una cadena base-64
func_blacklist
Escribe/lee la lista negra en AstDB
func_callcompletion
Obtiene/establece los parámetros de configuración de terminación de
llamadas para el canal
func_callerid
Obtiene/establece el CallerID
func_cdr
Obtiene/establece variables CDR
func_channel
Establece/Obtiene información de canal
func_config
Incluye AST_CONFIG(); lee las variables del archivo config
func_connectedline
Cambios relacionados a la información de la línea conectada en los teléfonos
compatibles
func_curl
Utiliza cURL para obtener datos desde un URI
func_cut
Divide y corta cadenas
func_db
Proporciona funciones Astdb
func_devstate
Obtiene el estado de un dispositivo
func_dialgroup
Crea un grupo de marcado simultaneo
func_dialplan
Valida que existe objetivo designado en el dialplan
func_enum
Realiza búsqueda ENUM
func_env
Incluye FILE( ), STAT(), y ENV( ); realiza acciones en el sistema operativo
func_extstate
Retorna el estado de una extensión dada.
func_global
Obtiene o establece las variables globales
func_groupcount
Obtiene o establece el número de canales para los miembros de un grupo
func_iconv
Convierte entre conjuntos de caracteres
func_lock
Incluyes LOCK(), UNLOCK(), and TRYLOCK(); establece un bloqueo para evitar
condiciones anticipada en el dialplan
func_logic
Incluye ISNULL(), SET(), EXISTS(), IF(), IFTIME(), y IMPORT(); realizas varias
funciones lógicas
func_math
Incluye MATH(), INC(), and DEC(); realiza funciones matemáticas
func_md5
Convierte una cada dada para un hash MD5
func_module
Chequea para ver si los módulos suministrados están cargado en memoria
func_odbc
Permite la integración del dialplan con recursos ODBC.
func_pitchshift
Cambia el tono de un stream de audio
func_rand
Devuelve un número aleatorio dentro de un rango dado
func_realtime
Realiza búsquedas en la Arquitectura Realtime Asterisk (ARA)
func_redirecting
Proporciona acceso a la información sobre, desde donde esta llamada fue
redirigida
func_sha1
Convierte cadena suministrada a un hash SHA1
func_shell
Realiza operaciones de shell de Linux y devuelve los resultados
func_speex
Reduce el ruido y realiza la ganancia/pérdida de dB sobre un stream de audio
func_sprintf
Realiza funciones de formato de cadena similar a la función C del mismo
nombre
func_srv
Realiza búsqueda SRV en el dialplan
func_strings
Incluye más de una docena de funciones de manipulación de cadenas
func_sysinfo
Obtiene información del sistema, como la memoria RAM, swap, medio carga,
etc.
func_timeout
Obtiene/establece los tiempos de espera en el canal
func_uri
Convierte cadenas para codificación URI segura
func_version
Devuelve información sobre la versión de Asterisk
func_vmcount
Devuelve el número de mensaje en un folder voicemail para un usuario
particular.
func_volume
Establece el volumen sobre un canal
Módulos PBX
Los módulos PBX son módulos periféricos que proporciona un mecanismo de mayor control y
configuración. Por ejemplo, pbx_config es el módulo que cargar el dialplan tradicional. Los módulos PBX
actualmente disponible son listados en la tabla siguiente.
NOMBRE
PROPÓSITO
pbx_ael
Asterisk Extensión Logic (AEL) ofrece un lenguaje de scripting para dialplan
similar a un lenguaje de programación moderno
pbx_config
Este es el tradicional, y más popular, lenguaje de dialplan para Asterisk. Sin
este módulo Asterisk no puede leer el archivo extensions.conf
pbx_dundi
Realiza búsqueda de datos sobre un sistema Asterisk remoto.
pbx_loopback
Realiza algo similar al include del dialplan, pero de una manera obsoleta
pbx_lua
Permite la creación de un dialplan usando el lenguaje de scripting Lua
pbx_realtime
Proporciona funcionalidad relacionada con la Arquitectura Asterisk Realtime.
pbx_spool
Proporciona soporte de spool saliente en relación con los archivos de
llamadas de Asterisk.
Módulos de Recursos
Los módulos de recursos integran a Asterisk con los recursos externo. Por ejemplo, res_odbc permite a
Asterisk interoperar con conexiones de base de datos ODBC. Los modules de recursos disponibles
actualmente son listado en la siguiente tabla.
Nombre
res_adsi
Propósito
Proporciona ADSI
res_ael_share
Proporciona rutinas compartidas para su uso con pbx_ael
res_agi
Proporciona Asterisk Gateway Interface
res_ais
Proporciona indicación de mensaje en espera distribuido (MWI) y notificaciones
del estado de dispositivo vía una implementación del estándar AIS, tal como
OpenAIS.
res_calendar
Habilita la integración básica para sistemas de calendarios
res_calendar_caldav
Proporciona funciones de CalDAV específicos
res_calendar_exchange
Proporciona funciones de MS Exchange
res_calendar_icalendar
Proporciona funciones iCalendar Apple/Google
res_clialiases
Crea alias CLI
res_clioriginate
Origina una llamada desde CLI
res_config_curl
Extrae información de configuración usando cURL
res_config_ldap
Extrae información de configuración usando LDAP
res_config_odbc
Extrae información de configuración usando ODBC
res_config_pgsql
Extrae información de configuración usando PostgreSQL
res_config_sqlite
Extrae información de configuración usando SQLite
res_convert
Utiliza el CLI para realizar conversiones de archivos
res_crypto
Proporciona capacidades criptográficas
res_curl
Proporciona subrutinas comunes para otros módulos CURL
res_fax
Proporciona subrutinas comunes para otros módulos fax
res_fax_spandsp
Plug-in para fax usando los paquetes spandsp
res_http_post
Proporciona soporte de carga POST para servidores Asterisk HTTP
res_jabber
Proporciona recursos Jabber/XMPP
res_limit
Permite el ajuste de los límites del sistema sobre los proceso de Asterisk
res_monitor
Proporciona recursos de grabación de llamadas
res_musiconhold
Proporcionas recurso para música en espera (MOH)
res_mutestream
Permite silenciar/desactivar el silencio de los streams de audio
res_odbc
Proporciona subrutina comunes para otros módulos ODBC
res_phoneprov
Aprovisionamiento de teléfonos desde un servidor HTTP Asterisk
res_pktccops
Proporciona recursos PacketCable COPS
res_realtime
Proporciona comandos desde el CLI para la Arquitectura Realtime Asterisk
(ARA)
res_rtp_asterisk
Provee RTP
res_rtp_multicast
Provee RTP multicast
res_security_log
Habilita el registro de seguridad
res_smdi
Proporciona notificaciones de correo de voz mediante el protocolo SMDI
res_snmp
Proporcionas información del estado del sistema para redes monitoreada con
SNMP.
res_speech
API genérico de reconocimiento de voz
res_timing_dahdi
Proporciona el tiempo usando la interfaz del kernel DAHDI
res_timing_kqueue
Proporciona el tiempo utilizando una característica del kernel en algunos BSD,
incluyendo Mac OS X
res_timing_pthread
Proporciona el tiempo utilizando sólo partes de la API pthread estándar, menos
eficiente pero más portable que otros módulos el timing.
res_timing_timerfd
Proporciona el tiempo utilizando la API timerfd proporcionada por las nuevas
versiones del kernel Linux
Módulos Addon
Los Módulos adicionales son módulos desarrolladas por comunidades con uso diferente o derechos de
distribución diferente a los del código principal. Se mantienen en un directorio aparte y no se compilan
e instalan de forma predeterminada. Para habilitar estos módulos, utilice el menuselect integrado con el
utilitario de configuración. Los módulos Addon disponible son listados en la tabla siguiente.
NOMBRE
PROPÓSITO
app_mysql
Ejecuta consulta MySQL con una aplicación del dialplan; es obsoleto, use
func_odbc.
app_saycountpl
Dice cuenta palabras polacas; es obsoleto – ahora es integrado con say.conf
cdr_mysql
Graba los registros de detalles de llamadas para una base de datos MySQL; se
recomienda usar cdr_adaptive_odbc.
chan_mobile
Permite realizar y recibir llamadas usando teléfonos móviles a través de
Bluetooth
chan_ooh323
Permite la realización y recepción de llamadas VoIP mediante el protocolo
H.323
format_mp3
Permite a Asterisk reproducir archivos MP3
res_config_mysql
Utiliza una base de datos MySQL como backend de configuración en tiempo
real
Módulos Test (o prueba)
Los módulos de prueba son utilizados por el equipo de desarrollo de Asterisk para validar código nuevo.
Ellos son cambiados y agregados constantemente, y no son útiles a menos que usted esté desarrollando
software para Asterisk.
Estructura de Archivo
Asterisk es un sistema complejo, compuesto de muchos recursos. Estos recursos hacen uso del sistema
de archivos de varias maneras. Dado que Linux es muy flexible en este sentido, es útil comprender qué
datos están siendo almacenados, de manera que puedas entender donde es posible que se encuentre,
algunos de los datos particulares almacenados (por ejemplo, mensajes de correo de voz o archivos de
registro).
Archivos de configuración
Los archivos de configuración de Asterisk incluyen extensions.conf, sip.conf, modules.conf, y docenas de
otros archivos que definen los parámetros para los varios canales, recursos, módulos, y funciones que
usted estará usando.
Estos archivos se encuentran en /etc/Asterisk. Usted va a trabajar mucho en esta carpeta, ya que
permite configurar y administrar el sistema Asterisk.
Módulos
Los módulos de Asterisk son usualmente instalado en el directorio /usr/lib/asterisk/modules.
Normalmente usted no tendrá que interactuar con este folder; sin embargo, ocasionalmente será útil
saber dónde los módulos están ubicados. Por ejemplo, si usted está haciendo un upgrade a Asterisk y
selecciona diferente módulos durante la fase de instalación de menuselect, los módulos viejos de la
versión previa de Asterisk no serán borrados, y usted obtendrá una alerta desde el script de instalación.
Los archivos viejos necesitan ser borrados del directorio modules. Esto puedo ser hecho manualmente o
con “uninstall” haciendo (make uninstall) desde los fuentes de Asterisk.
Librería de Recursos
Hay varios recursos que requieren fuentes de datos externas. Por ejemplo, música en espera (MOH) no
puede reproducirse a menos que tenga algo de música guardada. Los prompts del sistema también
necesitan ser almacenado en algún lugar del disco duro. El directorio /var/lib/asterisk es donde los
prompts del sistema, los scripts AGI, la música en espera, y otros archivos de recursos son guardados.
Spool
Es donde Linux almacenas los archivos que son cambiados con frecuencia, o serán procesados por otros
procesos en un momento posterior. Por ejemplo, los trabajos de impresión de Linux y los correos
pendientes son normalmente escritos para el spool hasta que ellos sean procesados.
En Asterisk, el spool es usado para almacenar objetos transitorios tales como mensajes de voz,
grabaciones de llamadas, archivos de llamadas, y así sucesivamente.
El spool de Asterisk se encuentra bajo el directorio /var/spool/Asterisk.
Logging
Asterisk es capaz de generar varios tipos diferentes de archivos de log. El /var/log/asterisk es donde
cosas tales como las grabaciones de detalles de llamadas (CDR), eventos de canales CEL, registros de
depuración, registros de cola, mensajes, errores y otras salidas son escritas.
Este folder es extremadamente importante para cualquier esfuerzo de solución de problemas que usted
se comprometa.
El Dialplan
El dialplan es el corazón de Asterisk. Todos los canales que llegan al sistema serán pasados a través del
plan de marcado, que contiene la secuencia de comandos de flujo de llamadas que determina cómo se
manejan las llamadas entrantes.
Un dialplan puede ser escrito en una de tres formas:
•
Usando la sintaxis del dialplan tradicional en /etc/asterisk/extensions.conf
•
Usando el Asterisk Extensión Logic (AEL) en /etc/asterisk/extensions.ael
•
Usando LUA en /etc/asterisk/extensions.lua
Una vez que aprendes este lenguaje, es bastante fácil para la transición a AEL o LUA, si usted desea.
Hardware
Asterisk es capaz de comunicarse con un gran número de tecnologías diferentes. En general, estas
conexiones son hechas a través de una conexión de redes; sin embargo, las conexiones para la mayoría
de la tecnología de telecomunicaciones tradicionales, tal como la PSTN, requieren hardware específico.
Muchas compañías producen esto hardware, tales como Digium (patrocinador, propietario y
desarrollador principal de Asterisk), Sangoma, Rhino, OpenVoX, Pika, Voicentronix, Junghanns, Dialogic,
Xorcom, beroNET, y muchos otros. Los hardwares más populares para Asterisk son generalmente
diseñados para trabajar a través de Digium Asterisk Hardware Device Interface (mejor conocido como
DAHDI). Estas tarjetas, todas tienen diferentes requisitos de instalación y diferentes ubicaciones de
archivos.
Capı́tulo 5
Instalación de Asterisk
En este capítulo vamos a caminar a través de la instalación de Asterisk desde el código fuente. Muchas
personas se apartan de este método, alegando que es demasiado difícil y consume tiempo. Nuestro
objetivo es demostrar que la instalación de Asterisk desde el código fuente no es realmente tan difícil de
hacer. Más importante aún, queremos ofrecerle la mejor plataforma de Asterisk en la cual aprender.
En este libro, le ayudaremos a construir un sistema Asterisk funcional desde cero. Este capítulo le
proporciona las herramientas para construir una plataforma base para su sistema Asterisk. Teniendo en
cuenta que vamos a hacer la instalación desde el código fuente, hay potencialmente una gran cantidad
de variación en la forma en que usted puede hacer esto. El proceso que se discute aquí es el que hemos
utilizado durante muchos años, siguiendo este le proporcionara los fundamentos adecuados para
aprender y trabajar con Asterisk.
Como parte de este proceso, también vamos a explicar la instalación de algunas de las dependencias de
software en la plataforma Linux que serán necesarios para temas que trataremos más adelante en este
libro.
Vamos a mostrar las instrucciones para instalar Asterisk tanto sobre CentOS (que es una distribución
basada Red Hat) y Ubuntu (una distribución basada en Debian), que creemos que cubre la gran mayoría
de distribuciones de Linux que están instalada en la actualidad. Trataremos de mantener las
instrucciones lo más general posible para que puedan ser útiles en cualquier distribución de Linux que
escojas.
Hemos optado por instalar Asterisk en CentOS y Ubuntu, ya que son las opciones más populares, pero
Asterisk generalmente se instalada en cualquier distribución. Incluso se instala en Solaris, BSD, Mac OS
X, si lo deseas.
Instalación de Distribución
Porque Asterisk depende en gran medida de tener acceso prioritario al CPU, es esencial que instale
Asterisk en un servidor sin interfaz gráfica, como el sistema de ventanas X (Gnome, KDE, etc.). Tanto
CentOS y Ubuntu ofrecen una distribución GUI gratuita diseñada para el uso del servidor. Cubriremos las
instrucciones para ambas distribuciones.
Servidor CentOS
CentOS significa “Sistema Operativo de la Comunidad Empresarial” (Community Enterprise Operating
System), y está basado en Red Hat Enterprise Linux (RHEL). Para más información sobre CentOS, vea
http://www.centos.org.
Usted necesita descargar un ISO desde la página web de CentOS, localizada en
http://mirror.centos.org/centos/5/isos/. Seleccione el directorio i386 y x86_64 para hardware de 32 bits
o 64 bits, respectivamente. Elija una de las imágenes, y se le presentará una lista de archivos para
descargar. Comúnmente usted quera la primera selección disponible, la cual es el primer archivo ISO de
un conjunto. Usted únicamente necesita el primer archivo ISO de la serie porque lo software adicional
los instalaremos con yum.
Una vez que haya descargado el archivo ISO, grábelo en un CD o DVD e inicie el proceso de instalación.
Si va a instalar en una máquina virtual (no se recomienda para uso en producción, pero puede ser una
buena idea para probar Asterisk), usted debería ser capaz de montar el archivo ISO directamente e
instalar desde allí.
Instalación básica del sistema
Inserte el disco (DVD) de instalación de CentOS 6, reinicie su computador para arrancar desde el
CD/DVD y presiones ENTER.
En este punto la interfaz de instalación se iniciara. Se le preguntará si desee probar la integridad del
medio de instalación. Estas instrucciones asumen que usted ya ha hecho esto, y por lo tanto puede
saltarse este paso.
CentOS entonces le dará la bienvenida a la instalación. Presiones ENTER para continuar.
Selecciones su idioma y el idioma del teclado. Si está en Norte América, o simplemente se siente más
cómodo con el idioma inglés. Es probable que sólo tenga que seleccionar los valores predeterminados.
En mi caso he seleccionado el inglés como predeterminado.
Se le preguntara para inicializar la unidad, lo cual borrara todos los datos en su disco. Selecciones YES
(Si).
El instalador le preguntara si desea remover el esquema de partición existente y crear uno nuevo.
Selecciones Remover todas las particiones (Remove all partición) sobre la unidad seleccionada y cree un
esquema por defecto. Si existe una opción más conveniente, podrá elegirla en su lugar. En la ventana de
la unidad, compruebe que se ha seleccionado la unidad de disco correcto. (Presionando la tecla TAB se
avanza por las diferentes opciones en la pantalla.) Una vez seleccionada la ventana de las unidad, puede
desplazarse hacia arriba y hacia abajo (suponiendo que tiene varias unidades) y seleccionar el disco duro
en el que desea instalar. Cambie las selecciones pulsando la barra espaciadora. Verifique que se ha
seleccionado la unidad correcta, pulse Tab hasta que se resalte el botón OK, y pulse Enter.
Se presentará un mensaje para confirmar que desea eliminar todas las particiones Linux y crear el nuevo
esquema de partición. Seleccione YES (Si).
Se le pedirá que revise el nuevo esquema de partición. Siéntase libre de modificar el esquema de
partición si prefiere algo diferente, sin embargo, la respuesta “NO” por defecto no es una muy buena
opción para su sistema en un ambiente de producción, use el esquema por defecto cuando los
requisitos de almacenamiento serán mínimos.
Aparecerá un mensaje preguntando si desea configurar la interfaz de red eth0 en su sistema.
Selecciones YES (Si). Asegúrese de que la opción Activate on boot y activar las opciones de soporte IPv4
están habilitadas, a continuación, seleccione Aceptar.
Si su red proporciona aprovisionamiento de IP automática a través de DHCP, usted puede seleccionar
Aceptar. De lo contrario, seleccione Configuración de la dirección manual, introduzca la información
adecuada y, a continuación, seleccione Aceptar.
A continuación, se le pedirá que proporcione un nombre de host. Puede permitir que el servidor DHCP
proporcione uno por usted (si su red asigna automáticamente nombres de host) o introduzca uno
manualmente, seleccione Aceptar.
Se le presentará una lista de zonas horarias. Seleccione su zona horaria y seleccione Aceptar.
En este punto, se le pedirá la contraseña del usuario root. Escriba una contraseña segura y vuelva a
escribirla para confirmar. Después de introducir su contraseña segura, seleccione Aceptar.
El Siguiente paso será la selección de paquetes. Varios paquetes que no necesitan instalarse (y que
requieren archivos ISO adicionales que usted probablemente no ha descargado) se seleccionan de forma
predeterminada. Quite la selección a todas las opciones en la lista con la barra espaciadora, a
continuación, seleccione la opción de selección de software personalizada (Customize). Una vez que
hayas hecho esto, seleccione Aceptar.
A continuación, se presenta una pantalla de selección de grupo de paquetes. Desplácese por la lista
entera, anulando la selección de cada elemento. Si se seleccionan los paquetes, se le pedirá CDs
adicionales que no se ha descargado. Instalaremos los paquetes adicionales con la aplicación yum
después de instalar el sistema operativo. Una vez que haya anulado la selección de todos los paquetes,
seleccione Aceptar.
Una comprobación de las dependencias se será realizada, y una confirmación de que la instalación está
lista para empezar será presentada. Selecciones Aceptar para iniciar la instalación. El sistema de
archivos entonces será formateado, la imagen de instalación transferida al disco duro, y la instalación de
los paquetes del sistema se llevará a cabo. Tras la instalación, se le pedirá que reinicie su computador.
Quite todos los medios de instalación de las unidades y seleccione la opción de reinicio (Reboot).
Actualización Básica del Sistema
Una vez que haya reiniciado el sistema, es necesario ejecutar el comando yum update para asegurarse
de tener los últimos paquetes básicos. Para hacer esto, inicie sesión utilizando el nombre de usuario
root y la contraseña que creó durante la instalación. Una vez iniciada la sesión, ejecute lo siguiente:
# yum update
Is this ok [y/N]: y (Está de acuerdo [s / N]: s)
Cuando se le indique para instalar los paquetes más recientes, presiones “y” y espere a que los
paquetes se actualicen. Si se le pide que acepte una clave GPG, presione “y”. Cuando se haya
completado, reinicie el sistema, ya que es probable que el kernel se haya actualizado.
Si estás ejecutando CentOS a 64 bits, tendrá que eliminar todas las librerías de 32 bits de forma manual.
Una vez que haya reiniciado, o justo antes de reiniciar el sistema, ejecute el comando siguiente:
# yum remove *.i386 -y
Esto eliminará todas las librerías de 32 bits en su sistema de 64 bits, que de otro modo puede causar
conflictos y problemas al compilar Asterisk y otro software.
¡Enhorabuena! Ha instalado y actualizado el sistema CentOS básico con éxito.
Habilitar NTP para sincronizar la hora del sistema
Mantener la hora exacta es esencial en el sistema Asterisk, tanto para el mantenimiento de los registros
de detalles de llamadas precisos y para la sincronización con sus otros programas. Usted no querrá que
las horas de las notificaciones del correo de voz presenten retraso por 10 ó 20 minutos, ya que esto
puede llevar a confusión y pánico de aquellos que pudieran pensar que sus notificaciones de correo de
voz se están tardando demasiado en ser entregada.
El comando ntpd se puede utilizar para asegurarse de que el tiempo en su servidor Asterisk se mantiene
sincronizado con el resto del mundo:
# yum install ntp
...
Is this ok [y/N]: y
Está de acuerdo [s / N]: s
...
# ntpdate pool.ntp.org
# chkconfig ntpd on
# service ntpd start
Los valores por defecto que se envían con CentOS son suficientes para sincronizar la hora y mantener el
tiempo de la máquina en sincronía con el resto del mundo.
Agregando Usuario al Sistema
El proceso de instalación del servidor de Ubuntu le pedirá que añada un usuario del sistema que no sea
root, pero CentOS no hace esto. Para mantener la coherencia en el libro y que sea más seguro, vamos a
agregar otro usuario del sistema y le proporcionaremos acceso sudo. Para agregar un nuevo usuario,
ejecute el comando adduser:
# adduser pbxsystem
# passwd pbxsystem
Changing password for user pbxsystem.
New UNIX password:
Retype new UNIX password:
Ahora tenemos que proporcionar acceso sudo al usuario pbxsystem. Hacemos esto mediante la
modificación del archivo sudoers con el comando visudo. Tendrá que instalar visudo la primera vez que
lo utilice:
# yum install sudo
Con las aplicaciones y los archivos relacionados a sudo instalados, podemos modificar el archivo
sudoers. Ejecute el comando visudo y busque las líneas que se muestran a continuación:
# visudo
## Allows people in group wheel to run all commands
%wheel ALL=(ALL)
ALL
Con la línea %wheel sin comentario como se muestra en nuestro ejemplo, grabe el archivo presionando
la tecla ESC, después escriba :wq y presione Enter. Ahora abra el archivo /etc/group en su editor
favorito (nano es bien fácil de usar) y busque la línea que inicia con la palabra Wheel. Modifique esta
línea como sigue:
wheel:x:10:root,pbxsystem
Grabe el archivo, cierre la sección del usuario root escribiendo exit, y habrá una nueva sección con el
usuario pbxsystem que usted ha creado. Pruebe su acceso sudo ejecutando el siguiente comando:
$ sudo ls /root/
[sudo] password for pbxsystem:
Después de introducir su contraseña, usted debe conseguir la salida del directorio /root/. Si no lo hace,
vuelva atrás y compruebe los pasos para asegurarse de que no salto o escribió nada mal. El resto de las
instrucciones en este capítulo asume que el usuario pbxsystem tiene acceso sudo.
Una última cosa que se necesita hacer, lo que le permitirá introducir comandos sin tener que introducir
la ruta completa. Por defecto sólo root tiene /sbin/ y /usr/sbin/ en el PATH del sistema por defecto,
pero nosotros podemos agregar nuestro usuario pbxsystem también ya que vamos a correr muchas
aplicaciones localizada en estos directorios.
Comience abriendo el archivo oculto .Bash_profile ubicado dentro del directorio home pbxsystem con
un editor. A continuación, vamos a añadir :/usr/sbin :/sbin en el final de la línea que inicia con PATH:
$ vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/sbin:/sbin
Como hicimos anteriormente, guarde el archivo con la tecla ESC y luego escriba :wq y presionar ENTER.
Con el sistema operativo instalado, está listo para instalar las dependencias necesarias para Asterisk. En
la siguiente sección vamos a ver la instalación y preparación de Ubuntu server, por lo que pueden pasar
directamente a la sección.
Servidor Ubuntu
Ubuntu Server es una distribución popular de Linux basada en Debian. También hay una versión popular
de escritorio de este software. El paquete de Ubuntu Server no contiene ninguna GUI y es ideal para
instalaciones de Asterisk. Para obtener la última versión de Ubuntu Server, visite
http://www.ubuntu.com y seleccione la pestaña Servidor en la parte superior de la página. Se le
proporcionará una página que contiene información sobre las ediciones de Ubuntu Server. Al hacer clic
en el botón de Descargar de color naranja en la esquina superior derecha le llevará a una página donde
se puede elegir entre las versión de Ubuntu Server 32-bit o 64 - bit. Después de seleccionar una de las
opciones, puede pulsar el botón de descarga Start.
Una vez que haya descargado el archivo ISO, grábelo en un CD e inicie el proceso de instalación. Si va a
instalar en una máquina virtual (que no se recomienda para uso en producción, pero puede ser una
buena manera de probar Asterisk), usted debería ser capaz de montar el archivo ISO directamente e
instalarlo desde allí.
Instalación Básica del Sistema
Al arrancar desde el CD, se le presentará una pantalla donde puede seleccionar el idioma que prefiera.
Por defecto el inglés es el idioma seleccionado, y después de un período de tiempo de espera, se
selecciona automáticamente. Después de seleccionar el idioma, pulse ENTER.
La siguiente pantalla le dará varias opciones, la primera de las cuales es instalar Ubuntu Server.
Seleccione pulsando ENTER.
A continuación se le pedirá el idioma a utilizar durante la instalación (sí, esto es un poco redundante).
Seleccione el idioma de su elección (por defecto es el Inglés), y pulse ENTER.
Se le presentará una lista de países. Una vez que hayas encontrado tu país y resaltado, pulse ENTER.
A continuación se le preguntará si desea utilizar el detector de teclado. Si sabes qué tipo de teclado
tiene, usted puede seleccionar NO y, a continuación, elegir de una lista de formatos la configuración
adecuada para su teclado.
Si usted está utilizando el detector de teclado, se le pedirá que presione una serie de teclas. Si el
detector no detecta el teclado correctamente (típico cuando se instala en una máquina virtual a través
de una consola remota), puede volver atrás y seleccionar su teclado de una lista de forma manual.
Una vez que hayas elegido el teclado, la instalación continuará tratando de configurar la red de forma
automática. Si todo va bien, se le pedirá que introduzca un nombre de host para su sistema. Puede
elegir cualquier cosa que usted quiere aquí, a menos que su red requiere que su sistema tenga un
nombre de host específico. Introduzca el nombre ahora y presione ENTER.
El instalador intentará contactar con un servidor Network Time Protocol (NTP) para sincronizar su reloj.
Ubuntu entonces intentará detectar automáticamente la zona horaria y le presentará su elección. Si es
correcta, selecciones YES (o Si, de acuerdo al idioma seleccionado en su instalación), de lo contrario,
Seleccione NO y se le presentará una lista de zonas horarias para elegir. Selecciones su zona horaria, o
selecciona de la lista worldwide (mundial) si no se muestra su zona horaria. Una vez que haya elegido la
zona horaria, pulse ENTER para continuar.
El instalador entonces le hará algunas preguntas acerca de crear las particiones para su sistema.
Normalmente, los valores predeterminados son adecuados, que consiste en utilizar el sistema guiado,
que utiliza todo el disco, y para configurar el administrador de volúmenes lógicos (LVM). Presione ENTER
una vez haya hecho su selección. A continuación, se le pedirá la partición para la instalación, lo que
probablemente es la única en el sistema. Presione ENTER para continuar, en este punto se le pedirá que
confirme los cambios en la tabla de partición. Selecciones YES (Si) y presiones ENTER para continuar.
Ahora se le pedirá la cantidad de espacio a utilizar (el valor por defecto será utilizar todo el disco).
Presione ENTER una vez que haya introducido y confirmado la cantidad de espacio que desea utilizar. El
instalador le solicitará entonces una última confirmación antes de realizar los cambios en el disco.
Seleccione YES (Si) para escribir los cambios para el disco. El instalador intentará formatear el disco
duro, escribir el esquema de particiones en el disco, copiar los archivos y llevar a cabo la instalación de
los archivo.
Cuando la instalación se haya completado, se le pedirá que introduzca el nombre completo del nuevo
usuario, el sistema sugiere un nombre de usuario, pero usted es libre de cambiar este nombre a lo que
usted desee.
Después de introducir su nombre de usuario, se le pedirá que proporcione una contraseña y, a
continuación, le pedirá que confirme la contraseña que ha introducido. Ubuntu hace un buen trabajo al
proporcionar un sistema seguro al no facilitar el acceso directo al root, sino mediante la aplicación sudo,
lo que le permite ejecutar comandos como root sin ser el usuario root. Entre un nombre de usuario,
como pbxsystem, y una contraseña segura para continuar. Vamos a usar estos para entrar en el sistema
una vez que finalice el programa de instalación. El instalador le preguntará si desea encriptar el
directorio home. Esto no es necesario y añadirá sobrecarga al CPU.
El resto de las instrucciones de instalación asumen que el usuario pbxsystem fue elegido como el
nombre de usuario.
Si su sistema está debajo de un proxy web, entre la información del proxy ahora. Si no está detrás de un
proxy, o no sabes si lo estás, simplemente presiona ENTER.
A continuación se le preguntará si desea instalar las actualizaciones de forma automática. El valor
predeterminado es “no realizar la actualización automática”, que es lo que se recomienda. Si se
produce un reinicio del sistema, una actualización del kernel hará que Asterisk no inicie hasta que usted
recompilar este. Es una mejor práctica identificar las actualizaciones básicas y llevar a cabo
manualmente de una manera controlada. Selecciones No automatic update (No actualización
automática) y presione ENTER.
Como lleváramos a cabo la instalación de las dependencias necesarias con apt-get, nosotros únicamente
necesitamos seleccionar un paquete durante la instalación: el servidor OpenSSH. SSH es esencial si se
desea conectarse remotamente a su sistema. Sin embargo, si su política local declara que su servidor
debe administrase directamente, es posible que no desee instalar el servidor OpenSSH.
Al presionar la tecla ENTER aceptara la selección actual y se moverá sobre la instalación. Usted
necesita usar la barra espaciadora para activar su selección.
Después de seleccionar servidor OpenSSH, pulse ENTER.
Si este es el único sistema operativo en la máquina (que es probable), Ubuntu le dará la opción de
instalar el cargador de arranque GRUB en el sistema. Este mensaje es provisto con el fin de darle la
opción de omitir la instalación de GRUB, ya que este modifica el master boot record (MBR) en el
sistema. Si hay otro sistema operativo este fallara para detectar la información de carga en el MBR, es
bueno poder omitir la modificación del MBR. Si es el único sistema operativo instalado en el servidor,
seleccione YES (Sí).
Cuando el sistema haya terminado la instalación, se le pedirá que quite cualquier medio de instalación
de la unidad de CD/DVD para reiniciar el sistema, seleccione Continuar, y en ese momento la instalación
se completará y el sistema se reiniciará.
Actualización Básica del Sistema
Ahora que hemos completado la instalación de Ubuntu Server, es necesario realizar una actualización
del sistema con apt-get para asegurarnos de tener los últimos paquetes instalados. Se le presentará una
pantalla de registro (login) donde puedes iniciar sesión con el nombre de usuario y la contraseña que
creó en la instalación (por ejemplo, pbxsystem). Una vez iniciada la sesión, ejecute el siguiente
comando:
$ sudo apt-get update
[sudo] password for pbxsystem: ;aquí debe poner la contraseña con la que acaba de iniciar sección.
....
Reading package lists... Done
$ sudo apt-get upgrade
Reading state information... Done
...
Do you want to continue [Y/n]? y
Pulse ENTER cuando se le pida para continuar, en este punto los últimos paquetes de actualización serán
instalado. Cuando se haya completado, reinicie el sistema para que los cambios surtan efecto ya que el
kernel probablemente se ha actualizado.
$ sudo reboot
¡Enhorabuena! Usted ha instalado satisfactoriamente y actualizado el sistema básico Ubuntu Server.
Habilitar NTP para sincronizar el tiempo exacto del sistema
Mantener la hora exacta es esencial en el sistema Asterisk, tanto para el mantenimiento de los registros
de detalles de llamadas precisos y para la sincronización con sus otros programas. Usted no querrá que
las horas de las notificaciones del correo de voz presenten retraso por 10 ó 20 minutos, ya que esto
puede llevar a confusión y pánico de aquellos que pudieran pensar que sus notificaciones de correo de
voz se están tardando demasiado en ser entregada.
$ sudo apt-get install ntp
El valor por defecto en Ubuntu es ejecutar un servidor de sincronización de tiempo sin tener que
cambiar la hora en su propia máquina. Esto no funcionará para nuestras necesidades, por lo que
tendremos que cambiar el archivo de configuración ligeramente. Debido a esto, tenemos que guiarlo a
través del uso de un editor de línea de comandos. El editor nano ya está instalado sobre su máquina
Ubuntu y es muy fácil de usar.
$ sudo nano /etc/ntp.conf
Utiliza las teclas de flecha para moverte a la sección que se parece a:
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
Agregue dos nuevas líneas al final de esta sección, para que ntpd pueda sincronizar el tiempo con el
mundo exterior, de manera que la sección anterior ahora debe ser similar a esta:
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict -4 127.0.0.1
restrict -6 ::1
Eso es todo lo que necesitamos cambiar, salga del editor por presionar Ctrl + X. Cuando se le pregunte si
desea guardar las modificaciones, pulse Y; adicionalmente nano le preguntara por el nombre del
archivo. Simplemente presiones ENTER para confirma el nombre por defecto /etc/ntp.conf.
Ahora reinicie el daemon de NTP:
$ sudo /etc/init.d/ntp restart
Con el sistema operativo instalado, está listo para instalar las dependencias necesarias para Asterisk.
Software Dependencias
La primera cosa que hay que hacer una vez que haya completado la instalación de su sistema operativo
es instalar las dependencias de software requeridas por Asterisk. Los comandos listados en la tabla
siguiente han sido divididos en dos columnas, para Ubuntu Server y para CentoOS Server. Estos
paquetes le permitirán construir un sistema Asterisk básico, junto con DAHDI y Libpri. No todos los
módulos estarán disponibles en tiempo de compilación con estas dependencias, sólo los módulos más
utilizados estarán disponibles. Si se requieren dependencias adicionales para otros módulos usados más
adelante en el libro, las instrucciones serán proporcionadas según sea necesario.
Tenga en cuenta que la información de la dependencia de CentOS 64 bits no toma en cuenta que las
librerías de 32 bits no se deben instalar. Si estas librerías son instaladas, va a terminar con paquetes
adicionales que utilizan el espacio en disco y puede provocar conflictos si el sistema intenta compilar
otra vez una biblioteca de 32 bits en lugar de su equivalente de 64 bits.
Para resolver este problema, agregue .X86_64 al final de cada nombre de paquete cuando lo instale. Así,
por ejemplo, en lugar de ejecutar yum install ncurses-devel, ejecute yum install ncurses-devel.x86_64.
Esto no es necesario en una plataforma de 32 bits.
Dependencia de software para Asterisk sobre Ubuntu Server y CentOS Server
Ubuntu
sudo apt-get install build-essential subversion \
libncurses5-dev libssl-dev libxml2-dev libsqlite3dev \ uuid-dev vim-nox
CentOS
sudo yum install gcc gcc-c++ make wget \
subversion libxml2-devel ncurses-devel \
openssl-devel vim-enhanced
Note que en Asterisk 11 debemos instalar SQLite3 y las dependencias necesarias para el módulo
res_rtp_asterisk.so. Ejecute los siguientes comandos:
yum install -y sqlite-devel
yum install uuid uuid-devel libuuid libuuid-devel uuid-c++
Estos paquetes le darán más de lo que necesita para empezar con la instalación Asterisk, DAHDI, y
LibPRI. Tenga en cuenta que también se requieren las dependencias de software para cada paquete que
indiquemos como necesario para ser instalado. Esto se resuelve automáticamente cuando utiliza yum o
apt-get.
También hemos incluido las librerías de desarrollo de OpenSSL, que no son estrictamente necesarias
para compilar Asterisk, pero es bueno tenerlas: permiten el soporte de clave y otras funciones de
encriptación.
Hemos instalado vim como nuestro editor, pero puedes elegir el que quieras, como nano, joe o emacs.
Asterisk contiene un script que instalará las dependencias de todas las entidades de Asterisk. En este
momento se completa para Ubuntu, pero no enumera todos los paquetes necesarios para CentOS. Una
vez que haya descargado Asterisk siguiendo las instrucciones de la sección “DESCARGANDO LO QUE
USTED NECESITA” en la página 62, utilice los siguientes comandos si desea ejecutar el script:
$ cd ~/src/asterisk-complete/asterisk/11
; remplace el 11 por la versión de su Asterisk.
$ sudo ./contrib/scripts/install_prereq install
$ sudo ./contrib/scripts/install_prereq install-unpackaged
Descargando lo que Usted Necesita
Hay varios métodos para obtener Asterisk: a través del repositorio de código Subversión, a través de
wget desde el sitio de descargas, o por medio de un sistema de administración de paquetes como aptget o yum. Nosotros sólo vamos a cubrir los dos primeros métodos, ya que lo que nos interesa es la
construcción de la última versión de Asterisk desde el código fuente. Normalmente, los sistemas de
gestión de paquetes tendrán las versiones más antiguas que las disponibles en el sitio de Subversión o
descargas, y queremos asegurarnos de que tenemos los paquetes más recientes disponibles, por lo que
nosotros tendemos a evitar los sistemas de administración de paquetes.
Antes de empezar a obtener los archivos fuentes, vamos a crear una estructura de directorios para
guardar los códigos descargados. Vamos a crear la estructura de directorios dentro del directorio home
del usuario pbxsystem en el sistema. Una vez que todo este hecho, usaremos el comando sudo para la
instalación. A continuación, volvemos atrás y cambiamos los permisos y la propiedad de los archivos
instalados con el fin de construir un sistema seguro. Para comenzar, ejecute el comando siguiente:
$ mkdir -p ~/src/asterisk-complete/asterisk
Ahora que hemos creado una estructura de directorios para todo en el mismo sitio, vayamos a descargar
el código fuente. Elija uno de los dos métodos siguientes para obtener sus archivos:
1. Subversion
2. wget
Obteniendo los Fuentes vía Subversión
Subversión es un sistema de control de versiones que se utiliza por los desarrolladores para rastrear
cambios en el código durante un periodo de tiempo. Cada vez que el código se modifica, en primer lugar
se debe comprobar fuera del repositorio, entonces debe ser revisado de nuevo, momento en el cual se
registran los cambios. Por lo tanto, si un cambio crea una regresión, los desarrolladores pueden volver a
ese cambio y quitarlo si fuera necesario. Este es un sistema potente y robusto para el trabajo de
desarrollo. También pasa a ser útil para los administradores de Asterisk que buscan recuperar el
software. Para descargar el código fuente de la última versión de Asterisk 11, utilice los siguientes
comandos:
$ cd ~/src/asterisk-complete/asterisk
$ svn co http://svn.asterisk.org/svn/asterisk/branches/11
O también puede chequear una versión específica desde Subversión:
$ svn co http://svn.asterisk.org/svn/asterisk/tags/11.3.0
Obteniendo los Fuente a través de wget
Para obtener las últimas versiones publicadas de DAHDI, Libpri y Asterisk usando la aplicación wget,
digite los siguientes comandos:
$ cd ~/src/asterisk-complete/asterisk
$ wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
$ tar zxvf asterisk-1.8-current.tar.gz
El siguiente paso es compilar e instalar el software, lo que haremos partir a de la siguiente sección.
Cómo instalarlo
Con los archivos de los códigos fuente descargado puede compilar el software e instalarlo. El orden de
instalación en versiones anteriores a Asterisk 11 es:
1. LibPRI
2. DAHDI
3. Asterisk
Tenga en cuenta que en la versión de Asterisk 11 el orden de instalación requiere instalar DAHDI
primero. Es como sigue:
1. DAHDI
2. LibPRI
3. Asterisk
La instalación en este orden asegura que todas las dependencias de DAHDI y Asterisk se instalen antes
de ejecutar los scripts de configuración, que posteriormente asegura que todos los módulos que
dependen de Libpri o DAHDI se construirán.
Por lo tanto, vamos a empezar.
DAHDI
El Digium Asterisk Hardware Device Interface, o DAHDI (formalmente conocido como Zaptel), es el
software que Asterisk utiliza para interactuar con el hardware de telefonía. Le recomendamos que lo
instale incluso si usted no tiene hardware instalado, porque DAHDI es una dependencia necesaria para
la construcción del módulo del tiempo res_timing_dahdi y se utiliza para aplicaciones de dialplan de
Asterisk como MeetMe().
DAHDI Tools y DAHDI Linux
DAHDI es en realidad una combinación de dos códigos base separados: DAHDI-tools, que proporciona
diversas herramientas de administración tales como dahdi_cfg, dahdi_scan, etc, y DAHDIlinux, que
proporciona los drivers del kernel. A menos que usted sólo este actualizando uno de los dos, se van a instalar
los dos al mismo tiempo, lo que se conoce como DAHDI-linux-complete. La numeración de versión para
DAHDI-linux-complete luce algo como 2.7.0.1 +2.7.0.1, donde el número a la izquierda del signo más es la
versión de DAHDIlinux, y el número de versión a la derecha del signo más es la versión de DAHDItools.
Hay otra dependencia requerida para la instalación de DAHDI, y son los fuentes del kernel. Es
importante que la versión del kernel que se está ejecutando coincida exactamente con la versión del
kernel que está siendo instalado. Puede usar uname -a para verificar la versión del kernel actualmente
en ejecución:
•
CentOS: sudo yum install kernel-devel-`uname -r`
•
Ubuntu: sudo apt-get install linux-headers-`uname -r`
El uso de uname-r encerrado en comillas invertidas (`) es para rellenar la versión del kernel actualmente
en ejecución de manera que se instale el paquete adecuado.
Los comandos siguientes muestran cómo instalar DAHDI-linux-complete 2.7.0.1 +2.7.0.1. Es posible que
haya una nueva versión disponible en el momento en que usted está leyendo esto, a fin de comprobar
primero chequee downloads.asterisk.org. Si hay una nueva versión disponible, cambie el número de
versión de los comandos:
$ cd ~/src/asterisk-complete/
$ mkdir dahdi
$ cd dahdi/
$ svn co http://svn.asterisk.org/svn/dahdi/linux-complete/tags/2.7.0.1+2.7.0.1
$ cd 2.7.0.1+2.7.0.1
$ make
$ sudo make install
$ sudo make config
Usted debe tener acceso a Internet cuando se ejecuta el comando make, ya que este intentará
descargar el firmware más reciente del hardware desde los servidores de Digium.
También puede descargar el código fuente a través de:
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/.
LibPRI
Libpri es una librería que añade soporte para ISDN (PRI y BRI). El uso de Libpri es opcional, pero ya que
toma muy poco tiempo para instalar, no interfiere con nada, y será muy útil si alguna vez desea agregar
tarjetas a un sistema en un momento posterior, le recomendamos que lo instale ahora.
Echa un vistazo a la última versión de Libpri y compílelo como tal:
$ cd ~/src/asterisk-complete/
$ mkdir libpri
$ cd libpri/
$ svn co http://svn.asterisk.org/svn/libpri/tags/1.4.14 <su número de versión>
$ cd 1.4.14 <su número de versión>
$ make
$ sudo make install
También puede descargar el código fuente a través de :
wget http://downloads.asterisk.org /pub/Telefonía/libpri /.
Asterisk
Con DAHDI y LibPRI ya instalado, ahora podemos instalar Asterisk.
$ cd ~/src/asterisk-complete/asterisk/11
$ ./configure
$ make
$ sudo make install
$ sudo make config
Si está ejecutando Red Hat Enterprise Linux de 64 bits, ejecute el script configure con la opción libdir:
$ ./configure --libdir=/usr/lib64
Con los archivos ya instalados en sus ubicaciones predeterminadas, tenemos que modificar los permisos
de los directorios y sus contenidos.
Hay un paso adicional que no es estrictamente necesario, pero es muy común (y posiblemente
importante): el comando make menuselect, que proporciona una interfaz gráfica que permite la
selección detallada de cuales módulos y características serán compilados. Discutiremos make
menuselect en una sección posterior.
Configurando los permisos de archivos
Para poder ejecutar el sistema de forma más segura, instalaremos Asterisk y luego ejecutaremos como
el usuario pbxsystem. Después de instalar los archivos en sus ubicaciones predeterminadas, tenemos
que cambiar los permisos de archivo para que coincida con los del usuario que vamos a estar corriendo
asterisk. Ejecute los siguientes comandos:
$ sudo chown -R pbxsystem:pbxsystem
$ sudo chown -R pbxsystem:pbxsystem
$ sudo chown -R pbxsystem:pbxsystem
$ sudo chown -R pbxsystem:pbxsystem
$ sudo chown -R pbxsystem:pbxsystem
/usr/lib/asterisk/
/var/lib/asterisk/
/var/spool/asterisk/
/var/log/asterisk/
/var/run/asterisk
$ sudo chown -R pbxsystem:pbxsystem /usr/sbin/asterisk
Para utilizar MeetMe() y DAHDI con Asterisk como usuario sin privilegios root, debe cambiar el archivo
/etc/udev/rules.d/dahdi.rules de manera que los campos OWNER y GROUP coincidan con el usuario
no root que se ejecutara Asterisk. En este caso, estamos utilizando el usuario pbxsystem.
Cambie la última línea del archivo dahdi.rules a lo siguiente:
SUBSYSTEM=="dahdi", OWNER="pbxsystem", GROUP="pbxsystem", MODE="0660"
Con eso fuera del camino, podemos pasar a realizar la configuración básica que se debe hacer después
de todas las instalaciones.
Configuración Básica
Ahora que tenemos Asterisk instalado, podemos conseguir que nuestro sistema se ejecute
correctamente. El objetivo aquí es conseguir que Asterisk cargue y esté listo para andar, ya que no está
haciendo nada útil todavía. Estos son los pasos que todos los administradores del sistema tendrán que
realizar a la hora de instalar un nuevo sistema. Si los comandos que se deben ejecutar difieren en
CentOS y Ubuntu, verá una tabla con filas etiquetadas para cada distribución; de lo contrario, verá un
solo comando que debe ejecutarse independientemente de la distribución de Linux que ha elegido.
Deshabilitando SELinux
Esta sección aplica sólo a los usuarios de CentOS, así que si estás usando Ubuntu, puede pasar a la
siguiente sección.
En CentOS, el sistema Security-Enhanced Linux (SELinux) está activado por defecto, y a menudo se
interpone en el camino de Asterisk. A veces los problemas son muy sutiles, y nos pasamos un buen
número de horas tratando depurar problema en Asterisk que luego resultó ser resueltos mediante la
desactivación de SELinux.
Mientras deshabilitar SELinux no es la situación ideal, la configuración de SELinux está más allá del
alcance de este libro.
Para desactivar temporalmente SELinux, tal vez con el fin de verificar si un problema que está teniendo
es causado por SELinux, ejecute el comando siguiente como root:
$ sudo echo 0 > /selinux/enforce
Puede volver a activar SELinux haciendo lo mismo, pero sustituyendo el 0 con un 1:
$ sudo echo 1 > /selinux/enforce
Para desactivar SELinux de forma permanente, modifique el archivo /etc /selinux /config:
$ cd /etc/selinux/
$ sudo vim config
Cambie la opción SELINUX de enforcing a disabled.
Como alternativa, puede cambiar el valor de enforcing a permissive, que simplemente registra los
errores en lugar de hacer cumplir la política.
Como no se puede desactivar SELinux sin reiniciar, tendrás que hacerlo ahora:
$ sudo reboot
Configuración Inicial
Con el fin de obtener que Asterisk corra y funcione limpiamente, necesitamos crear algunos archivos de
configuración. Podríamos instalar potencialmente los archivos de ejemplo que vienen con Asterisk
(ejecutando el comando make samples desde los fuente de Asterisk) y modificar los archivos para
satisfacer nuestras necesidades, pero el comando make samples instala muchos archivos de ejemplo, la
mayoría de módulos que nunca usará. Queremos limitar los módulos que estamos cargando, y también
creemos que es más fácil de entender la configuración Asterisk si crea los archivos de configuración
desde cero, así que vamos a crear nuestro propio conjunto mínimo de archivos de configuración.
Lo primero que tenemos que hacer (suponiendo que no existe ya) es crear el directorio /etc /asterisk/
en el cual residirán nuestros archivos de configuración:
$ sudo mkdir /etc/asterisk/
$ sudo chown pbxsystem:pbxsystem /etc/asterisk/
Ahora vamos a pasar a través de todos los archivos que se requieren para conseguir un sistema Asterisk
sencillo y en funcionamiento.
indications.conf y asterisk.conf
El primer archivo que se necesita es el indications.conf, un archivo que contiene información sobre la
forma de detectar los diferentes tonos de telefonía para los diferentes países. Hay un archivo de
ejemplo en lo fuente de Asterisk que perfectamente podemos usar, así que vamos a copiarlo en nuestro
directorio /etc /asterisk /:
$ cp ~/src/asterisk-complete/asterisk/11/configs/indications.conf.sample \
/etc/asterisk/indications.conf
Porque estamos corriendo Asterisk con un usuario sin privilegios root, hay que decirle a Asterisk con que
usuario se va a ejecutar. Esto se hace en el asterisk.conf. Podemos copiar la versión de ejemplo desde
los fuente de Asterisk para /etc /asterisk:
$ cp ~/src/asterisk-complete/asterisk/11/configs/asterisk.conf.sample \
/etc/asterisk/asterisk.conf
El archivo asterisk.conf contiene muchas opciones que no vamos a ver ahora (que se trataran más
adelante en "asterisk.conf”), pero sí, es necesario hacer algunos ajuste. Casi al final de la sección
[Opciones], hay dos opciones que tenemos que habilitar: runuser y rungroup.
Abra el archivo asterisk.conf con un editor como nano o vim: Descomente las líneas runuser y rungroup
y modifique esta para que cada una contenga como valor asignado pbxsystem. Abra el archivo
/etc/asterisk/asterisk.conf con vim:
$ vim /etc/asterisk/asterisk.conf
A continuación, modifique el archivo eliminando el comentario de las dos líneas que comienzan con
runuser y rungroup luego cambie el valor para pbxsystem.
runuser=pbxsystem
rungroup=pbxsystem
Ahora tenemos todos los archivos de configuración necesarios para iniciar una versión de Asterisk
mínima. A continuación, iniciaremos Asterisk en primer plano (foreground):
$ /usr/sbin/asterisk -cvvv
Asterisk se iniciará con éxito sin ningún error o alarma (aunque sí hay alarma es que algunos archivos
puedan estar dañados), y le presentara la interfaz de línea de comandos de Asterisk (CLI). En este
momento no hay módulos, el core esta en funcionalidad mínima, y no hay módulos de canales con los
cuales comunicarse, pero Asterisk ya está en marcha y funcionando.
La ejecución del comando module show en el CLI de Asterisk muestra que no hay módulos externos
cargados:
*CLI> module show
Module
0 modules loaded
Description
Use Count
Hemos hecho esto simplemente para demostrar que Asterisk se puede ejecutar en un estado muy
mínimo, y no requiere de las decenas de módulos que una instalación por defecto habilitará. Permítame
parar Asterisk con el comando core stop now desde CLI:
*CLI> core stop now
Comandos del Shell de Asterisk
Asterisk se puede ejecutar como un daemon o como una aplicación. En general, usted tendrá que
ejecutarlo como una aplicación cuando se está construyendo, probando y en resolución de problemas, y
como un daemon cuando se pone en producción.
El comando para iniciar Asterisk es el mismo independientemente de si se está ejecutando como
daemon o una aplicación:
asterisk
Sin embargo, sin ningún argumento, el comando asumirá ciertas opciones por defectos e iniciará
Asterisk como una aplicación en el background. En otras palabras, usted no querrá correr el comando
asterisk por sí mismo, sino que tendrá que pasar algunas opciones para definir mejor el comportamiento
que busca. La siguiente lista contiene algunos ejemplos de usos comunes.
-h
Este comando muestra una lista útil de las opciones que puede utilizar.
-c
Esta opción inicia Asterisk como una aplicación (en primer plano). Esto significa que Asterisk está
ligado a la sesión de usuario.
-v, -vv, -vvv, -vvvv, etc.
Esta opción se puede utilizar con otras opciones (por ejemplo,-cvvv) con el fin de aumentar el nivel de
detalle de la salida de la consola. Hace exactamente lo mismo que si ejecuta el comando core set
verbose n en el CLI, donde n es cualquier número entero entre 0 y 5.
-d, -dd, -ddd, -dddd, etc.
Esta opción se puede utilizar de la misma manera como -v, pero en lugar de la salida normal, esta
especificará el nivel depuración de la salida (que es principalmente útil para los desarrolladores que
desean solucionar los problemas con el código). Usted también tendrá que activar la salida de
información de depuración en el archivo logger.conf.
-r
Este comando es esencial si se quiere conectar al CLI de un proceso de Asterisk que se ejecuta como
un demonio. Esta opción sólo funciona si tiene una instancia demonizada de Asterisk que ya se está
ejecutando. Para salir de la CLI cuando esta opción está siendo usada, el escriba exit en el CLI.
-T
Esta opción añadirá fecha y hora a la salida de CLI.
-x
Este comando le permite pasar una cadena a Asterisk que se ejecutará como si se hubiera escrito en
el CLI. A modo de ejemplo, para obtener una lista rápida de todos los canales en uso sin tener que iniciar
la consola de Asterisk, simplemente escriba asterisk -rx 'core show channels’ "desde el shell, y obtendrá
los resultados que está buscando.
-g
Esta opción le indica a Asterisk tumbar un archivo del core si este se ha bloquea.
Le recomendamos que pruebe algunas combinaciones de estos comandos para ver lo que hacen.
modules.conf
Mientras tanto, nos las hemos arreglado para conseguir que Asterisk corra, pero todavía no es capaz de
hacer algo útil. Para decirle a Asterisk qué módulos esperamos que se carguen, necesitaremos un
archivo modules.conf. Cree el archivo modules.conf en su directorio /etc/asterisk con el comando
siguiente (sustituya el >> por > si lo quieres es sobrescribir un archivo existente)
$ cat >> /etc/asterisk/modules.conf
Escriba (o pegue) las líneas siguientes y presione Ctrl + D cuando haya terminado:
; El archivo modules.conf, es usado para definir cuales módulos Asterisk puede cargar (o no
; puede cargar).
;
[modules]
autoload=yes
La línea autoload=yes le dice a Asterisk para cargar automáticamente todos los módulos localizado en el
directorio /usr/lib/Asterisk/modules. Si quieres, puedes dejar el archivo tal como está, y Asterisk sólo
tendría que cargar todos los módulos que se encuentran en la carpeta de módulos. Con el nuevo archivo
modules.conf en su lugar, al iniciar Asterisk una gran cantidad de módulos serán cargados. Usted puede
verificar esto al iniciar Asterisk y ejecutando el comando module show:
$ asterisk -c
*CLI> module show
Module
res_musiconhold.so
res_smdi.so
……
cel_sqlite3_custom.so
157 modules load
Description
Use Count
Music on Hold Resource
0
Simplified Message Desk Interface (SMDI) 0
SQLite3 Custom CEL Module
0
Ahora tenemos muchos módulos cargados, y muchas aplicaciones del dialplan adicionales y funciones
de las que disponemos. No necesitamos todos estos recursos cargados, sin embargo, vamos a filtrar
algunos de los módulos que no necesitamos en este momento. Modifique su archivo modules.conf para
que contenga las siguientes líneas, las cuales le dirán a Asterisk que obvie la carga de los módulos
identificado:
; Módulos de recursos
noload => res_speech.so
noload => res_phoneprov.so
noload => res_ael_share.so
noload => res_clialiases.so
noload => res_adsi.so
; Módulos PBX
noload => pbx_ael.so
noload => pbx_dundi.so
; Módulos de Canales
noload => chan_oss.so
noload => chan_mgcp.so
noload => chan_skinny.so
noload => chan_phone.so
noload => chan_agent.so
noload => chan_unistim.so
noload => chan_alsa.so
; Módulos de Aplicaciones
noload => app_nbscat.so
noload => app_amd.so
noload => app_minivm.so
noload => app_zapateller.so
noload => app_ices.so
noload => app_sendtext.so
noload => app_speech_utils.so
noload => app_mp3.so
noload => app_flash.so
noload => app_getcpeid.so
noload => app_setcallerid.so
noload => app_adsiprog.so
noload => app_forkcdr.so
noload => app_sms.so
noload => app_morsecode.so
noload => app_followme.so
noload => app_url.so
noload => app_alarmreceiver.so
noload => app_disa.so
noload => app_dahdiras.so
noload => app_senddtmf.so
noload => app_sayunixtime.so
noload => app_test.so
noload => app_externalivr.so
noload => app_image.so
noload => app_dictate.so
noload => app_festival.so
Hay, por supuesto, otros módulos que se pueden quitar, y otros que pueden resultar sumamente útiles,
así que no dude en modificar este archivo como desee. Idealmente, usted debe cargar sólo los módulos
que usted necesita en el sistema que se está ejecutando. Los ejemplos de este libro asumen que su
archivo modules.conf se parece a nuestro ejemplo.
musiconhold.conf
El archivo musiconhold.conf define las clases de música en espera en el sistema Asterisk. Mediante la
definición de las distintas clases, es posible especificar distinta música de espera para ser utilizada en
diversas situaciones, como por ejemplo los diferentes anuncios que se reproducirán mientras estamos
en una cola, o diferente música de espera si tiene varias centralitas alojadas en el mismo sistema. Por el
momento, sólo tendremos que crear una clase de música de espera por defecto para que podamos
tener, como mínimo, alguna música de espera cuando las personas que llaman son puestas en espera
(hold):
$ cd /etc/asterisk/
$ cat >> musiconhold.conf
; musiconhold.conf
[default]
mode=files
directory=moh
Ctrl + D
Hemos creado un archivo musiconhold.conf y definimos nuestra clase de música de espera [default].
También estamos suponiendo que instaló la música de espera del sistema menuselect, por defecto allí
hay un paquete de música de espera instalada, usted debe tener música por lo menos en algún formato.
make menuselect
menuselect es un sistema de menú basado en texto en Asterisk que se utiliza para configurar los
módulos para compilar e instalar. Los módulos son los que dan Asterisk su potencia y funcionalidad.
Constantemente se están creando nuevos módulos.
En las secciones de instalación, convenientemente nosotros saltamos el uso del sistema menuselect
para mantener las instrucciones simples y directas. Sin embargo, es tan importante que le hemos dado a
menuselect su propia sección.
Además de especificar cuáles módulos instalar, menuselect también le permite establecer indicadores
que pueden ayudar en problemas de depuración, establecer parámetros de optimización, elegir
diferentes archivos de mensaje de audios y formatos, y hacer otras varias cosas ingeniosas.
Usando menuselect
Necesitaríamos todo un capítulo con el fin de explorar a fondo menuselect, y en su mayor parte no será
necesario hacer muchos cambios al mismo. Sin embargo, el ejemplo siguiente le dará una idea de cómo
funciona menuselect, y es recomendado en cualquier instalación.
Por defecto Asterisk sólo instala los archivos core sound prompt, y únicamente en formato GSM.
También, los tres archivos de música en espera Opsound están disponibles para descarga sólo en
formato .wav.
Nosotros vamos a querer promts de sonido extra en lugar de sólo los core sound promts
predeterminados del sistema, y en un formato de audio mejor que el GSM. Podemos hacer esto con el
sistema menuselect ejecutando el comando make menuselect en el directorio de los fuentes de
Asterisk. Antes de explorar esto, vamos a hablar de las diferentes interfaces de menuselect.
Interfaces menuselect
Hay dos interfaces disponibles para menuselect: curses y newt. Si las librerías libnewt están instaladas,
obtendrá la interfaz azul y rojo como se muestra en la imagen siguiente. De lo contrario, por defecto
menuselect usa la interfaces curses (negro y blanco).
El tamaño mínimo de la pantalla para la interfaz curses es 80x27, lo que significa que menuselect no
podrá cargar si está usando el tamaño de terminal por defecto para una instalación simple de la
distribución. Esto no es un problema cuando se utiliza SSH para acceder al servidor de forma
remota, ya que normalmente su terminal puede cambiar el tamaño, pero si usted está trabajando en
el terminal directamente puede que tenga que tener buffers de pantalla instalados para permitir una
mayor resolución, más no se recomienda para un sistema Asterisk en funcionamiento. La solución es
utilizar el sistema menuselect basado newt.
Interfaz newt de menuselect
Interfaz curses de menúselect
Instalando las dependencias para menuselect basado newt
Para conseguir que menuselect basado newt trabaje, es necesario tener las librerías de desarrollo
libnewt instaladas:
•
CentOS: sudo yum install newt-devel
•
Ubuntu: sudo apt-get install libnewt-dev
Si ha utilizado previamente menuselect con la interfaz curses, es necesario volver a reconstruir. Usted
puede hacer esto con los siguientes comandos:
$ cd ~/src/asterisk-complete/asterisk/11<su versión de Asterisk>/
$ cd menuselect
$ make clean
$ ./configure
$ cd ..
$ make menuselect
Después de esto usted debe tener la interfaz de menuselect basado newt a su disposición.
Iniciando menuselect
Corra los siguientes comandos para iniciar menuselect:
$ cd ~/src/asterisk-complete/asterisk/11.<su version de asterisk>/
$ make menuselect
Se le presentará una pantalla azul y rojo como la mostrada en la sección anterior. Puede utilizar las
teclas de flecha del teclado para moverse hacia arriba y hacia abajo. La tecla de flecha derecha le llevará
a un submenú, y la tecla de flecha hacia la izquierda le llevará atrás. Usted puede utilizar la barra
espaciadora o la tecla ENTER para seleccionar y anular la selección de módulos. Al pulsar la tecla q se
cerrará sin guardar, mientras que la tecla x guarda las selecciones y luego sale.
Dependencias de Módulos
Los módulos que tienen XXX en frente son módulos que no pueden ser compilados por que el script de
configuración no fue capaz de encontrar las dependencias necesarias (por ejemplo, si usted no tiene el
paquete de desarrollo unixODBC instalado, usted no será capaz de compilar func_odbc). Siempre que
instale una dependencia, siempre se tendrá que volver a ejecutar /configure antes de ejecutar
menuselect, para que la nueva dependencia sea apropiadamente localizada. El módulo dependiente en
ese momento estará disponible en menuselect. Si el módulos seleccionado contiene todavía XXX, o bien
el script de configuración aún no puede encontrar la dependencia o no todas las dependencias han sido
instaladas.
Una vez que haya iniciado menuselect, desplácese hacia abajo para Core Sound Packages y pulse la tecla
de flecha derecha (o ENTER) para abrir el menú. Se le presentará una lista de opciones disponibles. Estas
opciones representan los archivos de sonido básicos en varios idiomas y formatos. Por defecto, el único
conjunto de archivos seleccionados es CORE-SOUNDS-EN-GSM, que es el core sound package en idioma
Inglés y en formato GSM.
Seleccione CORE-SOUNDS-EN-WAV y CORE-SOUNDS-EN-ULAW (o ALAW si estás fuera de América del
Norte o Japón), y cualquier otro archivo de sonido que pueden ser aplicables en su red.
La razón por la que tenemos varios formatos para los mismos archivos es que Asterisk puede
reproducir el formato adecuado en función del codec que es negociado por un dispositivo final. Esto
puede reducir la carga del CPU significativamente en un sistema.
Después de seleccionar los archivos de sonido adecuados, pulse la tecla de flecha izquierda para volver
al menú principal. A continuación, desplácese hacia abajo dos líneas al menú Extra Sound Packages y
presione la tecla de flecha derecha (o Enter). Usted se dará cuenta que por defecto no hay paquetes
seleccionados. Al igual que con los archivos core sound, seleccione el idioma y el formato adecuado para
ser instalado. Una buena opción es, probablemente, para instalar los archivos de sonido en inglés en
WAV, ULAW,y todos los formatos ALAW.
Una vez que haya completado la selección de los archivos de sonido, pulse la tecla x para guardar y salir
de menuselect. A continuación, deberá instalar los nuevos promts descargándolos del sitio de descargas
de Asterisk. Esto se hace simplemente ejecutando el comando make install de nuevo:
$ sudo make install
$ sudo chown -R pbxsystem:pbxsystem /var/lib/asterisk/sounds/
Los archivos se descargan, se extraen, y se instalan en la ubicación adecuada (por defecto /var
lib/asterisk/sounds/<idioma>/). Su servidor Asterisk necesita tener una conexión a Internet con el fin
de recuperar los archivos.
Scripting menuselect
Los administradores suelen construir herramientas al realizar instalaciones en varias máquinas, y
Asterisk no es una excepción. Si usted tiene que instalar Asterisk en varias máquinas, puede que desee
crear un conjunto de scripts para automatizar este proceso. El sistema menuselect contiene opciones de
línea de comandos que puede utilizar para activar o desactivar los módulos que se construyen e instalan
por Asterisk. Si usted está iniciando con una instalación reciente de Asterisk, primero debe ejecutar el
script de configuración para determinar cuáles dependencias están instaladas en el sistema.
$ cd ~/src/asterisk-complete/asterisk/11.<su version de asterisk>/
$ ./configure
$ cd menuselect
$ make menuselect
$ cd ..
$ make menuselect-tree
Generating input for menuselect ...
Para más detalles sobre las opciones disponibles, ejecute el comando menuselect/menuselect –help
desde el directorio fuente de Asterisk. Devolverá una salida como esta:
Usage: menuselect/menuselect [--enable <option>] [--disable <option>]
[--enable-category <category>] [--enable-all]
[--disable-category <category>] [--disable-all] [...]
[<config-file> [...]]
Usage: menuselect/menuselect { --check-deps | --list-options
| --list-category <category> | --category-list | --help }
[<config-file> [...]]
Las opciones desplegada, pueden ser usadas para controlar cuales módulos son instalado a través de la
aplicación menuselect.
Por ejemplo, si desea desactivar todos los módulos e instalar un sistema base (lo que no sería de mucha
utilidad), puede utilizar el comando:
$ menuselect/menuselect --disable-all menuselect.makeopts
Si después usted busca en el archivo menuselect.makeopts, podrás ver una gran cantidad de texto que
muestra todos los módulos y categorías que se han deshabilitado. Digamos que ahora desea habilitar el
canal SIP y la aplicación Dial(). La Habilitación de estos módulos se puede hacer con el comando
siguiente, pero antes de hacerlo observe en el menuselect.maleopts actual (después de deshabilitar
todos los módulos) y localice app_dial en la categoría LECT_APPS y chan_sip en la categoría
MENUSELECT_CHANNELS. Después ejecute los siguientes comandos, y observe el archivo
menuselect.makeopts otra vez, veraz que estos módulos no son más listado:
$ menuselect/menuselect --disable-all --enable chan_sip \ --enable app_dial menuselect.makeopts
A continuación, puede crear el archivo menuselect.makeopts en la forma que desee, utilizando los otros
comandos, lo que permitirá que usted construya secuencias de comandos de instalación personalizada
para su sistema utilizando cualquier scriptings de programación que prefiera.
Actualizando Asterisk
Sí esta es su primer instalación, puede saltar a la sección “Configuración inicial en la página 82”. Si está
en el proceso de actualizar su sistema, sin embargo, hay un par de cosas que debe tener en cuenta.
Cuando hablamos de actualización del sistema, nos estamos refiriendo a algo muy diferente de
upgrading su sistema. Actualización del sistema es el proceso de instalación de nuevas versiones
menores de la misma rama. Por ejemplo, si su sistema está corriendo Asterisk 1.8.2 y hay que
actualizar a la última versión para corregir errores para la rama 1.8, que fue versión 1.8.3, usted
estaría actualizando su sistema a la versión 1.8.3. Por el contrario, nosotros usamos el término
upgrade para referirnos al cambios entre las ramas de Asterisk (si la versión es mayor aumenta el
número de versión). Por ejemplo, un upgrade puede ser el cambio desde Asterisk 1.4.34 para
Asterisk 1.8.0
Los pasos básicos son:
$ cd ~/src/asterisk-complete/asterisk/11.<your version number>/
$ ./configure
$ make
$ make install
No tiene que ejecutar sudo make install porque ya hemos establecido la propiedad de directorio
para el usuario pbxsystem. Usted debe ser capaz de instalar los nuevos archivos directamente en los
directorios adecuados.
Tras la instalación, sin embargo, puede obtener un mensaje como el siguiente:
WARNING WARNING WARNING
Your Asterisk modules directory, located at
/usr/lib/asterisk/modules
contains modules that were not installed by this
version of Asterisk. Please ensure that these
modules are compatible with this version before
attempting to run Asterisk.
chan_mgcp.so
chan_oss.so
chan_phone.so
chan_skinny.so
chan_skype.so
codec_g729a.so
res_skypeforasterisk.so
WARNING WARNING WARNING
Este mensaje de advertencia indica que los módulos instalados en el directorio
/usr/lib/asterisk/modules/ no son compatibles con la versión que acaba de instalar. Esto ocurre con
mayor frecuencia cuando se han instalado módulos en una versión de Asterisk, y luego se instala una
nueva versión de Asterisk sin compilar los módulos (como el proceso de instalación sobrescribirá los
módulos que existían anteriormente, reemplazándolos con sus versiones actualizadas).
Para evitar el mensaje de advertencia, puede borrar el directorio /usr/lib/asterisk/modules/ antes de
ejecutar make install. Sin embargo, si ha instalado módulos de terceros, como los módulos comerciales
de Digium (incluyendo chan_skype, codec_g729a, etc.), tendrá que reinstalarlos ya que usted ha
limpiado su directorio de módulos.
Se recomienda mantener un directorio con sus módulos de terceros. Así, por ejemplo, es posible crear el
directorio /usr/src/asterisk-complete/terceros/11. Descargar los módulos de terceros en este
directorio le permite fácilmente reinstalar estos módulos después de upgrade su sistema. Sólo tienes
que seguir las instrucciones de instalación del módulo, muchos de los cuales será tan simple como
volver a ejecutar make install desde el directorio de fuentes del módulos o copiar el binario precompilado en el directorio /usr/lib/asterisk/modules/. Para crear un directorio de tercero ejecute los
comandos siguientes:
$ cd ~/src/asterisk-complete/
$ mkdir terceros/
$ mkdir terceros/11/
Problemas comunes
En esta sección vamos a hablar de algunos problemas comunes con los que se puede encontrar durante
la compilación de Asterisk, DAHDI o Libpri. La mayoría de los problemas que se encontrará tienen que
ver con las dependencias que faltan. Si ese es el caso, por favor revise la sección "Dependencias de
software" para asegurarse de que ha instalado todo lo necesario.
-bash: wget: command not found
Este mensaje significa que no tiene instalada la aplicación wget, que se requiere para que puedas
descargar paquetes desde el sitio de descarga de Asterisk, para Asterisk descargar archivos de sonido o
para DAHDI descargar firmware para el hardware.
Ubuntu
$ sudo apt-get install wget
Centos
$ sudo yum -y install wget
Configure: error: no acceptable C compiler found in $PATH
Esto significa que el script de configuración de Asterisk es incapaz de encontrar su compilador C, que por
lo general significa que usted todavía no ha instalado uno. Asegúrese de instalar el paquete gcc para su
sistema.
Ubuntu
$ sudo apt-get install gcc
CentOS
$ sudo yum install gcc
make: gcc: command not found
Esto significa que el script de configuración de Asterisk es incapaz de encontrar su compilador C, que por
lo general significa que usted todavía no ha instalado uno. Asegúrese de instalar el paquete gcc para su
sistema.
Ubuntu
$ sudo apt-get install gcc
CentOS
$ sudo yum install gcc
configure: error: C++ preprocessor “/lib/cpp” fails sanity check
Este error se presenta por el script de configuración de Asterisk cuando no se ha instalado el
preprocesador GCC C +.
Ubuntu
$ sudo apt-get install g++
CentOS
$ sudo yum install gcc-c++
configure: error: *** Please install GNU make. It is required to build Asterisk!
Este error se presenta cuando no se ha instalado la aplicación make, que es necesaria para compilar
Asterisk.
Ubuntu
$ sudo apt-get install make
CentOS
$ sudo yum install make
configure: *** XML documentation will not be available because the ‘libxml2’
development package is missing.
Usted se encontrará con este error cuando no están instaladas las librerías del XML. Estas son
requeridas por Asterisk 1.8 y posteriores, ya que la documentación de la consola (por ejemplo, cuando
se ejecuta el comando core show application dial en el CLI de Asterisk) se genera a partir de XML.
Ubuntu
$ sudo apt-get install libxml2-dev
CentOS
$ sudo yum install libxml2-devel
configure: error: *** termcap support not found
Este error ocurre cuando usted no tiene las librerías ncurses instalada, que es requerida por menuselect
y otra salida de la consola de Asterisk.
Ubuntu
$ sudo apt-get install ncurses-dev
CentOS
$ sudo yum install ncurses-devel
You do not appear to have the sources for the 2.6.18-164.6.1.el5 kernel
installed.
Usted recibirá este error al intentar compilar DAHDI sin haber instalado los headers de Linux, que son
necesarios para la compilación de los controladores de Linux.
Ubuntu
$ sudo apt-get install linux-headers-`uname -r`
CentOS
$ sudo yum install kernel-devel
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
Si se produce este error lo más probable es que usted se olvidó de anteponer sudo al inicio del comando
que se estaba ejecutando, el cual requiere permisos de root.
Upgrading Asterisk
La actualización de Asterisk entre las versiones principales, tales como 1,2 a 1,4 o desde 1.6.2 a 1.8 es
similar a la actualización de un sistema operativo. Una vez que una central de teléfono está en
producción, es terriblemente perjudicial para ese sistema que no esté disponible por casi cualquier
longitud de tiempo, y la actualización del sistema de teléfono tiene que ser bien pensada, planeada, y
probada tanto como sea posible antes de la implementación. Y debido a que cada instalación es
diferente, es difícil, si no imposible, para nosotros ir a través de un upgrade de un sistema real. Sin
embargo, sin duda podemos guiarles en la dirección correcta para la información que necesita para
llevar a cabo dicha actualización, lo que le da las herramientas necesarias para tener éxito.
Un sistema Asterisk en producción nunca se debe upgrade entre las versiones principales sin antes
implementarlo en un entorno de desarrollo, donde existen archivos de configuración que pueden ser
probados y revisados contra las nuevas características y los cambios de sintaxis entre versiones. Por
ejemplo, puede ser que tu dialplan se basa en un comando obsoleto y debe actualizarse para utilizar un
nuevo comando que contiene más funcionalidad, tiene una mejor base de código, y se actualizará de
forma más regular. Los comandos que están en desuso normalmente se dejan en el código para
compatibilidad con versiones anteriores, pero los problemas notificados sobre estos comandos
obsoletos se les darán menos prioridad que los problemas que suceden con los nuevos métodos
preferidos.
Existen dos archivos que deben leerse antes de cualquier actualización del sistema: CHANGES y
UPGRADE.TXT, que se distribuyen con el código fuente de Asterisk. Estos archivos contienen
información sobre los cambios en la sintaxis y otras cosas a tener en cuenta al actualizar entre versiones
principales. Los archivos se dividen en diferentes secciones que hacen referencia a cosas tales como
cambios en la sintaxis del dialplan, cambio en la sintaxis de los driver de canal, cambios de funcionalidad
y obsolescencia de la funcionalidad, con sugerencias de actualizar sus archivos de configuración para
utilizar los nuevos métodos.
Otra cosa a tener en cuenta al realizar una actualización es si realmente es necesario realizar la
actualización en primer lugar. Si usted está usando una versión LTS de Asterisk (con soporte por largo
tiempo) y esta versión es feliz trabajando junto a usted, tal vez no hay ninguna razón para actualizar su
sistema de producción existente. Una alternativa para upgrading todo el sistema es simplemente para
añadir funcionalidad a su sistema mediante la ejecución de dos versiones simultáneamente en sistemas
separados. Mediante la ejecución de cajas separadas, puede acceder a las funcionalidades añadidas a
una versión posterior de Asterisk sin tener que interrumpir su sistema de producción existente. A
continuación, puede realizar la migración de manera más gradual, en lugar de hacer una actualización
completa del sistema al instante.
Dos partes de Asterisk que deben ser probados a fondo cuando se realiza una actualización entre
versiones principales son: la interfaz de Asterisk Manager (AMI) y el Asterisk Gateway Interface (AGI).
Estas dos partes de Asterisk se basan en las pruebas de su código para asegurarse de que cualquier
limpieza o cambios en la sintaxis en AMI o en AGI, o en funcionalidades agregadas, no interfieren con el
código existente. Mediante la realización de una auditoría de código sobre lo que se espera que el
programa envié o reciba contra lo que realmente sucede, usted puede ahorrarse un dolor de cabeza en
el camino.
La prueba de los registros detallados de llamadas (CDR) es también muy importante, especialmente si se
utilizan como base para la facturación. Toda la estructura CDR está realmente diseñada para flujos de
llamadas simples, pero a menudo se emplea en flujos de llamadas complejas, y cuando alguien reporta
un problema al tracker y este es arreglado, a veces puede tener un efecto sobre otros que se basan en la
misma funcionalidad para diferentes propósitos. A partir de Asterisk 1.8 se incluyen canales de registro
de eventos (CEL), que es un sistema diseñado para moverse a través de algunas de las limitaciones de
los CDR en los flujos de llamadas más complejas (como las que implican transferencias, etc.)
Upgrading Asterisk puede ser un esfuerzo exitoso, siempre y cuando la planificación y las pruebas
suficientes se llevan a cabo antes del lanzamiento completo. En algunos casos, la migración a un equipo
físico independiente en el que haya realizado las pruebas es preferido, lo que le puede dar un sistema
para retroceder en caso de que algún fallo no puede ser resuelto de inmediato. La planificación, y en
particular tener un plan de copia de seguridad, son los aspectos más importantes de una actualización
de Asterisk.
Capı́tulos 6
Tareas de Configuración Inicial
En el último capítulo, cubrimos cómo instalar Asterisk. Pero, ¿dónde debe empezar con la
configuración? Esas es la pregunte que este capítulo responde. Hay algunos archivos de configuración
comunes que son relevantes, independientemente de lo que quieras lograr con el uso de Asterisk. En
algunos casos es posible que no requieras ninguna modificación, pero hay que ser conscientes de ellos.
asterisk.conf
El archivo de configuración asterisk.conf le permite ajustar varios parámetros que pueden afectar a
cómo Asterisk funciona en su conjunto.
Hay un archivo asterisk.conf de ejemplo incluido en los fuente de Asterisk. No es necesario tener este
archivo en el directorio /etc/asterisk con el fin de tener el sistema trabajando, pero es posible que
algunas de las opciones sean de utilidad para usted.
Asterisk buscará el archivo asterisk.conf en la ubicación de la configuración predeterminada, que suele
ser /etc/asterisk. Para especificar una ubicación diferente para el archivo asterisk.conf, utilice la opción
-C desde la línea de comandos:
$ sudo asterisk -C /custom/path/to/asterisk.conf
La Sección [directories]
Para la mayoría de las instalaciones de Asterisk, el cambio de los directorios no es necesario. Sin
embargo, esto puede ser útil para ejecutar más de una instancia de Asterisk, al mismo tiempo, o si le
gustaría tener los archivos almacenados en una ubicación diferente a la estándar. Las ubicaciones de
directorio por defecto y las opciones que puede utilizar para modificarlos se enumeran en la tabla
siguiente. Para obtener información adicional sobre el uso de estos directorios, consulte la sección
Estructura de archivos del capítulo 4.
Sección [directories] de asterisk.conf
Opción
Valor/Ejemplo
astetcdir
/etc/asterisk
Notas
Ubicación donde se guardan los archivos de configuración de
Asterisk
astmoddir
/usr/lib/asterisk/modules
El lugar donde se almacenan los módulos cargables.
astvarlibdir
/var/lib/asterisk
La ubicación base de la información de estado de las variable
utilizada por varias partes de Asterisk. Esto incluye los
artículos que se escriben por Asterisk en tiempo de
ejecución.
astdbdir
/var/lib/asterisk
Asterisk almacenará su base de datos interna en este
directorio como un archivo llamado astdb.
astkeydir
/var/lib/asterisk
Asterisk usa un subdirectorio llamado keys, usa este
directorio como ubicación predeterminada para cargar las
claves para encriptación.
astdatadir
/var/lib/asterisk
Este es el directorio base para los datos proporcionados por
el sistema, como los archivos de sonido que vienen con
Asterisk.
astagidir
/var/lib/asterisk/agi-bin
Asterisk usará un subdirectorio llamado agi-bin, en este
directorio como ubicación predeterminada para cargar los
scripts de AGI.
astspooldir
/var/spool/asterisk
El directorio spool de Asterisk, es donde los correo de voz,
grabación de llamadas, y los spool de originación de
llamadas se almacenan.
astrundir
/var/run/asterisk
El lugar donde Asterisk escribirá su UNIX control socket, así
como su (PID) archivo de ID de proceso.
astlogdir
/var/log/asterisk
Lugar donde Asterisk almacena sus archivos de log
La sección [options]
Esta sección del archivo asterisk.conf configura valores predeterminados para las opciones de tiempo de
ejecución globales. Las opciones disponibles se muestran en la tabla siguiente. La mayoría de ellas
también son controlables con los parámetros de línea de comandos. Para obtener una lista completa de
las opciones de línea de comandos que se relacionan con estas opciones, vea la página man de Asterisk:
$ man asterisk
Tabla: sección [options] Asterisk.conf
Opción
Valor/Ejemplo
verbose
3
debug
Notas
Define el nivel de verbosidad predeterminado para el registro log
de Asterisk. Este valor es también configurado con la opción de
líneas de comando –v. El nivel de verbose es 0 por defecto.
3
Establece el valor de depuración predeterminado para el registro
log de Asterisk. Esta valor también es configurado con la opción
de líneas de comando –d. El nivel de debug por defecto es 0.
alwaysfork
yes
Obliga a Asterisk para ejecutarse siempre en el background. Esta
opción es establecida “no” por defecto.
nofork
yes
Obliga Asterisk para que corra siempre en primer plano. Esta
opción es establecida a “no” por defecto.
quiet
yes
El modo quiet reduce la cantidad de salida que se ve en la
consola cuando Asterisk se ejecuta en primer plano. Esta opción
es establecida a “no” por defecto.
timestamp
yes
Añade marcas de tiempo para todas las salidas excepto la salida
de un comando de CLI. Esta opción es establecida a “no” por
defecto.
execincludes
yes
Habilita el uso de #exec en los archivos de configuración de
Asterisk. Esta opción es establecida “no” por defecto.
console
yes
Corre Asterisk en modo consola. Asterisk se ejecutará en segundo
plano y presentará el promts de los comandos del CLI. Esta
opción se establece a “no” por defecto.
highpriority
yes
Ejecuta la aplicación Asterisk con prioridad de tiempo real. Esta
opción se establece a “no” por defecto.
initcrypto
yes
Cargas claves del astkeydir en el arranque. Esta opción se
establece a “no” por defecto.
nocolor
yes
Suprime la salida de color de la consola de Asterisk. Esto es útil
cuando se guarda la salida de la consola a un archivo. Esta
opción se establece a “no” por defecto.
dontwarn
yes
Desactiva algunos mensajes de advertencia. Esta opción se
implementó para silenciar advertencias que generalmente están
correctos, pero puede ser considerada tan obvia que se
conviertan en una molestia. Esta opción se establece a “no” por
defecto.
dumpcore
yes
Le dice a Asterisk para generar un volcado de memoria en el caso
de un crash. Esta opción se establece a “no” por defecto.
languageprefix
yes
Configura como el promts de idioma es usados en la construcción
de la ruta para un archivo de sonido. Por defecto, este es
establecido a “yes”, lo que sitúa el idioma antes de cualquier
subdirectorio, como en/digits/1.gsm. Establecer esta opción a
“no” provoca que Asterisk se comporte como lo hacía en
versiones anteriores, colocando el idioma como el último
directorio de la ruta (por ejemplo, digits/en/1.gsm).
internal_timing
yes
Utiliza una fuente de temporización para sincronizar el audio que
se envía a un canal en casos tales como los archivos de playback
o música en espera. Esta opción se establece a yes por defecto y
se debe dejar de esa manera, su utilidad ha disminuido
considerablemente en las últimas versiones de Asterisk.
my_system_na
me
Da a esta instancia de Asterisk un nombre único. Cuando esto es
configurado, el nombre del sistema se utilizará como parte del
campo uniqueid para los canales. Esto es muy útil si más de un
sistema registrará los CDRs en la misma tabla de la base de datos.
De forma predeterminada, esta opción no es configurada.
autosystemname
yes
Configura automáticamente el nombre del sistema utilizando el
nombre de host del sistema. Esta opción se establece a “no” por
defecto.
maxcalls
100
Establece un número máximo de canales de entrada simultáneos.
No hay límite establecido por defecto.
maxload
0.9
Establece un promedio máximo de carga. Si el promedio de carga
está por encima de este umbral, asterisk no aceptará nuevas
llamadas. No se establece umbral de forma predeterminada.
maxfiles
1000
Establece el número máximo de archivos descriptores que
Asterisk se le permite tener abiertos. El límite predeterminado
impuesto por el sistema es comúnmente 1024, que no es
suficiente para los sistemas con muchas cargas. Es común
establecer este límite a un número más alto. El límite impuesto
por el sistema es el que se utiliza por defecto.
1
Establece el número mínimo de megabytes de memoria libre
necesario para que Asterisk siga aceptando llamadas. Si Asterisk
detecta que hay menos memoria libre disponible de este límite,
no se aceptarán nuevas llamadas. Esta opción no está establecida
de forma predeterminada.
cache_record_files
yes
Cuando hace una grabación, se guarda el archivo en la
record_cache_dir hasta que la grabación es completada. Una vez
terminada, se traslada a su destino originalmente especificado. El
valor predeterminado para esta opción es “no”.
record_cache_dir
/tmp
Establece el directorio que se utilizará cuando cache_record_files
se establece a “yes”. La ubicación predeterminada es el
directorio llamado tmp dentro del astspooldir.
transmit_silence
yes
Transmite silencio a la persona que llama en los casos en que no
hay otra fuente de audio. Esto incluye la grabación de la llamada
y la familia wait() de aplicaciones del dialplan, entre otras cosas.
El valor predeterminado para esta opción es No.
transcode_via_sln
yes
Cuando construye una ruta de traducción de códec, fuerzas el
firmado linear para ser uno de los pasos en la ruta. El valor
predeterminado para esta opción es yes.
asterisk
Establece el usuario del sistema con el cual la aplicación Asterisk
debe ejecutarse. Esta opción no está establecida de forma
predeterminada, lo que significa que la aplicación seguirá
systemname
minmemfree
runuser
funcionando como el usuario que ejecuta la aplicación.
rungroup
asterisk
Establece el grupo del sistema en el cual la aplicación Asterisk
debe ejecutarse. Esta opción no está establecida de forma
predeterminada.
lightbackground
yes
Cuando se usan colores en la consola de Asterisk, la salida
mostrará los colores que son compatibles con un fondo de color
claro.
documentation_
language
en_US
La documentación incorporada para las aplicaciones de Asterisk,
funciones, y otras cosas se incluye en un documento XML
externo. Esta opción especifica el idioma preferido para la
documentación. Si no está disponible, se usará el valor por
defecto de en_US.
hideconnect
yes
Establecer esta opción a yes provoca que Asterisk no muestre las
notificaciones de conexiones de consola remota y desconexiones
en asterisk CLI. Esto es útil en sistemas donde hay scripts que
utilizan consolas remotas pesada. El valor predeterminado es no.
lockconfdir
no
Cuando esta opción está activada, el directorio de configuración
de Asterisk estará protegido con un bloqueo. Esto ayuda a
proteger en contra de tener más de una aplicación que intenta
escribir en el mismo archivo al mismo tiempo. El valor
predeterminado es no.
La sección [files]
Esta sección del asterisk.conf incluye opciones relacionadas con el socket control de Asterisk. Se utiliza
sobre todo por las consolas remotas (Asterisk -r). Las opciones disponibles son listadas en la Tabla
siguiente.
Opción
astctlpermissions
Valor/Ejemplo
0660
astctlowner
root
astctlgroup
apache
astctl
asterisk.ctl
Notas
Estableces los permisos para Asterisk control socket.
Estableces el propietario de Asterisk control socket
Establece el grupo para Asterisk control socket
Estableces el nombre de archivo para Asterisk control socket. El valor
por defecto es asterisk.ctl.
La Sección [compat]
En ocasiones, el equipo de desarrollo de Asterisk decide que la mejor manera de avanzar consiste en
hacer un cambio que no es compatible con versiones anteriores. Esta sección contiene algunas opciones
(que se enumeran más abajo) que permitan revertir el comportamiento de ciertos módulos para volver
a un comportamiento anterior.
Tabla: sección [compat] de Asterisk.conf
Opción
Valor/Ejemplo Notas
pbx_realtime
1.6
En versiones anteriores de Asterisk 1.6.x, el módulo pbx_realtime
convertiría automáticamente los caracteres pipe en las comas de los
argumentos de las aplicaciones de Asterisk. Esto ya no se hace por
defecto. Para habilitar este comportamiento, establezca esta opción
a 1.4.
res_agi
1.6
En versiones anteriores de Asterisk 1.6.x, el comando EXEC AGI
convertiría automáticamente los caracteres pipe en las comas de los
argumentos de las aplicaciones de Asterisk. Esto ya no se hace por
defecto. Para habilitar este comportamiento, establezca esta opción
a 1.4.
app_set
1.6
A partir de la versión 1.6.x de Asterisk, la aplicación Set() sólo
permite establecer el valor de una sola variable. Anteriormente, Set()
permitía establecer más de una variable separándolas con un &. Esto
se hizo para permitir cualquier caracteres en el valor de una variable,
incluyendo el carácter &, que anteriormente se utilizó como un
separador. Mset() es una nueva aplicación que se comporta como
Set(). Sin embargo, al establecer esta opción a 1.4 hace que Set() se
comporte como Mset().
modules.conf
Este archivo no es estrictamente necesario en una instalación de Asterisk, sin embargo, sin ningún tipo
de módulos Asterisk no será realmente capaz de hacer nada, así que para todos los propósitos
prácticos, es necesario un archivo modules.conf en su directorio /etc/Asterisk. Si usted simplemente
define autoload=yes en el archivo modules.conf, Asterisk buscará todos los módulos en el directorio
/usr/lib/asterisk/modules y los cargara en el inicio.
Aunque la mayoría de los módulos no utilizan muchos recursos, y ellos son cargados rápidamente, debes
tener claro en su mente que solo debes cargar los módulos que ha planificado usar en su sistema.
Además, hay beneficios de seguridad al no cargar módulos que aceptan conexiones sobre la red.
En el pasado, sentimos que cargar explícitamente cada módulo deseado era la mejor manera de
manejar esto, pero nos hemos encontrado que esta práctica crea trabajo extra. Después de cada
actualización nos encontramos con tener que editar el archivo modules.conf para corregir todos los
módulos diferente entre versiones, y todo el proceso terminó siendo innecesariamente complicado. Lo
que preferimos hacer estos días es permitir que Asterisk cargue automáticamente todos los módulos
que encuentre, pero decirle explícitamente que no cargue ningún módulo que no queramos cargar
mediante el uso de la directiva noload.
La sección [modules]
El archivo modules.conf contiene una sola sección. Las opciones disponibles en esta sección se
enumeran en la tabla siguiente. Con la excepción de autoload, todas las opciones se pueden especificar
más de una vez.
Tabla: sección [modules] de modules.conf
Opción
Valor/Ejemplo
autoload
yes
Notas
En lugar de tener que explícitamente listar los módulos con
load, puede utilizar esta directiva para decirle a Asterisk que
cargue todos los módulos que encuentre en el directorio
modules, a excepción de los módulos listados para no cargar
con la directiva noload. El valor por defecto, y nuestra
recomendación es establecer esta opción en yes.
preload
res_odbc.so
Indica que un módulo debe ser cargado en el comienzo del
orden de carga del módulo. Esta directiva es mucho menos
relevante de lo que solía ser, los módulos tienen ahora una
prioridad de carga integrada que resuelve los problemas por lo
que esta directiva se utilizaba anteriormente.
load
chan_sip.so
Define un módulo que debe ser cargado. Esta directiva sólo es
relevante si autoload se establece a no.
noload
chan_alsa.so
Define un módulo que no debe ser cargado. Esta directiva sólo
es relevante si autoload se establece a yes.
require
chan_sip.so
Hace lo mismo que load, adicionalmente, Asterisk se cerrará si
este módulo no se carga por alguna razón.
preloadrequire
res_odbc.so
Hace los mismos que la preload, adicionalmente, Asterisk se
cerrará si este módulo no se carga por alguna razón.
indications.conf
Los sonidos que las personas esperan de la red telefónica varían en diferentes partes del mundo. Los
diferentes países o regiones presentan diferentes sonidos para eventos tales como tono de marcado,
tono de ocupado, devolución de llamada, congestión, etc.
El archivo indications.conf define los parámetros para los diferentes sonidos que un sistema telefónico
puede esperarse que produzca, y le permite personalizarlos. En los primeros días de Asterisk este
archivo sólo contenía sonidos para un número limitado de países, pero ahora es muy amplio.
Para asignar los tonos habituales de su región a los canales, sólo tiene que asignar el tonezone utilizando
la función CHANNEL(), y este tonezone se aplicará durante la duración de la llamada (salvo que se
cambie más adelante):
Set(CHANNEL(tonezone)=[yourcountry])
; i.es,us, uk, de, etc.
Sin embargo, puesto que la señalización de una llamada puede venir de varios lugares (de la compañía
telefónica, desde Asterisk, o incluso desde el propio sistema), debe tener en cuenta que el simple ajuste
del tonezone en tu dialplan no garantiza que los tonos estén presentes en todas las situaciones.
Mientras que Asterisk se ejecutará sin un archivo indications.conf, se recomienda fuertemente que
usted
incluye
uno:
copie
el
archivo
de
ejemplo
desde
/usr/src/Asteriskcomplete/11/configs/indications.conf.sample, modifique los parámetros de los países de la sección
[general] para que coincida con su región y reinicie Asterisk.
Si su sistema soporta varios países (por ejemplo, si usted tiene un sistema Asterisk centralizado que
tiene usuarios de diferentes regiones), es posible que no sea capaz de definir simplemente el país
predeterminado. En este caso, usted tiene un par de opciones:
1. Defina el país en el archivo de definición de canal para el usuario.
2. Defina el país en el plan de marcado con la función CHANNEL (tonezone).
chan_dahdi Ignora indications.conf
DAHDI no utiliza el archivo indications.conf de Asterisk, sino que tiene los tonos ya compilados.
musiconhold.conf
Si usted planea vender sistemas de telefonía basados en Asterisk y no cambia la música de espera por
defecto que se incluye con Asterisk, usted está enviando un mensaje, alto y claro, que no sabe muy bien
lo que está haciendo.
Parte del problema con la música en espera es que mientras que en el pasado era común conectar un
radio o un CD player en el sistema telefónico, la realidad legal es que la mayoría de las música tienen
licencias que en realidad no le permiten hacer esto. Eso sí: si usted quiere tocar música en espera,
alguien, en algún lugar, por lo general quiere que usted les pague por el privilegio.
Entonces, ¿cómo hacer frente a esto? Hay dos formas legales: 1) pagar por una licencia de música en
espera al titular de los derechos de autor, o 2) a encontrar una fuente de música que se distribuye bajo
una licencia adecuada para Asterisk.
No estamos aquí para darle consejo legal, usted es responsable de entender lo que se requiere de usted
con el fin de utilizar una pieza en particular de música como su fuente de música en espera. Lo que
vamos a hacer, sin embargo, es mostrar cómo tomar la música que tiene y hacer que funcione con
Asterisk.
Convirtiendo música en un formato que trabaje mejor con Asterisk
Es bastante común tener música en formato MP3 en estos días. Mientras Asterisk puede utilizar
archivos MP3 como una fuente de música, este método no es del todo ideal. Los archivos MP3 están
fuertemente comprimido, y con el fin de reproducir esto, el CPU tiene que hacer un trabajo serio para
descomprimirlo en tiempo real. Esto está bien si sólo estás reproduciendo en una canción y quiere
ahorrar espacio en el iPod, pero para música en espera, lo correcto para hacer es convertir el MP3 a un
formato que sea más fácil para el CPU.
CentOS Requisito
Dado que CentOS no tiene capacidad instalada para MP3 con sox, usted tendrá que instalar mpg123
antes de poder convertir los archivos MP3 para su uso con Asterisk.
En primer lugar usted tendrá que instalar el repositorio rpmforge. Para saber cuál es la versión que
necesita, abra su navegador Web y vaya a http://dag.wieers.com/rpm/FAQ.php#B. Seleccione el texto
de la versión/Arquitectura que desea instalar y pégalo en tu shell:
$ rpm -Uhv http://apt.sw.be/redhat ...
Usted necesita asegurarse de que este nuevo repositorio es usado correctamente, por lo que ejecute lo
siguiente:
$ yum install yum-priorities
(Si desea saber más acerca de las prioridades yum, vea este sitio:
http://wiki.centos.org/PackageManagement/mmm/Prioridades.)
Una vez que el repositorio ha sido añadido, se puede proceder a obtener mpg123:
$ yum install mpg123
Una vez hecho esto, el sistema CentOS está listo para convertir los archivos MP3 para su uso con
Asterisk.
Si usted está familiarizado con los formatos de archivo y tienes algo de experiencia trabajando con
software de ingeniería de audio como Audacity, puede convertir los archivos en su PC y cargarlas
después para Asterisk. Nosotros encontramos que es más sencillo subir canciones en MP3 para el
servidor de Asterisk (por ejemplo, en la carpeta / tmp) y, luego, convertirlos desde la línea de comandos.
Para convertir sus archivos MP3 a un formato que Asterisk entienda, usted necesita ejecutar los
comandos descritos aquí (en este ejemplo estamos usando un archivo llamado SilentCity.mp3).
CentOS
En primer lugar, convertir el archivo mp3 a un archivo WAV:
$ mpg123 -w SilentCity.wav SilentCity.mp3
A continuación, reducir el archivo WAV resultante a una velocidad de muestreo que Asterisk entienda:
$ sox SilentCity.wav -t raw -r 8000 -s -w -c 1 SilentCity.sln
Ubuntu
Si no lo ha hecho, instale el sox y el paquete libsox-fmt-all:
# sudo apt-get install sox libsox-fmt-all
A continuación, convierta el archivo MP3 directamente al formato SLN sin comprimir:
$ sox SilentCity.mp3 -t raw -r 8000 -s -w -c 1 SilentCity.sln
Completando la conversión de archivos
El archivo resultante va a existir en la carpeta /tmp (o donde sea que lo haya subido) y necesita ser
copiado al directorio /var /lib /asterisk /moh:
$ cp *.sln /var/lib/asterisk/moh
Ahora tendrá que recargar musiconhold en Asterisk para que reconozca los nuevos archivos:
$ asterisk -rx "module unload res_musiconhold.so"
$ asterisk -rx "module load res_musiconhold.so"
Para probar que su música está funcionando correctamente, agregue lo siguiente en el contexto
[services] en el dialplan:
exten => 664,1,NoOp()
same => n,Progress()
same => n,MusicOnHold()
Marcando 664 desde una de las extensiones debe reproducir un archivo al azar de su directorio moh.
Capı́tulo 7
Dispositivos de Usuarios
En este capítulo vamos a profundizar en los dispositivos de usuario que es posible que desee conectar a
Asterisk, típicamente teléfonos VoIP de algún tipo. La configuración de un canal en Asterisk para que los
dispositivos se conecten a través de este es relativamente sencilla, pero también es necesario configurar
el dispositivo en sí para que sepas a dónde enviar sus llamadas. En otras palabras, hay dos partes en la
configuración de un dispositivo en Asterisk: 1) decirles a Asterisk sobre el dispositivo, y 2) decirle al
dispositivo sobre Asterisk.
Aunque la mayoría de los dispositivos tendrán una interfaz basada en web para la definición de
parámetros, si usted está poniendo más de uno o dos teléfonos en producción se recomienda el uso de
un proceso de configuración basado en servidor, en el que a la extensión solo se le dice la ubicación de
un servidor de archivos. La extensión se identificará y descargar los archivos personalizados que definen
los parámetros necesarios para ese teléfono. Como un ejemplo, estos podrían ser los archivos XML en
un servidor FTP. El proceso de descarga exacta y la sintaxis de estos archivos serán diferentes de un
fabricante a otro. En este capítulo sólo hablaremos de la configuración de los grupos desde la
perspectiva de Asterisk.
¿Cómo se Relaciona Asterisk con el Protocolo SIP?
SIP es un protocolo peer-to-peer, y si bien es común tener una instalación donde los dispositivos finales
actúan como clientes y algún tipo de gateway actúa como un servidor, el protocolo sigue pensando en
términos de relaciones peer-to-peer. Lo que esto significa es que un teléfono SIP espera hacer una
conexión directa con otro teléfono SIP, sin una PBX en el medio.
La realidad es que muchas de las transacciones SIP pasan a través de un servidor, y en el caso de
Asterisk, es común tener la PBX en el medio de todas las conexiones. Cuando una llamada SIP se hace
desde un teléfono a otro teléfono a través de Asterisk, en realidad hay dos llamadas que ocurren: Una
desde la extensión de origen hacia Asterisk, y otra llamada separada desde Asterisk a la extensión de
destino. Asterisk hace un puente entre los dos canales.
Desde la perspectiva de los teléfonos SIP, por lo tanto, es necesario configurar esto para que envíe todas
sus llamadas para Asterisk, a pesar de que el dispositivo es muy capaz de conectarse directamente a
otro punto final SIP sin el servidor Asterisk. El protocolo SIP es complejo y muy flexible, y la
configuración de los puntos finales puede parecer difícil porque tienen mucha más flexibilidad de la que
requerimos de ellos para una implementación Asterisk.
Conceptos de Nombramientos de Teléfonos
Antes de empezar a configurar Asterisk para nuestros teléfonos, vamos a recomendar algunas de las
mejores prácticas en materia de nombres de teléfonos, abstrayendo los conceptos de usuarios, números
de extensión, y los teléfonos entre sí.
En Asterisk, todo el sistema se preocupa por el nombre del canal. Realmente no hay concepto de
usuario en absoluto, y las extensiones son simplemente formas de dirigir el flujo de llamadas a través del
sistema. Por ejemplo, el plan de marcado puede informarle a Asterisk que cuando se solicita el número
de extensión 100 debe llamar al teléfono de mi escritorio, pero la extensión 100, simplemente podría
llamar con la misma facilidad a un buzón de voz de la empresa, reproducir un mensaje, o unirse a una
sala de conferencias. Incluso podemos especificar que la extensión 100 solo debe llamar el dispositivo
en mi escritorio, de lunes a viernes entre las 9 A.M. y 5 P.M. pero el resto del tiempo sonara en el
escritorio de alguien más. Inversamente, cuando una llamada es hecha desde un dispositivo durante
horario de negocios, el callerID puede mostrar un número durante el día, y durante el horario nocturno
puede mostrar otro número distinto (muchos escritorios de recepción son utilizados por la noche por el
personal de seguridad.)
Extensiones en Asterisk
El concepto de una extensión en Asterisk es crucial. En las mayorías de las PBXs, una extensión es un
número que usted marca para que un teléfono o servicio repique. En Asterisk, una extensión es el
nombre de un grupo de instrucciones en el dialplan. Piense en una extensión de Asterisk como un
nombre de un script, y ya está en el camino correcto. Sí, una extensión de Asterisk puede ser un
número (tal como 100) que haces sonar un teléfono, pero podría ser simplemente un nombre (como
correo de voz) que ejecuta una secuencia de aplicaciones del dialplan.
Vamos a hablar de las extensiones de Asterisk con mucho más detalles en este libro, pero antes de
hacer eso queremos configurar algunos teléfonos.
La abstracción entre el nombre de una extensión y lo que la extensión hace es un concepto poderoso en
Asterisk, como la extensión 100 puede hacer un número de cosa en función del número de variables que
son programada en el sistema. Esto es especialmente relevante en el contexto de características tales
como hot-desking.
Hot-desking es una característica que permite a alguien iniciar una sesión en un dispositivo y recibir sus
llamadas en ese dispositivo. Digamos que tenemos tres agentes de ventas que suelen trabajar fuera de
la oficina, pero pasan un par de días de cada mes en la oficina para hacer el papeleo. Dado que es muy
poco probable que estén todos en la oficina al mismo tiempo, en lugar de tener un teléfono diferente
para cada uno de los tres agentes de ventas, podrían compartir un único teléfono en la misma oficina (o,
a mayor escala, una docena de personas pueden compartir un pool de, digamos, tres teléfonos). Este
escenario ilustra la conveniencia (y la necesidad) de permitir que el sistema separe el concepto de
usuario y extensión del teléfono físico.
¿Cuáles son algunos ejemplos de nombres malos para dispositivos telefónicos? Algo así como el nombre
de una persona, como por ejemplo [peter], sería un mal nombre para un teléfono por que el teléfono
también puede ser utilizado por otras personas. El mismo razonamiento se puede aplicar a por qué
usted no querría nombrar a un teléfono basado en un número de extensión: un nombre de teléfono de
[100] sería una mala elección, ya que es posible que desee volver a aprovisionar el dispositivo para la
extensión 160 en el futuro, o puede ser utilizado por varias personas con diferentes extensiones en una
solución Hot-desking. Usar nombres de cuenta numéricas también es muy malo desde la perspectiva de
la seguridad.
Una forma popular de nombrar un teléfono es utilizando la dirección MAC del dispositivo. Se trata de un
identificador único específico para el teléfono que lo sigue a donde va y no se refiere directamente al
usuario que utiliza el teléfono o el número de extensión asociado actualmente con él. Algunas empresas
tienen etiquetas que colocan en su equipo con un código de barra y otras informaciones que les permite
mantener el stock de equipos provisionado; estos códigos únicos también sería una opción aceptable en
el uso de nombres de teléfono, ya que no proporcionan ninguna relación lógica con una persona en
particular, pero proporcionan información específica sobre los propios dispositivos.
La elección es suya en cuanto a la forma en que desea nombrar sus teléfonos, pero queremos sobre
todo abstraer cualquier concepto de teléfono que pertenece a una persona, o incluso su ubicación en la
red, ya que estos conceptos están fuera del ámbito de Asterisk y puede cambiar en cualquier momento.
A lo largo de este libro, verás como nosotros usamos nombre de teléfonos que se parecen a las
direcciones MAC (como 0000FFFF0001 y 0000FFFF0002) para diferenciar entre dispositivos. Usted
tendrá que utilizar los nombres de teléfonos que coinciden con el hardware que está utilizando (o
alguna otra cadena que es única para el dispositivo que está registrando).
Como consideración final, debemos dejar claro que lo que estamos sugiriendo con respecto a los
nombres de los dispositivos no es un requisito técnico. Usted es libre de nombrar sus dispositivos como
desee, siempre y cuando cumplan con los requisitos de las convenciones de nombres de Asterisk para
dispositivos (Con caracteres alfanuméricos sin espacios y todo estará bien).
Hardphone, Softphones, y ATAs
Hay tres tipos de dispositivos finales que usted típicamente le proporciona a sus usuarios y que les
podrían servir como un aparato telefónico. Se les conoce popularmente como hardphone, softphones, y
adaptadores de terminales analógicos (ATA).
Un hardphone es un dispositivo físico. Se ve como un teléfono de oficina: tiene un auricular, botones
numerados, etc. Se conecta directamente a la red, y es lo que la gente se refiere cuando se habla de un
teléfono de VoIP (o un teléfono SIP).
Un softphone es una aplicación de software que se ejecuta en un computador de escritorio o laptop. El
audio debe pasar a través del sistema de sonido del PC, por lo que necesita normalmente un auricular
que funcione bien con aplicaciones de telefonía. Más recientemente, las aplicaciones de softphone han
sido escritas para teléfonos inteligentes que le permiten conectarse a otras redes que no sean sólo la
red celular. La interfaz del softphone a menudo se diseña para parecer un teléfono físico, pero esto no
es necesario.
Un ATA está diseñado para permitir que los teléfonos analógicos tradicionales (y otros dispositivos
analógicos, tales como máquinas de fax, teléfonos inalámbricos, amplificadores de paginación, y otros)
puedan conectarse a una red SIP, y normalmente son una caja del tamaño de sándwich que contiene un
conector RJ-11 para conectar el teléfono (comúnmente referido como un puerto FXS), un conector RJ-45
para la red, y un conector de alimentación eléctrica. Algunos ATAs pueden soportar más de un teléfono.
Los hardphones tienen la ventaja de que el auricular tienen buenas propiedades acústica para las
comunicaciones de voz. Cualquier teléfono de calidad decente es diseñado para recoger las frecuencias
de la voz humana, filtrar el ruido de fondo no deseado, y normalizar la forma de onda resultante. La
gente ha usado los teléfonos durante el largo tiempo que la red telefónica ha existido, y tienden a
preferir lo que es familiar, por lo que tener un dispositivo que se comunica con Asterisk utilizando una
interfaz familiar será atractivo para muchos usuarios. Además, un hardphone no requiere que el
computador este encendido todo el tiempo.
Las desventajas de los hardphones incluyen que son caros y no portátiles, en relación con la calidad de
muchas aplicaciones de softphone en el mercado hoy en día que están disponibles de forma gratuita.
Además, el desorden extra en su escritorio puede no ser conveniente si usted tiene un espacio de
trabajo limitado, y si usted se mueve mucho de su lugar de trabajo, un hardphone es probable que no se
adapte a sus necesidades (aunque, uno en cada lugar que frecuente podría ser una solución válida).
Un Softphones resuelve el problema de portabilidad al ser instalado en un dispositivo que es probable
que ya se mueve con usted, como su ordenador portátil o teléfono inteligente. Además, su costo es
mínimo (por lo general gratis, o en el caso contrario en un rango de precio de $30 para tener todas las
funciones disponibles) es atractivo. Debido a que muchos softphones son gratis, es probable que el
primer aparato telefónico que se conecta a Asterisk sea un softphone. Además, como los softphones son
software, que son fáciles de instalar y actualizar, y normalmente tienen otras funciones que utilizan
otros periféricos, como una cámara web para video llamada, o tal vez la posibilidad de cargar archivos
desde el escritorio para enviar por faxes.
Algunas de las desventajas de los softphones son: la necesidad de usar un headset cada vez que toma
una llamada, y el hecho de que muchas PCs de forma aleatoria durante el día optan por hacer algo
distinto de lo que el usuario quiere que hagan, lo que podría provocar que el softphone deje de
funcionar.
Los ATA tienen la ventaja que le permiten conectar los dispositivos analógicos a la red SIP, como los
teléfonos inalámbricos (que todavía son superiores en muchos casos que los tipos más avanzados de
teléfonos wireless), amplificadores de paginación y timbres. Los ATA a veces también pueden ser usado
para conectarse con el cableado antiguo, donde una conexión de red podría no funcionar
correctamente.
La principal desventaja de un ATA es que usted no conseguirá las misma funcionalidades a través de una
línea analógica como lo haría desde un teléfono SIP. Esta es una tecnología que tiene más de un siglo de
antigüedad.
Con Asterisk, no necesariamente tienen que tomar la decisión entre tener un softphone, un hardphone,
o un ATA; Es enteramente posible y muy común tener un único número de extensión que haga sonar
múltiples dispositivos a la vez, como un teléfono de escritorio, un softphone sobre el laptop, un teléfono
celular, y tal vez una luz estroboscópica en la parte posterior de la fábrica (en donde hay demasiado
ruido que impide que un timbre sea escuchado).
Configurando Asterisk
En esta sección explicaremos cómo crear los archivos de configuración sip.conf y iax.conf en el
directorio /etc/asterisk/, los cuales se utilizan para definir los parámetros por los cuales los dispositivos
SIP e IAX2 pueden comunicarse con su sistema.
Asterisk le permite a los dispositivos que usan muchos protocolos diferentes hablar entre sí. Sin
embargo, los protocolos SIP e IAX2 son los módulos de VoIP más populares y maduro, así que vamos
a centrar nuestra atención en ellos. Para construir su primer Asterisk, puede ser mejor para usted no
tocar los demás protocolos (como, Skinny/SCCP, Unistim, H.323 y MGCP), hasta conseguir sentirse
cómodo trabajando con SIP e IAX2. La configuración de los otros protocolos es similar, y los archivos
de configuración de ejemplo están llenos de información y ejemplos, por lo que una vez que tenga
los conocimientos básicos, trabajar con otros protocolos puede ser bastante fácil.
Los archivos de configuración de canales, tales como sip.conf e iax.conf, contienen la configuración para
los driver de canales, tales como chan_ixa2.so o chan_sip.so, junto con la información y las credenciales
necesarias para que un dispositivo telefónico pueda contactarse e interactuar con Asterisk.
La información común sobre el controlador de canal se encuentra en la parte superior del archivo de
configuración, en la sección [general]. Todos los nombres de las secciones están encerrados entre
corchetes, incluyendo los nombres de dispositivos. Cualquier cosa que sigue a un nombre de sección (o
definición de dispositivo, que para nuestros propósitos es esencialmente la misma cosa) se aplica a esa
sección. La sección [general] también puede contener información para definir valores predeterminados
para las configuraciones de los dispositivos, que son sobrescritos por los valores definidos en la sección
de cada dispositivo, o en una plantilla. Asterisk también viene con valores predeterminados que están
codificados, así que mientras que algunas configuraciones son obligatorias, muchas otras
configuraciones pueden ser ignoradas, siempre y cuando usted este feliz con los valores por defecto.
Asterisk chequea los parámetros en el orden siguiente:
1. Chequea la sección específica para el canal correspondiente.
2. Verifica la plantilla para la sección.
3. Chequea la sección [general]
4. Usa el código predeterminado
Esto significa que sólo porque usted no especifico un valor para un parámetro determinado no significa
que su dispositivo no va a tener una configuración para ese parámetro. Si no está seguro, establezca el
parámetro de forma explícita en la sección del archivo de configuración que se ocupa de ese canal
específico, o en la plantilla correspondiente.
Este concepto debería tener más sentido mientras lee.
Cómo trabajan los archivos de configuración de canal con el plan de
marcado
Si bien no hemos discutido el dialplan de Asterisk todavía, es útil ser capaz de visualizar la relación entre
los archivos de configuración de canal (sip.conf, iax.conf) y el dialplan (extensions.conf). El dialplan es el
corazón de un sistema Asterisk: este controla como la lógica de las llamadas es aplicada para cualquier
conexión desde cualquier canal, tal como lo que sucede cuando un dispositivo marca la extensión 101 o
una llamada entrante desde un proveedor externo es enrutada. Ambos el archivo de configuración de
canal relevante y el archivo extensións.conf juegan un papel en las mayoría de las llamadas ruteada a
través del sistema.
Cuando una llamada entra en Asterisk, la identidad de la llamada entrante se compara en el archivo de
configuración de canal para el protocolo en uso (por ejemplo, sip.conf). El archivo de configuración de
canal también se encarga de la autenticación y define donde el canal entrará en el plan de marcado.
Una vez que Asterisk ha determinado cómo manejar el canal, pasará el control de llamadas al contexto
correcto en el dialplan. El parámetro contexto en el archivo de configuración de canal le dice al canal en
qué contexto del dialplan entrara la llamada (el contexto que contiene toda la información acerca de
cómo manejar y dirigir la llamada).
La imagen más abajo provee una representación gráfica de la relación entre los archivo sip.conf y
extensions.conf.
Imagen: relación entre los archivo sip.conf y extensions.conf.
Por el contrario, si el dialplan se ha programado para marcar otro dispositivo cuando se solicita que el
número de extensión 101 sea procesado, una solicitud para marcar el dispositivo telefónico
0000FFFF0002 usará el archivo de configuración de canal para determinar como de pasar la salida de la
llamada del dialplan al teléfono en la red (incluyendo detalles tales como la autenticación, el codec, y así
sucesivamente).
Un punto clave a recordar es que los archivos de configuración de canal controlan no sólo cómo las
llamadas entran en el sistema, sino también como salen del sistema. Así, por ejemplo, si una extensión
llama a otra extensión, el archivo de configuración de canal es usado no sólo para pasar la llamada a
través del dialplan, sino también para dirigir la llamada desde el dialplan para su destino.
sip.conf
El módulo de canal SIP es sin duda el más maduro y rico en funciones de todos los módulos de canal en
Asterisk. Esto es debido a la enorme popularidad del protocolo SIP, que se ha hecho cargo de la industria
de VoIP/telecomunicaciones y ha sido implementado en miles de dispositivos y PBX. Si mira a través del
archivo sip.conf.sample en el subdirectorio ./config en los fuente de Asterisk notará que hay una gran
cantidad de opciones disponibles. Afortunadamente, las opciones por defecto suelen ser todo lo que
necesita, y por lo tanto se puede crear un archivo de configuración muy simple que le permitirá a la
mayoría de los teléfonos SIP estándar conectar con Asterisk.
Lo primero que debemos hacer es crear un archivo de configuración en el directorio /etc/asterisk
llamado sip.conf.
Pegue o escriba la siguiente información en el archivo:
[general]
context=no-autenticado
allowguest=no
srvlookup=yes
udpbindaddr=0.0.0.0
tcpenable=no
language=es
; contexto predeterminado para las llamadas entrantes
; desactiva las llamadas no autenticadas
; habilitado registro de búsqueda DNS SRV en llamadas salientes
; escucha las peticiones UDP en todas las interfaces
; Desactiva el soporte TCP
; Define el idioma español por defecto sobre su sistema.
[phone-interno](!)
type=friend
context=Local
host=dynamic
nat=yes
; crea una plantilla para nuestros dispositivos
; permite hacer y recibir llamadas
; es el contexto donde las llamadas entraran en el dialplan
; el dispositivo se registrará con Asterisk de forma dinámica
; asume que el dispositivo está debajo de NAT
; *** NAT significa traducción de direcciones de red, lo que permite a
; Varios dispositivos internos compartir una dirección IP externa.
secret= p@55w0Rd#3
dtmfmode=auto
; Una contraseña segura para el dispositivo
;acepta tonos de marcado desde los dispositivos, negociado de forma
automática
; desactiva los codecs de voz que este dispositivo aceptará u ofrecerá
;los codecs de audio que se aceptara y solicitara, el dispositivo
; en orden de preferencia
disallow=all
allow=ulaw
allow=alaw
; Define un nombre de dispositivos y usa la plantilla phone-interno
[0000FFFF0001](phone-interno)
; Define otro nombre de dispositivos y usa la plantilla phone-interno
[0000FFFF0002](phone-interno)
Abra el archivo sip.conf que acaba de crear, y vamos a repasar cada elemento.
Hemos creados cuatros secciones, la primera es la sección [general]. Esta es una sección estándar que
aparece en el tope de los archivos de configuración para todos los módulos de canales, y debe siempre
ser nombrada de esta manera. La sección [general] contiene opciones generales de configuración que
define como los protocolo se relacionan con el sistema, y puede ser usada para definir los parámetros
por defecto también.
Por ejemplo, hemos definido el contexto predeterminado como no-autenticado, para asegurarnos de
que hemos declarado expresamente que las llamadas entrantes de invitados no autenticados entrarán
en el plan de marcado (en lugar de dejarlas a la casualidad). Lo hemos nombramos no-autenticado para
que sea obvio que las llamadas procesadas en este contexto no son de confianza, por lo que no será
capaz de hacer como llamadas al PSTN (lo que podría costar dinero, o representar un robo de
identidad). Usted debe ser consciente de que podríamos haber usados cualquier nombre que
quisiéramos, y también que es necesario que haya un contexto con el mismo nombre en el
extensions.conf para definir el flujo de llamadas para las llamadas no autenticadas.
La próxima opción es allowguest, la cual hemos deshabilitado, ya que no queremos aceptar las llamadas
no autenticadas en este momento. Tenga en cuenta que para algunos canales es posible que quiera
aceptar llamadas no autenticadas. Un uso común para permitir llamadas no autenticadas es para las
empresas que permiten la marcación mediante identificadores de recursos uniformes (URIs), como las
direcciones de correo electrónico. Si queremos que los clientes nos llamen desde sus teléfonos sin tener
que autenticarse, podríamos permitir llamadas a invitados y manejarlas en el contexto no-autenticado
que definimos en la opción anterior.
Usted se estará preguntando por qué podría querer permitir llamadas sin autenticar. La razón es
que si usted pública su URI SIP en sus tarjetas de presentación (por ejemplo, sip:[email protected]),
las llamada al URI fallara si el contexto no-autenticado simplemente cuelga. En cambio, lo que usted
quiere es que su contexto no-autenticado ponga las llamadas entrantes en un entorno controlado.
Es posible que desee permitir las llamadas, pero no necesariamente va a confiar en ellos.
La opción srvlookup se utiliza para que Asterisk realice una búsqueda a través de un registro DNS SRV,
que se utiliza típicamente para las conexiones salientes hacia los proveedores de servicios.
La opción udpbindaddr toma el valor de una dirección IP o 0.0.0.0 para decirle a Asterisk cual interfaz de
red debe escuchar las peticiones realizadas por el protocolo de transporte UDP (que es el protocolo que
en realidad lleva los canales de voz). Al definir 0.0.0.0, estamos instruyendo el canal de driver para que
escuche en todas las interfaces disponibles. Alternativamente, se podría limitar las conexiones VoIP para
este protocolo que escuche una única interfaz mediante la definición de la dirección IP de una interfaz
de red específica en nuestro sistema.
“IPv6 en sip.conf
Desde la versión 1.8, Asterisk soporta IPv6, tanto para el tráfico SIP y RTP. Todas las opciones de
configuración en /etc/asterisk/sip.conf relacionada con las direcciones IP pueden aceptar ya sea una
dirección IPv4 o una dirección IPv6. Como ejemplo, considere los diferentes valores de la opción
udpbindaddr:
Valor udpbindaddr
192.168.10.15
Descripción
Enlazar a una dirección específica de IPv4.
3001:dc4::1
Enlazar a una dirección específica de IPv6.
0.0.0.0
Enlazar a todas dirección IPv4 en el sistema
::
Enlazar a todas dirección IPv4 y IPv6
También están las opciones tlsenable y tlsbindaddr para habilitar SIP sobre TLS (SIP encriptado).”
La siguiente sección la hemos definido como una plantilla para la cual elegimos el nombre de [phoneinterno](!). La hemos creado como una plantilla para que podamos utilizar los valores dentro de ella
para todos nuestros dispositivos.
“Poner (!) después del nombre de la sección le dice a Asterisk que trate esta sección como una
plantilla. De esta manera eliminamos la necesidad de repetitivamente agregar y cambiar las opciones
de configuración para cada dispositivo que hayamos definido. Las plantillas son extremadamente
útiles y están disponibles en todos los archivos de configuración de Asterisk. Si desea cambiar alguna
cosa que se ha definido previamente en la plantilla para un dispositivo individual, puede hacer esto
debajo del encabezado de la sección, y esto sobrescribirá lo que fue definido previamente en la
plantilla. No es necesario usar plantillas, pero son extremadamente útiles, y nosotros las utilizamos
ampliamente.”
En la plantilla [phone-interno] hemos definido varias opciones necesarias para la autenticación y el
control de llamadas desde y hacia los dispositivos que utilizan esta plantilla. La primera opción que
hemos configurado es el type, la cual la definimos como friend. Esto le indica al controlador del canal
para intentar coincidir con el nombre primero, y luego la dirección IP.
En el ejemplo que hemos dado, la configuración de los teléfonos SIP se configura con type=friend. Hay
otras dos definiciones de type que pueden utilizarse: user y peer. La diferencia entre ellas tiene que ver
con la forma en que Asterisk interpreta las solicitudes SIP entrantes. Las reglas son cubiertas en la
siguiente tabla:
Type
Peer
Descripción
Machea peticiones entrantes para una entrada de configuración utilizando la dirección
IP de origen y el número de puerto.
User
Machea las solicitudes entrantes para una entrada de configuración usando el nombre
de usuario desde el encabezado de la solicitud SIP. Este nombre coincide con una
sección en sip.conf con el mismo nombre encerrado en corchetes.
Friend
Esto permite que las reglas coincidan con ambos peer y user. Esta es la configuración
más utilizada para los teléfonos SIP.
Cuando una solicitud desde un teléfono es recibida u autenticada por Asterisk, el número de extensión
solicitado es manejado por el dialplan en el contexto definido en la configuración del dispositivo; en
nuestro caso, el contexto nombrado Local.
La opción de host se utiliza cuando es necesario enviar una solicitud al teléfono (por ejemplo, cuando se
quiere llamar a alguien). Asterisk necesita saber dónde está el dispositivo sobre la red. Al definir el valor
como dynamic, dejamos saber a Asterisk que el teléfono nos dirá dónde está en la red en lugar de tener
su ubicación definida estáticamente. Si quisiéramos establecer la dirección estática, podríamos
reemplazar dynamic con una dirección IP como 192.168.12.28.
La opción NAT es usada para decirle a Asterisk que active algunos trucos para hacer que las llamadas
telefónicas funcionen cuando un teléfono SIP puede estar situado detrás de un NAT. Esto es importante
debido a que el protocolo SIP incluye las direcciones IP en los mensajes. Si el teléfono se encuentra en
una red privada, este puede terminar poniendo la dirección IP privadas en los mensajes SIP, que a
menudo no son útiles.
La contraseña para el dispositivo se define por el parámetro secret. Si bien esto no es estrictamente
necesario, debe tener en cuenta que es muy común que personas poco recomendables ejecuten scripts
de phishing en busca de cuentas VoIP expuestas con contraseñas inseguras y nombres de dispositivos
simples (tales como dispositivo con nombre 100 y contraseña 1234). Si utilizamos nombre de dispositivo
poco común como una dirección MAC y una contraseña que sea un poco más difícil de adivinar,
podemos reducir significativamente el riesgo de nuestro sistema si necesitamos exponerlo al mundo
exterior.
Usted puede generar una contraseña segura usando uno de los varios generadores de contraseña
disponible en Internet y sobre su sistema operativo. Aquí hay un simple script que se puede ejecutar
en la consola para generar una:
$ dd if=/dev/random count=1 bs=8 2>/dev/null | base64 | sed -e 's/=*$//'
La opción dtmfmode se utiliza para definir cuales formatos DTMF (marcación por tonos) Asterisk debe
esperar que sean enviado por el teléfono. Las cuatros opciones son: info, inband, rfc2833, y auto. El
valor Info significa usar el método SIP INFO, inband es para el tono de audio en la misma banda, y
rfc2833 es para el método fuera de banda definido para ese RFC. Usando la opción auto le permite a
Asterisk determinar automáticamente cual modo DTMF usar (se prefiere rfc2833 si está disponible).
Las últimas dos opciones, disallow y allow, se utilizan para controlar cuales codecs de audio son
aceptados y ofrecidos para el teléfono. Por definir disallow=all primero, le estamos diciendo Asterisk
que reinicialice cualquier definición de códec previamente establecida en la sección [general] (o en los
valores predeterminados internos); Luego declaramos explícitamente cuales codecs aceptaremos (y en
el orden que preferimos). En nuestro ejemplo hemos habilitado dos ulaw y alaw, con ulaw como el más
preferido (si se encuentra fuera de Canadá o los EE.UU., es probable que desee declarar alaw primero).
Ahora que hemos terminado con nuestra plantilla, podemos definir nuestros nombres de dispositivo y,
utilizando la plantilla phone-interno, simplificara en gran medida el nivel de detalle requerido en cada
sección de dispositivo. El nombre del dispositivo se define dentro de corchetes, y la plantilla que se
aplicará se define en los paréntesis que siguen al nombre del dispositivo. Podemos añadir opciones
adicionales al nombre del dispositivo, especificando esta debajo del nombre del dispositivo:
[000FFFF0001](phone-interno) ; la plantilla debe estar en la misma línea y sin espacios.
Secret= p@55w0Rd#3 ; no utilice esta contraseña es solo un ejemplo!
allow=gsm
Cuando el módulo SIP lee el archivo de configuración sip.conf, interpreta cada sección incluida en la
plantilla. En el ejemplo de canal anterior, por lo tanto, será configurado como si hubiera sido escrito así:
[0000FFFF0001]
type=friend
context=Local
host=dynamic
nat=yes
dtmfmode=auto
disallow=all
allow=ulaw
allow=alaw
secret= p@55w0Rd#3 ; sobre escribe el secret desde la plantilla
allow=gsm
; agrega gsm a la lista de codecs permitido
; El resto de las opciones se definieron sólo para este canal.
Tenga en cuenta que si usted especifica una opción que también fue definida en la plantilla, el módulo
verá esa opción dos veces. Para la mayoría de las opciones, los valores en la sección del canal
sobrescribirán los valores obtenidos de la plantilla, sin embargo, para algunas opciones, como el type,
allow y disallow, pueda que no la sobrescriba.
Firewalls y Traducción de dirección de red (NAT).
Una llamada telefónica usando el protocolo SIP realmente está compuesta de tres conexiones de redes
separada: 1) la conexión SIP (señalización de la llamada), 2) la salida del stream de audio (RTP), 3) el stream
de audio entrante (RTP).
Si un Firewall entre los dos extremos de la conexión no reconoce el stream RTP entrante (es decir, no asocia
este con la conexión SIP en curso), este es susceptible a descartar esta conexión. Cuando esto sucede, los
usuarios no serán capaces de oír un lado de la llamada telefónica.
Encontrar una solución coherente y fiable para esto es un dolor continuo para la comunidad SIP, teniendo en
cuenta los diferentes tipos de Firewall, y las muchas maneras diferentes en que el protocolo SIP se puede
implementar (no sólo por Asterisk, sino también por todos los demás dispositivos SIP y sistemas en uso hoy
en día).
IAX.CONF
IAX2 es sinónimo de Inter-Asterisk eXchange Protocol, versión 2. IAX2 fue diseñado para simplificar el
proceso de llevar las llamadas de VoIP a través de los Firewall (por llevar la señalización y los datos a
través de la misma conexión), y para atravesar fácilmente las redes que implementan dispositivos NAT
(que históricamente han sido un problema para el protocolo SIP).
Como Asterisk se ha desarrollado a lo largo de los años, el protocolo IAX2 ha madurado. Un RFC
informativo (RFC 5456 - IAX: Inter-Asterisk Exchange versión 2) se publicó en 2010. Sin embargo, IAX2 no
se ha convertido en popular entre los fabricantes de hardware, posiblemente debido a la relativa
novedad del RFC IAX2, pero sin duda, en gran parte debido al hecho de que SIP es, el protocolo VoIP más
reconocido en términos de reconocimiento (es decir, la gente no técnicas han probablemente oído
hablar más de SIP que cualquier otro protocolo VoIP). IAX2, sin embargo, tiene ventajas que hacen que
valga la pena discutirlo.
Una de las principales ventajas de IAX es la penetración del firewall a través de un solo puerto. Todo el
tráfico, incluyendo la señalización y los datos de audio, es transferido sobre un único puerto UDP (por
defecto, el puerto 4569), que puede simplificar en gran medida la configuración y solución de problemas
de las conexiones externas a Asterisk.
Otra de las ventajas de IAX2 es su capacidad de trunking, el cual encapsula paquetes para varios frames
de voz dentro de un mismo datagrama usando un solo encabezado IAX2. El beneficio de esto es una
reducción en la cantidad de ancho de banda requerida para enviar muchas llamadas simultáneas entre
dos puntos finales. La cantidad de ancho de banda ahorrada con el trunking IAX2 al enviar sólo un par
de llamadas entre localizaciones es insignificante, pero cuando se inicia el escalamiento al tamaño de
decenas o cientos de llamadas, el ahorro puede ser sustancial.
Por ahora, sólo estamos interesados en la configuración mínima necesaria para conseguir que nuestros
dispositivo finales IAX2 se comuniquen entre sí, por lo que vamos a explorar lo necesarios para hacer la
configuración de iax.conf.
Puesto que IAX2 es más comúnmente utilizado para construir trunking entre sistemas Asterisk, vamos a
dar un ejemplo de esto (en lugar de un ejemplo del uso de IAX2 para dispositivos de usuario). Si usted
tiene un dispositivo de usuario IAX2 (como un softphone), encontrara que la familiaridad con el archivo
sip.conf le ayudará a configurar iax.conf para manejar las extensiones. En cada extremo, necesitará un
archivo iax.conf apropiado. En el directorio de configuración /etc/asterisk cree un archivo llamado
iax.conf, y agregue la siguiente información de configuración en el mismo:
[general]
autokill=yes
srvlookup=no
; si el otros dispositivo no responde no permanece por mucho tiempo
; desactiva búsquedas DNS SRV para las llamadas salientes
; ----------------------------------------------------------------------------------------------------------[office-trunk]( !)
type=friend
context=Local
delayreject=yes
disallow=all
allow=ulaw
allow=alaw
; Plantilla para las conexiones entre oficinas basadas IAX
; Asterisk le permite hacer y recibir llamadas
; el contexto en que las solicitudes entrantes entrarán en el dialplan
; demora la autenticación rechazada (limita los ataques de fuerza bruta)
; desactiva los codec de voz disponible
; prefiere el codec ulaw
; pero también permite el codec alaw
; ------------------------------------------------------------------------------------------------------------[office-one](office-trunk)
secret=PwdSe#5REt0
host= 192.168.100.15
; define un trunk para nuestra primera localización
; Una contraseña segura --- No usar esta!
; dirección IP del servidor Asterisk en el otro extremo de esta conexión.
; --------------------------------------------------------------------------------------------------------------[office-two](office-trunk)
secret= a7ZVEy8KLGR
Host=192.168.100.14
; define un trunk para la segunda localización usando la misma plantilla
; Una contraseña segura --- No use esta!
; dirección IP del servidor Asterisk en el otro extremo (el principal)
; -------------------------------------------------------------------------------------------------------------------[phone-iax]( !)
type=firend
host=dynamics
secret=p@55w0Rd#3
cotext=Local
nat=yes
dtmfmode=auto
disallow=all
allow=ulaw
allow=alaw
; plantilla con todas las opciones comunes para registrar los teléfonos IAX2
; Permite hacer y recibir llamadas
; El dispositivo tiene que registrarse con Asterisk para informa su ubicación
; Usar una contraseña segura; No usar esta!
; contexto donde entrara las llamadas en dialplan
; reinicia todos los códec por defecto
; Permite los códec ulaw, como preferido
; También permite los códec alaw.
[0000ffff0004](phone-iax)
[0000ffff0005](phone-iax)
; Define un nombre de canal para registrar dispositivo IAX
; Define otro nombre de canal para registrar dispositivo IAX
El contexto Local está siendo usado en este ejemplo para simplificar las cosas. En un ambiente en
producción, lo más habitual es construir contextos diferentes para manejar sus facilidades de trunking.
Esto es especialmente importante para la seguridad, ya que siempre hay que minimizar el riesgo de las
llamadas no autorizadas.
Vamos a repasar las opciones que hemos añadido a este archivo, comenzando primero con la sección
[general]. Aquí es donde definimos nuestra configuración por defecto, las opciones globales, y nuestra
configuración general del controlador de canal. Hay muchas opciones que podemos definir aquí, y le
animamos a chequear el archivo iax.conf.sample en el directorio configs de su fuente de Asterisk, pero
como lo que estamos buscando es una configuración sencilla, vamos a permitir que muchos de las
opciones predeterminadas sean aplicada.
La siguiente sección que hemos definido se llama [oficce-trunk](!), que es una plantilla que contiene las
opciones comunes para todos nuestros circuitos IAX.
“Como se mencionó en la sección anterior, poner (!) después del nombre de la sección. Le dice a
Asterisk para tratar esta sección como una plantilla. Las plantillas son bastante útiles.”
La primera opción que hemos configurados en nuestra plantilla es el type. Definimos el type=firend, lo
cual le dice a Asterisk que nosotros planeamos ambos hacer llamadas para el circuito y recibir solicitud
de llamadas desde el circuito.
Los otros dos tipos son user y peer. En IAX2, el type friend es una combinación de user y peer, que es
común porque en los troncos entre oficinas típicamente las llamadas fluyen en ambos sentidos.
Podríamos definir alternativamente dos secciones distintas con el mismo nombre con el type de user
y peer, y luego definir sólo la información necesaria para cada uno de esos type, o si sólo esperamos
enviar llamadas a o realizar llamadas usando una sección (como en el caso de un proveedor de
servicio que únicamente ofrece llamadas entrada o sólo saliente), definiríamos este únicamente
como user o peer. Sin embargo, en la gran mayoría de los casos, la utilización del type=friend es la
elección más lógica.
Después de la opción type, hemos establecido host como dynamic, lo cual significa que el teléfono se
registra con el servidor Asterisk para indicar donde está ubicado sobre la red (para que sepamos a
dónde enviar sus llamadas). Alternativamente, podemos definir una dirección IP estáticas, tal como
192.168.100.128, donde todas las llamadas serán enviadas y recibida. Esto únicamente trabajara si el
dispositivo siempre tiene la misma dirección IP.
La opción context define el contexto en cual este canal entrara en el dialplan. Cuando se realiza una
llamada desde un teléfono y la solicitud es recibida por Asterisk, esta es manejada por la lógica definida
en el contexto configurado dentro del dialplan (extensions.conf).
La opción delayreject=yes dice Asterisk para introducir un pequeño retraso a cualquier mensajes
rechazado debido a un error de autenticación. El propósito de esto es aumentar el nivel de protección
contra los ataques de fuerza bruta (que en una configuración predeterminada se pueden ejecutar a
través de cientos de intentos, en cuestión de segundos).
Después le siguen las opciones disallow y allow. Estas definen los codecs que se permitirán para este
canal (en orden de preferencia). La Directiva disallow=all desactivas todos los codec por defecto que se
haya permitido en la sección [general] (o como parte de los valores por defecto de los canales). A
continuación, se definen los codecs específicos que queremos permitir. En nuestro ejemplo hemos
permitido explícitamente sólo los codecs ulaw y alaw. Estos son recomendados para propósito de
prueba.
Ahora que tenemos nuestra plantilla, podemos crear la definición de canales específico para cada
dispositivo final que queremos soportar. Tan sólo hay que especificar los parámetros no definidos en la
plantilla.
Hemos nombrados los dos canales, office-one y office-two. Usted puede nombra sus canales como
desee; tenga en cuenta que estamos usando type=friend, el canal tendrá que tener el mismo nombre en
ambos extremos del circuito, y por lo tanto se le debe dar un nombre que tenga sentido en ambos
extremos.
Hemos asignado nuestra plantilla office-trunk a ambos canales, que le asignará automáticamente todos
los parámetros en la plantilla a este canal.
El parámetro secret define la contraseña.
“Usted debe asegurarse de implementar una contraseña segura aquí, especialmente si usted planea
abrir su sistema al resto del mundo. No utilice algo estúpido, como 1234, o lo lamentarás. No, en
serio. No estamos bromeando. Ni siquiera en el laboratorio.”
El número de ataques exitoso en los sistemas de telefonía VoIP (no sólo Asterisk) va en aumento, y
seguirá empeorando. Comúnmente, las intrusiones con éxito se deben a contraseñas débiles. Si
consigue tener el hábito de usar contraseñas seguras desde ahora, tendrás mucha más protección en el
futuro.
Por último, se define la dirección IP del otro extremo de este circuito. Hemos optado por codificar la
dirección IP en este caso, sin embargo, también puede definir host como dynamic, que requerirá que el
otro extremo se regístrese para usted. Y eso es todo para IAX.
Modificando sus archivos de configuración de canal para su entorno
Nuestros ejemplos hasta ahora se han basado en los nombres de dispositivos hipotéticos. Para crear
canales reales basados en lo que usted tiene en su entorno, tendrá que cambiar el nombre del
dispositivo en sus archivos sip.conf y iax.conf a algo que tenga más sentido.
Por ejemplo, si usted tiene Polycom IP 430 con una dirección MAC de 0004f4217538, querrá definir un
identificador de dispositivo en sip.conf para dicho dispositivo:
[0004f4217538](phone-interno)
En sip.conf, también puede agregar un valor descriptivo, que puede verse en la consola de Asterisk al
ejecutar sip show peers. Por ejemplo:
[0004f4217538](phone-interno)
description= Teléfono Polycom IP430
Si usted tiene un softphone IAX en su PC que desea utilizar, en el archivo iax.conf puede tener algo como
esto:
[001a463b61fff](phone-interno)
secret= p@55w0Rd#3
Recuerde que usted puede nombrar a sus dispositivos con cualquier cosa que quieras (Asterisk no le
importa), pero para facilitar la administración, asegúrese de elegir una convención de nombres que sea
lógica, escalable, sostenible y segura (por lo que queremos decirles: no utilice números de extensión
como nombres de canales).
Teléfonos Digium con Asterisk
Digium ofrece una serie de teléfonos SIP que se han diseñado para trabajar con Asterisk. Si bien estos
son los teléfonos SIP estándar, la adición del módulo de DPMA (Digium Phone Module for Asterisk) para
Asterisk permite a estos dispositivos trabajar más estrechamente con Asterisk que cualquier otro
modelo de teléfono SIP. DPMA también permite configuración automatizada de las extensiones mucho
más fácil.
El Digium Phone Module for Asterisk (DPMA) es una tecnología patentada que
permite una conexión segura entre un sistema Asterisk y un teléfono de Digium. La ventaja de DPMA es
que la configuración de los dispositivos de usuario se simplifica en gran medida, junto con el hecho de
que las extensiones con DPMA habilitados pueden ser más estrechamente integradas con las
funcionalidades de Asterisk. Las integraciones de Asterisk específica habilitada por DPMA incluye:
•
•
•
•
•
Un proceso de aprovisionamientos simplificados. Los teléfonos descubren automáticamente los
servidores Asterisk y recuperan su configuración.
Los contactos agregados al teléfono pueden ser almacenados en el servidor Asterisk.
Integración con las siguientes características de Asterisk: correo de voz, directorio, parqueo de
llamadas, grabaciones de llamadas, colas de llamadas, y más.
Soporte presencial de usuario mejorado.
La capacidad de crear aplicaciones personalizadas en JavaScript que se ejecutan en el teléfono.
En el momento que se escribió este libro esta capacidad estaba todavía en fase beta, pero es
seguro que será una adición muy potente.
Documentación detallada sobre como configurar DPMA pueden ser encontrada en Digium wiki.
Cargando sus nuevas configuraciones de canal
Con el fin de informar a Asterisk de las nuevas configuraciones, tendrá que pasar un comando que le
indica que vuelva a cargar el archivo de configuración correspondiente. El Asterisk CLI es donde usted
puede pasar varios comandos para un sistema Asterisk.
El Asterisk CLI
La mejor manera para ver que está pasando con su sistema es a través del Asterisk CLI. Esta interfaz
proporciona varios niveles de salida que le permite conocer lo que está sucediendo en el sistema, y
ofrece una gran cantidad de utilidades para permitirle afectar la ejecución de su sistema. Comience por
llamar el Asterisk CLI y vuelva a cargar los archivos de configuración para los módulos de canal:
$ sudo asterisk -r
*CLI> module reload chan_sip.so
*CLI> module reload chan_iax2.so
Verifique que sus nuevos canales hayan sido cargados:
*CLI> sip show peers
*CLI> sip show users
*CLI> iax2 show peers
*CLI> iax2 show users
En este punto, el sistema Asterisk ha sido configurado para manejar los registros de los dispositivos
definidos. Todo lo que hace el registro es definir la ubicación de un dispositivo. El registro en sí
mismo no tiene nada que ver con si una extensión se le permite hacer llamadas o no (aunque el
registro con éxito sugiere que la extensión está utilizando las credenciales correctas, y por tanto es
probable que también tenga éxito en la realización de llamadas).
Las llamadas hacia y desde las extensiones no funcionarán hasta que la configuración de los
dispositivos se haya completado. Dado que cada dispositivo es diferente en este sentido, las
instrucciones de configuración detalladas para cada modelo están fuera del alcance de este libro. La
mayoría de los fabricantes de dispositivos proporcionan excelentes instrucciones para la
configuración, y en muchos casos ofrecen ejemplos específicos para Asterisk.
Probar que sus dispositivos se han registrado
Una vez que el dispositivo se ha registrado en Asterisk, usted será capaz de consultar la ubicación y el
estado del dispositivo desde CLI de Asterisk.
Para comprobar el estado de registración de un dispositivo, simplemente llame el Asterisk CLI:
$ sudo asterisk –r
Escriba el comando siguiente que retorna una lista de todos los peers que Asterisk conoces
(independientemente de su estado):
*CLI> sip show peers
Name/username
Host
0000FFFF0001/0000FFFF0001 192.168.1.100
0000FFFF0002/0000FFFF0002 192.168.1.101
Dyn
Nat
D
D
N
N
ACL
Port
Status
5060
5060
Unmonitored
Unmonitored
Usted puede notar que el campo Name/username no siempre muestra el nombre completo del
dispositivo. Esto se debe a que este campo está limitado a 25 caracteres.
Note que el estatus en nuestro ejemplo es establecido como Unmonitored. Esto es porque nosotros no
estamos usando la opción qualify=yes en nuestro archivo sip.conf.
Teléfonos Análogos
Hay dos métodos populares para conectar los teléfonos analógicos con Asterisk. El primero es mediante
el uso de un ATA que se conecta más comúnmente a Asterisk usando el protocolo SIP. La configuración
de Asterisk para usar un ATA es la misma que sería para cualquier otro teléfono basado en SIP. El otro
método es conectar directamente los teléfonos al servidor Asterisk usando hardware de telefonía de un
vendedor tal como Digium. Digium vende tarjetas telefónicas que se pueden agregar a su servidor para
proporcionar puertos FXS para conectar teléfonos analógicos (o fax). A los fines de demostrar la
configuración, vamos a mostrar la configuración necesaria si tuviera una tarjeta AEX440E Digium, que es
una AEX410 PCI Express con cuatros módulos FXS y cancelación de eco basado en hardware.
Independientemente del hardware que está utilizando, consulte la documentación del
fabricante para conocer los requisitos de configuración específicos del hardware.
En primer lugar, asegúrese de que tanto Asterisk y DAHDI están instalados (refiérase a "Cómo instalar
esto" en la página 63 para obtener instrucciones). Tenga en cuenta que DAHDI debe ser instalado antes
de instalar Asterisk. Cuando instale DAHDI, asegure de instalar el init scrit también (que en la mayoría de
los casos se instala de forma automática, de lo contrario, utilice make config desde el directorio tools).
Esto asegurará que su hardware es apropiadamente inicializado cuando el sistema se inicia. El init script
es instalado desde el paquete DAHDI-tools.
El init script utiliza el archivo /etc/dahdi/modules para determinar qué módulos deben ser cargados
para soportar el hardware en el sistema. La instalación del init script intenta configurar
automáticamente el archivo para usted, pero usted debe comprobarlo para asegurarse de que es
correcto:
# Autogenerated by tools/xpp/dahdi_genconf (Dahdi::Config::Gen::Modules) on
# Tue Jul 27 10:31:46 2010
# If you edit this file and execute tools/xpp/dahdi_genconf again,
# your manual changes will be LOST.
wctdm24xxp
Hay uno o más archivo de configuración requerido para DAHDI: /etc/dahdi/system.conf. Luce como
este:
# Specify that we would like DAHDI to generate tones that are
# used in the United States.
loadzone = us
defaultzone = us
# We have 4 FXS ports; configure them to use FXO signaling.
fxoks = 1-4
Esta configuración asume que la tarjeta está siendo usa en Estado Unidos. Para ver algunos detalles
sobre internacionalización refiérase al capítulo de Internacionalización.
Si la tarjeta que está configurando no cuenta con cancelación de eco basado en hardware, tendrá que
añadir una línea más a /etc/dahdi/system.conf para permitir la cancelación de eco basada en software:
echocanceller = mg2,1-4
MG2 es el cancelador de eco que viene con el paquete oficial DAHDI. Otro cancelador de ecos open
source compatible con DAHDI es OSLEC (Open Source Line Echo Canceller). Las mayoría de las
persona reportan excelentes resultados con OSLEC (este está incluido en el kernel de Linux). Para
más información sobre la instalación de OSLEC, vea esta página web.
Ahora, use el init script para cargar los módulos apropiados e inicializar el hardware:
$ sudo /etc/init.d/dahdi start
Loading DAHDI hardware modules:
wctdm24xxp:
[ OK ]
Running dahdi_cfg:
[ OK ]
Ahora que DAHDI se ha configurado, es hora de pasar a la configuración correspondiente de Asterisk.
Una vez instalado Asterisk, asegúrese de que el módulo chan_dahdi se ha instalado. Si no se ha cargado
en Asterisk, compruebe si existe en /usr/lib/asterisk/modules. Si está ahí, edite
/etc/asterisk/modules.conf para cargar chan_dahdi.so. Si el modulo no está presente sobre el disco,
DAHDI no fue instalado antes de instalar Asterisk; vuelva atrás e instale DAHDI ahora (ver "DAHDI" en la
página 63 para más detalles). Usted puede verificar si está presente mediante el siguiente comando:
*CLI> module show like chan_dahdi.so
Module
Description
chan_dahdi.so
DAHDI Telephony Driver
1 modules loaded
Use
0
Count
A continuación, debe configurar /etc/asterisk/chan_dahdi.conf. Este es el archivo de configuración para
el módulo chan_dahdi, que es la interfaz entre Asterisk y DAHDI. Debe verse así:
[trunkgroups]
; No se necesitan grupos de troncales en esta configuración.
[channels]
; El contexto channels es usado cuando se definen canales usando métodos obsoletos.
; No use este como un nombre de sección.
[telefonos](!) ; Una plantilla para guarda todas las opciones comunes para los teléfonos.
usecallerid = yes
hidecallerid = no
callwaiting = no
threewaycalling = yes
transfer = yes
echocancel = yes
echotraining = yes
immediate = no
context = Local
signalling = fxo_ks
; Use señalización FXO para un canal FXS.
[telefono1](telefono)
callerid = "Marcos Jhonson" <(809)483-1212>
dahdichan = 1
[telefono2](telefono)
callerid = "Lían Massiel" <(809)483-1213>
dahdichan = 2
[telefono3](telefono)
callerid = "Juan López" <(809)483-2131>
dahdichan=3
[telefono4](telefono)
callerid = "Mateo Randal" <(809)483-2113>
dahdichan=4
Puede comprobar que Asterisk ha cargado la configuración ejecutando el comando dahdi show
channels desde el CLI:
*CLI> dahdi show channels
Chan Extension
Context
pseudo
default
1
Local
2
Local
3
Local
4
Local
Language
MOH Interpret
default
default
default
default
default
Blocked
State
In Service
In Service
In Service
In Service
In Service
Para información detallada sobre un canal especifico, puedes correr el comando dahdi show channel 1.
Un dialplan básico para probar sus dispositivos
No vamos a profundizar demasiado en el plan de marcado todavía, pero un dialplan inicial será útil para
probar sus dispositivos que recientemente sean registrado. Coloque el siguiente contenido en
/etc/asterisk/extensions.conf:
[Local]
exten => 101,1,Dial(SIP/0000FFFF0001)
exten => 102,1,Dial(SIP/0000FFFF0002)
exten => 104,1,Dial(IAX2/0000FFFF0004)
exten => 105,1,Dial(IAX2/0000FFFF0005)
; Remplace 0000FFFF0001 con su nombre de dispositivo
; Remplace 0000FFFF0002 con su nombre de dispositivo
; Remplace 0000FFFF0004 con su nombre de dispositivo
; Remplace 0000FFFF0005 con su nombre de dispositivo
;
; Esto le permitirá marcar cada uno de los 4 teléfonos analógicos configurados
; en la sección previa.
exten => 106,1,Dial(DAHDI/1)
exten => 107,1,Dial(DAHDI/2)
exten => 108,1,Dial(DAHDI/3)
exten => 109,1,Dial(DAHDI/4)
exten => 200,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
exten => 4001,1,Dial(IAX2/office-one/101) ; Marque la extensión 101 en la oficina principal
exten => 4002,1,Dial(IAX2/office-one/102) ; Marque la extensión 102 en la oficina principal
exten => _4XXX,1,Dial(IAX2/office-one /${EXTEN})
Este plan de marcado básico le permitirá marcar los dispositivos SIP utilizan extensiones 101, 102. Y los
dispositivos IAX2 pueden ser marcados en las extensiones 104 y 105. Las cuatros líneas de la tarjeta
analógica se pueden marcar con las extensiones 106 al 109, respectivamente. También puedo escuchar
un mensaje hello-world por marcar la extensión 200. Marcar 4 más cualquier número de tres dígitos
intentará enviar la llamada a través de su tronco IAX a la oficina principal. Todas estas extensiones son
números arbitrarios, y podría ser lo que quieras. Además, esto no es en absoluto un dialplan completo,
vamos a profundizar más en los capítulos posteriores.
Usted necesita volver a cargar el dialplan para que los cambios surtan efecto. Puedes recargar esto
desde el shell de Linux:
$ asterisk -rx "dialplan reload"
O desde el CLI de Asterisk:
*CLI> dialplan reload
Ahora debería ser capaz de marcar entre las dos nuevas extensiones. Abre el CLI para ver el progreso de
la llamada. Debería ver algo como esto (y la extensión que está llamando debe sonar):
-- Executing [100@Local:1] Dial("SIP/0000FFFF0001-0000000c","SIP/0000FFFF0001") in new stack
-- Called 0000FFFF0001
-- SIP/0000FFFF0001-0000000d is ringing
Si esto no sucede, debe revisar su configuración y asegurarse de que no haya cometido algún error.
Capı́tulo 8
Fundamentos del Dialplan
El dialplan (plan de marcado) es el corazón de su sistema Asterisk. Este define como fluyen llamadas
entrantes y salientes del sistema. Es una forma de lenguaje de script, el dialplan contiene instrucciones
que Asterisk sigue en repuesta a eventos externo. En contraste con los sistemas telefónicos
tradicionales, el dialplan de Asterisk es completamente personalizable.
Este capítulo introduce a los conceptos esenciales del dialplan. La información que aquí se presenta es
fundamental para comprender la codificación de dialplan y será la base de cualquier plan de marcado
que escriba. Los ejemplos se han diseñado para seguir uno tras otro, y le recomendamos que no saltes
demasiado en este capítulo, ya que es tan fundamentalmente importante para Asterisk. Tenga también
en cuenta que este capítulo no es en absoluto un estudio exhaustivo de todas las cosas posibles que el
dialplan puede hacer, nuestro objetivo es cubrir sólo lo esencial. Vamos a cubrir tópicos del dialplan más
avanzado en los capítulos posteriores. Le animamos a continuar.
Sintaxis del dialplan
El dialplan de Asterisk es especificado en el archivo de configuración llamado extensions.conf.
El archivo extensions.conf usualmente reside en el directorio /etc/Asterisk, pero esta localización
puede variar dependiendo sobre como usted instale Asterisk. Otras localizaciones comunes para este
archivo incluyen /usr/local/etc/asterisk y /opt/etc/asterisk.
El plan de marcado se compone de cuatro conceptos principales: contextos, extensiones, prioridades y
aplicaciones. Después de explicar el papel que cada uno de estos elementos desempeña en el dialplan,
tendremos que construir un dialplan básico, pero funcional.
Archivos de configuración de ejemplo
Si ha instalado los archivos de configuración de ejemplo al instalar Asterisk, lo más probable es que tenga un
archivo extensions.conf existente. En lugar de iniciar con el archivo de ejemplo, le sugerimos que usted
construye su archivo extensions.conf desde cero. Comenzando con el archivo de ejemplo no es la mejor o
más fácil manera de aprender a construir su dialplan. Dicho esto, el archivo extensions.conf de ejemplo
sigue siendo un recurso fantástico, lleno de ejemplos e ideas que se pueden utilizar después de haber
aprendido los conceptos básicos. Si ha seguido las instrucciones de instalación, encontrará el archivo
extensions.conf.sample en la carpeta ~/src/asterisk-complete/asterisk/11/configs (junto con muchos otros
archivos de configuración de ejemplo).
Contextos
El dialplan se divide en sección llamadas contextos. Los contextos evitan que las diferentes partes del
dialplan interactúen una con otra. Una extensión que es definida en un contexto es completamente
aislada de otra extensión en cualquier otro contexto, a menos que la interacción sea específicamente
permitida. (Veremos cómo permitir las interacciones entre contexto casi al final del capítulo).
Un ejemplo simple, imaginemos que tenemos dos empresas que comparten un servidor Asterisk. Si
ponemos la operadora automatizada de cada compañía en su propio contexto, se separan
completamente una de otra. Esto nos permite definir de forma independiente que ocurre cuando, por
ejemplo, la extensión 0 es marcada: si la persona que llamo marco el 0 desde el menú de voz de la
compañía A este será transferido con la recepcionista de la compañía A, mientras que si alguien marca el
0 desde el menú de voz de la compañía B este será transferido con la recepcionista de la compañía B.
(Esto es asumiendo, por supuesto, que nosotros le hemos dicho Asterisk para transferir las llamadas a
las recepcionistas cuando los llamantes, pulsen 0.)
Los contextos se definen colocando el nombre del contexto dentro de corchetes ([ ]). El nombre puede
estar formado por letras de la A a la Z (mayúsculas y minúsculas), los números del 0 al 9, el guion y el
guion bajo. Un contexto para las llamadas entrantes podría tener este aspecto:
[entrantes]
Los nombres de contexto tienen una longitud máxima de 79 caracteres (80 caracteres -1 de
terminación nula).
Todas las instrucciones puestas después de una definición de un contexto son parte de ese contexto,
hasta la definición del siguiente contexto. Al inicio del dialplan, hay dos contextos especiales llamados
[general] y [globals]. La sección [general] contiene una lista de opciones de configuración generales (por
las cuales usted probablemente nunca tendrá que preocuparse), y nosotros discutiremos el contexto
[globals] en la sección “Variables globales” más adelante. Por ahora, sólo es importante saber que estas
dos etiquetas no son realmente contextos. Evite el uso de [general], [default] y [globals] como nombres
de contexto, pero por lo demás nombre su contexto con cualquier cosa que desee.
Cuando se define un canal (lo cual no se hace en el archivo extensions.conf, sino más bien, en archivos
como sip.conf, iax.conf, chan_dahdi.conf, etc.), uno de los parámetro requerido en cada definición de
canal es el contexto. El contexto es el punto en el dialplan donde las conexiones desde un canal se
iniciarán. Definir el valor contexto en el canal es la forma de conectar el canal con en el dialplan. La
imagen siguiente ilustra la relación entre los archivos de configuración de canal y el contexto en
dialplan.
Relación entre los archivos de configuración de canal y el contexto en el dialplan.
Este es uno de los conceptos más importantes para entender cuando se trata de canales y dialplan.
Una vez que entienda la relación de la definición de contexto en un canal con el contexto
correspondiente en el plan de marcado, usted encontrará que es mucho más fácil solucionar
problemas del flujo de llamadas a través de un sistema Asterisk.
Un uso importante de contextos (quizás el uso más importante) es proporcionar seguridad. Mediante el
uso correcto de los contextos, puede dar accesos a algunos usuarios a funciones (tales como llamadas
de larga distancia) que no se ponen a disposición de los demás. Si no diseñas su dialplan con cuidado, sin
darse cuenta puede permitir que otros utilicen fraudulentamente el sistema.
Extensiones
En el mundo de las telecomunicaciones, la palabra extensión usualmente se refiere a un identificador
numérico que, cuando es marcado, hace sonar un teléfono (o los recursos del sistema, tales como
correo de voz o una cola). En Asterisk una extensión es mucho más poderosa, ya que define una serie
única de pasos (cada paso contiene una aplicación) a través de los cuales Asterisk tomará una llamada.
Dentro de cada contexto, podemos definir tantas extensiones (o pocas) según sea necesario. Cuando se
activa una extensión particular (por una llamada entrante o por los dígitos que se han marcado en un
canal), Asterisk seguirá los pasos definidos para dicha extensión. Son las extensiones, por lo tanto, que
especifican lo que sucede con las llamadas mientras hacen su recorrido a través del dialplan. Aunque las
extensiones pueden, por supuesto, ser utilizadas para especificar las extensiones de teléfono en el
sentido tradicional (es decir, la extensión 153 hará que el teléfono SIP sobre en el escritorio de Juan
timbre), en un dialplan de Asterisk, se pueden utilizar para mucho más.
La sintaxis de una extensión es la palabra exten, seguida de una flecha formada por el signo de igual y el
signo mayor que, de esta manera:
exten =>
Esto es seguido por el nombre (o número) de la extensión. Cuando se trata de sistemas de telefonía
tradicionales, tendemos a pensar en extensiones como los números que usted marcaria para hacer que
otro teléfono timbre. En Asterisk, se obtiene muchas cosas más, por ejemplo, nombres de extensión
pueden ser cualquier combinación de números y letras. A lo largo de este capítulo y el siguiente, vamos
a utilizar las extensiones numéricas y alfanuméricas.
Cada paso en una extensión tiene tres componentes:
•
El nombre (o número) de la extensión.
•
La prioridad (cada extensión puede incluir múltiples pasos; los pasos numerados es la llamada
“prioridad”)
•
La aplicación (o comando) que tomara lugar en esos pasos.
Estos tres componentes son separados por comas, por ejemplo:
exten => nombre,prioridad,aplicación()
He aquí un ejemplo simple de cómo una extensión real podría ser:
exten => 123,1,Answer()
En este ejemplo, el nombre de la extensión es 123, la prioridad es 1, y la aplicación es Answer().
Prioridad
Cada extensión puede tener múltiples pasos, llamados prioridad. Las prioridades se numeran
secuencialmente, empezando por 1, y cada una ejecuta una aplicación específica. Como un ejemplo, la
siguiente extensión contesta el teléfono (en la prioridad número 1), y después cuelga (en la prioridad
número 2):
exten => 123,1,Answer()
exten => 123,2,Hangup()
Es bastante obvio que este código no hace realmente nada útil. Vamos a llegar allí. El punto clave a
tener en cuenta es que para una extensión en particular, Asterisk sigue las prioridades en orden. Este
estilo de sintaxis del dialplan se sigue viendo de vez en cuando, aunque (como se verá
momentáneamente) ya no se utiliza por lo general más, debido a un código nuevo:
exten => 123,1,Answer()
exten => 123,2,hacer algo
exten => 123,3, hacer otra cosa
exten => 123,4,hacer una última cosa
exten => 123,5,Hangup()
Prioridades sin numerar
En versiones anteriores de Asterisk, la numeración de las prioridades causó muchos problemas. Imagine
tener una extensión que tenía 15 prioridades, y luego tener que agregar algo en el paso 2: todas las
prioridades posteriores tendrían que ser manualmente renumerada. Asterisk no maneja los pasos
erróneos o prioridades mal numeradas, y la depuración de este tipo de errores fue frustrante.
A partir de la versión 1.2, Asterisk abordó este problema: se introdujo el uso de la prioridad n, que
significa "siguiente". Cada vez que Asterisk encuentra una prioridad n, toma el número de la prioridad
anterior y le agrega 1. Esto hace que sea más fácil hacer cambios en su plan de marcado, ya que no tiene
que reenumerar todos sus pasos. Por ejemplo, el plan de marcado podría ser algo como esto:
exten => 123,1,Answer()
exten => 123,n,hacer algo
exten => 123,n, hacer otra cosa
exten => 123,n,hacer una última cosa
exten => 123,n,Hangup()
Internamente, Asterisk calculará el siguiente número de prioridad cada vez que encuentra una n. Tenga
en cuenta que siempre debe especificar la prioridad número 1. Si coloca accidentalmente una n en vez
de 1 en la primera prioridad (un error común incluso entre los codificadores de dialplan con
experiencia), encontrarás que después de volver a cargar el dialplan que no existe la extensión.
El operador same =>
En el esfuerzo sin límite para simplificar los esfuerzos de codificación, un nuevo constructor fue creado
para hacer la creación y administración de extensiones aún más fácil. Siempre y cuando la extensión sea
la misma, en lugar de tener que escribir la extensión completa en cada línea, sólo tiene que escribir
same =>, seguido de la prioridad y la aplicación:
exten => 123,1,Answer()
same => n,hacer algo
same => n, hacer otra cosa
same => n,hacer una última cosa
same => n,Hangup()
El sangrado no es requerido, pero puede hacer más fácil la lectura. Este estilo de dialplan también hará
que sea más fácil copiar el código de una extensión a otra. Preferimos este estilo, y lo recomiendo
encarecidamente.
Prioridades etiquetadas
Las etiquetas de prioridad permiten asignar un nombre a una de las prioridades dentro de una
extensión. Esto es para asegurarse de que usted puede hacer referencia a una de las prioridades por
algo más que su número (que probablemente no se conoce, dado que el dialplan ahora generalmente
usan las prioridades sin numerar). La razón por la que es importante ser capaz de direccionar una
prioridad particular en una extensión es que a menudo querrá enviar las llamadas de otras partes del
dialplan a una prioridad particular en una extensión determinada. Ya hablaremos de eso más tarde. Para
asignar una etiqueta de texto a una prioridad, sólo tiene que añadir la etiqueta entre paréntesis después
de la prioridad, así:
exten => 123,n(etiqueta), aplicación()
Más adelante, vamos a cubrir cómo saltar entre las diferentes prioridades basado en la lógica del
dialplan. Vas a ver mucho más de las prioridades etiquetas, las cuales va utilizar con frecuencia en sus
dialplan.
Un error común cuando se escriben etiquetas es insertar una coma entre n y el (, como esto:
exten => 123,n,(etiqueta),aplicación() ; <-- ESTO NO VA A TRABAJAR
Este error romperá esta parte de su plan de marcado, y obtendrá un error que indica que la
aplicación no se puede encontrar.
Aplicaciones
Las aplicaciones son los caballos de batalla del dialplan. Cada aplicación realiza una acción específica
sobre el canal que actual, tal como reproducir un sonido, aceptar entradas de tonos de marcados,
buscar alguna cosa en una base de datos, marcar un canal, colgar una llamada, y así sucesivamente. En
el ejemplo anterior, se introdujeron dos aplicaciones sencillas: Answer() y Hangup(). Usted aprenderá
más sobre cómo estas aplicaciones trabajan.
Alguna aplicaciones, incluyendo Answer() y Hangup(), no necesitan otras instrucciones para hacer sus
trabajos. Las mayorías de las aplicaciones, sin embargo, requieren información adicional. Estos
elementos adicionales, o argumentos son pasados a las aplicaciones para afectar como ellas realizan sus
trabajos. Para pasar argumentos a una aplicación, colóquelos entre los paréntesis que siguen al nombre
de la aplicación, separados por comas.
En ocasiones, es posible que vea el carácter pipe (|) que se utiliza como separador entre los
argumentos, en lugar de una coma. A partir de Asterisk 1.6.0, el soporte para pipe como separador
se ha eliminado (salvo en algunas partes de voicemail.conf).
Las Aplicaciones Answer(), Playback() y Hangup()
La aplicación Answer() se utiliza para responder a un canal que está timbrando. Esta hace la
configuración inicial para el canal que recibe la llamada entrante. Como mencionamos anteriormente,
Answer() no toma argumentos, no es siempre requerida (de hecho, en algunos casos puede que no sea
deseable en lo absoluto), pero es una manera efectiva para asegurar que el canal es conectado antes de
realizar más acciones.
La Aplicación Progress()
A veces es útil ser capaz de pasar información a la red antes de contestar una llamada. La aplicación
Progress() intenta proporcionar información del progreso de la llamada al canal de origen. Algunos
operadores esperan esto, y por lo tanto usted puede ser capaz de solucionar problemas de
señalización mediante la inserción de Progress() en el dialplan donde las llamadas entrantes llegan.
En términos de facturación, el uso de Progress() permite al operador saber si está manejando la
llamada sin iniciar el contador de facturación.
La aplicación Playback es usada para reproducir un archivo de sonido para un canal, grabado
previamente. Las entradas desde el usuario son ignoradas. Lo cual significa que usted no puedo usar
Playback() en un auto attendant (contestadora automática), por ejemplo, a menos que no quiera
aceptar entradas en este punto.
Asterisk viene con muchos archivos de sonido grabados profesionalmente, los cuales pueden ser
encontrado en el directorio de sonido por defecto (normalmente /var/lib/asterisk/sounds). Al
compilar Asterisk, puede optar por instalar varios paquetes de sonidos de ejemplo que han sido
grabados en varios idiomas y formatos de archivos. Vamos a utilizar estos archivos en la mayoría de
nuestros ejemplos. Varios de los archivos de los ejemplos provienen del paquete de sonido extra, así
que por favor tome el tiempo para instalarlo (consulte el capítulo 5). Más adelante en el libro,
hablaremos acerca de cómo se puede utilizar un teléfono y el dialplan para crear y administrar sus
propias grabaciones del sistema.
Para utilizar Playback(), especifique un nombre de archivo (sin extensión) como argumento. Por
ejemplo, Playback(nombre-archivo) reproducirá el archivo de sonido llamado nombre-archivo.wav,
asumiendo que se encuentra en el directorio de sonido por defecto. Tenga en cuenta que puede incluir
la ruta completa del archivo si lo desea, de esta manera:
Playback(/home/Juan/sounds/nombre-archivo)
El ejemplo anterior reproduciría nombre-archivo.wav del directorio de sonidos /home/juan/sounds.
También puede utilizar rutas relativas desde el directorio de sonidos de Asterisk, de la siguiente manera:
Playback(custom/nombre-archivo)
En este ejemplo reproduciría nombre-archivo.wav desde el subdirectorio /custom del directorio de
sonido por defecto (probablemente /var/lib/asterisk/sounds/custom/nombre-archivo.wav). Tenga en
cuenta que si el directorio especificado contiene más de un archivo con ese nombre pero con diferentes
extensiones de archivo, Asterisk reproduce automáticamente el mejor archivo.
La aplicación Hangup() hace exactamente lo que su nombre implica: cuelga el canal activo. Usted debe
utilizar esta aplicación en el final de un contexto en el que desea finalizar la llamada actual, para
garantizar que las personas que llaman no continúen en el dialplan de una manera que no podría haber
anticipado. La aplicación Hangup() no requiere argumentos, pero se puede pasar un código ISDN si lo
desea, tal como Hangup(16).
A medida que avancemos a través del libro, vamos a introducir muchas más aplicaciones de Asterisk.
Un Dialplan Simple
Bien, suficiente teoría. Abra el archivo /etc/asterisk/extensions.conf, y vamos a echar un vistazo a su
primer dialplan (que fue creado en el capítulo 7). Vamos a añadir a eso.
Hola Mundo
Como es típico en muchos libros de tecnología (especialmente los libros de programación informática),
nuestro primer ejemplo se llama "Hola Mundo!"
En la primera prioridad de nuestra extensión, contestamos la llamada. En la segunda, reproducimos un
archivo de sonido llamado hello-world, y en la tercera prioridad colgamos la llamada. El código que nos
interesa para este ejemplo es el siguiente:
exten => 200,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
Si usted siguió leyendo a través del capítulo 7, ya tendrá un canal o dos configurado, así como el dialplan
de ejemplo que contiene este código. Si no es así, usted necesita un archivo extensions.conf en el
directorio /etc/asterisk que contenga el código siguiente:
[Local]
; Este es el nombre del contexto
exten => 101,1,Dial(SIP/0000FFFF0001) ; Remplace 0000FFFF0001 con el nombre de su dispositivo
exten => 102,1,Dial(SIP/0000FFFF0002) ; Remplace 0000FFFF0002 con el nombre de su dispositivo
exten => 200,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
Si usted no tiene este código del dialplan todavía, necesita agregarlo y volver a cargar el dialplan con el
siguiente comando desde CLI:
*CLI> dialplan reload
O desde el Shell de Linux con:
$ sudo /usr/sbin/asterisk –rx "dialplan reload"
Si llamas a la extensión 200 desde cualquiera de sus teléfonos que ha configurados debe escuchar el
mensaje: "Hola mundo". (Tenga en cuenta que para escuchar el mensaje en español debe tener los
prompts de sonido en español instalado y establecer el idioma español como predeterminado).
Si esto no funciona, compruebe la consola de Asterisk para los mensajes de error y asegúrese de que sus
canales están siendo asignados al contexto Local.
No recomendamos que continúe adelante en este libro hasta que haya verificado lo siguiente:
1. Que las llamadas entre la extensión 101 y 102 están funcionando.
2. Que cuando llama a la extensión 200 se reproduce el mensaje “Hola Mundo”
Aunque este ejemplo es muy corto y simple, hace hincapié en los conceptos básicos de contextos,
extensiones, prioridades y aplicaciones. Ahora ya tiene los conocimientos fundamentales sobre los
cuales se construyen todos los dialplan.
Construyendo un dialplan Interactivo
El dialplan que acabamos de construir es estático, siempre va a realizar las mismas acciones sobre cada
llamada. Muchos dialplan también necesitan lógica para realizar diferentes acciones basados en las
entradas de los usuarios, así que vamos a echarle un vistazo.
Las Aplicaciones Goto(), Background() y WaitExten()
Como su nombre lo indica, la aplicación Goto() se utiliza para enviar una llamada a otra parte del
dialplan. La sintaxis de la aplicación Goto() requiere que pasemos el contexto, la extensión y prioridad
de destino como argumentos a la aplicación, así:
same => n,Goto(contexto,extension,prioridad)
Vamos a crear un nuevo contexto llamado MenuPrueba, y crear una extensión en nuestro contexto
Local que pasará las llamadas al contexto usando Goto():
exten => 201,1,Goto(MenuPrueba,start,1) ; agregue esto al final del contexto [Local]
[Local]
exten => start,1,Answer()
Ahora, cada vez que un dispositivo entre en el contexto Local y marque 201, la llamada será pasada a la
extensión start en el contexto MenuPrueba (que en la actualidad no va a hacer nada interesante porque
todavía tenemos más código para escribir).
Se utilizó la extensión start, en este ejemplo, pero podríamos haber utilizado cualquier cosa que
quisiéramos, como un nombre de extensión, ya sea numérica o alfabético. Nosotros preferimos
utilizar caracteres alfa para las extensiones que no son directamente marcable, ya que esto hace el
dialplan más fácil para leer. El punto es, que podría haber usado 123 o xyz123 o 99luftballons, o lo
que quisiéramos lugar de start. La palabra "start" en realidad no significa nada para el plan de
marcado, es sólo otra extensión.
Una de las aplicaciones más útiles en un dialplan interactivo de Asterisk es la aplicación Background().
Como Playback(), esta reproduce un archivo de sonido guardado previamente. A diferencia de
Playback(), sin embargo, cuando alguien llama y presiona una tecla (o conjunto de teclas) en el teclado
del teléfono, interrumpe la reproducción y pasa la llamada a la extensión que corresponde con el dígito
pulsado(s). Si el llamante pulsa 5, por ejemplo, Asterisk detendrá la reproducción del sonido del sistema
y envía el control de la llamada a la primera prioridad de la extensión 5 (asumiendo que hay una
extensión 5 para enviar la llamada).
El uso más común de la aplicación Background() es para crear menú de voz (a menudo llamadas
operadores automáticos o árboles de teléfono). Muchas empresas utilizan menús de voz para dirigir las
llamadas a las extensiones adecuadas, aliviando así sus recepcionistas de tener que responder a cada
llamada.
Background() tiene la misma sintaxis que Playback():
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
Si usted quieres que Asterisk espere por una entrada desde el llamante después que la reproducción del
prompts de sonido ha terminado, puede utilizar WaitExten(). La aplicación WaitExten() espera a que la
persona que llama introduzca los dígitos DTMF y se usa directamente después de la aplicación
Background() , así:
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
same => n,WaitExten()
Si desea que la aplicación WaitExten() espere un número determinado de segundos por una respuesta
(en lugar de utilizar el tiempo de espera por defecto), sólo tiene que pasar el número de segundos como
el primer argumento de WaitExten(), así:
same => n,WaitExten(5)
; nosotros siempre pasamos un argumento tiempo para WaitExten()
Tanto Background() y WaitExten () permiten al que llama introducir los dígitos DTMF. Asterisk entonces
intenta encontrar una extensión en el contexto actual que coincide con los dígitos que ingresó la
persona que llama. Si Asterisk encuentra una coincidencia, enviará la llamada a esa extensión. Vamos a
demostrarlo mediante la adición de unas cuantas líneas a nuestro dialplan de ejemplo:
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
same => n,WaitExten(5)
exten => 1,1,Playback(digits/1)
exten => 2,1,Playback(digits/2)
Después de hacer esto cambios, grabe y recargue su dialplan:
*CLI> dialplan reload
Si llama a la extensión 201, se debería escuchar un mensaje que dice "Escriba la extensión de la persona
que está tratando de alcanzar." El sistema esperará 5 segundos para que entre un dígito. Si el digito que
usted presiono es 1 o 2, Asterisk coincidirá con la extensión correspondiente, y reproduce un mensaje
indicándole cual fue el número introducido. Como no hemos proporcionamos más instrucciones, la
llamada se terminará. Usted también encontrará que si se introduce un dígito diferente (por ejemplo, 3),
el dialplan no podrá proceder.
Vamos a embellecer las cosas un poco. Utilizaremos la aplicación Goto() para que el dialplan repita el
saludo después de reproducir el número digitado:
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
same => n,WaitExten(5)
exten => 1,1,Playback(digits/1)
same => n,Goto(MenuPrueba,start,1)
exten => 2,1,Playback(digits/2)
same => n,Goto(MenuPrueba,start,1)
Estas nuevas líneas enviarán el control de la llamada a la extensión start después de reproducir el
número seleccionado. Esto es generalmente es considerado mucho más amigable que simplemente
colgar la llamada.
Si busca los detalles de la aplicación Goto(), encontraras que puede pasar o uno, dos o tres argumento
para la aplicación. Si pasa un solo argumento, Asterisk asumirá que la prioridad de destino está en la
extensión actual. Si pasa dos argumentos, Asterisk tratará de que la extensión y la prioridad vayan al
contexto actual.
En este ejemplo, hemos pasados los tres argumentos por el bien de la claridad, pero si solo pasamos la
extensión y la prioridad tendría el mismo efecto, ya que el contexto de destino es el mismo que el
contexto de origen.
Manejando Entradas Inválidas y Timeout
Ahora que nuestro primer menú de voz empieza a tomar forma, permítanos agregar algunas
extensiones especiales. Primero, nosotros necesitamos una extensión para las entradas inválidas. En
Asterisk, cuando un contexto recibe una solicitud para una extensión que no es validad dentro de ese
contexto (por ejemplo, al pulsar 9 en el ejemplo anterior), la llamada es enviada para la extensión i.
También necesitamos una extensión para manejar situaciones como cuando la persona que llama no
presione ningún digito en el tiempo dado (el tiempo de espera por defecto son 10 segundos). Las
llamadas serán enviadas a la extensión t si la persona que llama toma demasiado tiempo para pulsar un
dígito después que WaitExten() ha sido llamado. Así es como nuestro dialplan se verá después de haber
añadido estas dos extensiones:
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
same => n,WaitExten(5)
exten => 1,1,Playback(digits/1)
same => n,Goto(MenuPrueba,start,1)
exten => 2,1,Playback(digits/2)
same => n,Goto(MenuPrueba,start,1)
exten => i,1,Playback(pbx-invalid)
same => n,Goto(MenuPrueba,start,1)
exten => t,1,Playback(vm-goodbye)
same => n,Hangup()
Usar la extensión i y t hace nuestro menú un poco más robusto y amigable. Dicho esto, todavía es
bastante limitado, ya que las personas externa que llaman todavía no tienen manera de conectar con
una persona viviente. Para esto, tendremos que aprender sobre otra aplicación, llamada Dial( ).
Usando la Aplicación Dial()
Una de las características más valiosa de Asterisk es su capacidad para conectar distintas personas que
llaman cada uno con la otra. Esto es especialmente útil cuando los llamantes están utilizando diferentes
métodos de comunicación. Por ejemplo, Una persona A podría estar comunicándose a través de la red
telefónica analógica tradicional, mientras que el usuario B podría estar sentado en un café al otro lado
del mundo y hablando desde un teléfono IP. Por suerte, Asterisk hace una gran parte del trabajo duro de
conexión y traducción entre redes diferentes. Todo lo que tienes que hacer es aprender cómo utilizar la
aplicación Dial().
La sintaxis de la aplicación Dial() es más compleja que la de las otras aplicaciones que hemos utilizado
hasta ahora, pero no dejes que esto te asuste. Dial() toma cuatro argumentos, que veremos a
continuación.
Argumento 1: destino
El primer argumento es el destino al que está intentando llamar, que (en su forma más simple) se
compone de la tecnología (o transporte) a través de la cual se hace la llamada, una barra inclinada (/), y
la dirección del dispositivo remoto o recurso. Los tipo de tecnología comunes incluyen DAHDI (para
canales análogo y T1/E1/J1), SIP, y IAX2.
Por ejemplo, vamos asumir que nosotros queremos llamar a un dispositivo DAHDI identificado por
DAHDI/1, el cual es un canal FXS con un teléfono análogo conectado en este. La tecnología es DAHDI, y
el recursos (o identificador de canal) es 1. Similarmente, una llamada para un dispositivo SIP (como se
definieron en sip.conf) podría tener un destino SIP/0002B4001412, y una llamada para un dispositivo
IAX (como los definidos en iax.conf) podría tener un destino de IAX2/Softphone. Si quisiéramos que
Asterisk hiciera sonar el canal DAHDI/1 cuando la extensión 105 es alcanzada en el dialplan,
agregaríamos la siguiente extensión:
exten => 105,1,Dial(DAHDI/1)
Podemos también marcar múltiples canales al mismo tiempo, por concatenar los destinos con un signo
(&), como este:
exten => 105,1,Dial(DAHDI/1&SIP/0002B4001412&IAX2/Softphone)
La aplicación Dial() hará sonar todos los destinos especificados simultáneamente, y conecta la llamada
entrante con cualquier canal de destino que conteste primero (los demás canales dejaran de sonar
inmediatamente). Si la aplicación Dial() no contacta cualquiera de los destinos, Asterisk establecerá una
variable llamada DIALSTATUS con el motivo por el cual no pudo llamar a los destinos, y continua con la
siguiente prioridad en la extensión.
La aplicación Dial() también le permite conectar con dispositivo finales VoIP remoto que no fueron
previamente definido en uno de los archivos de configuración de canales. La sintaxis completa es:
Dial(tecnologia/usuario[:contraseña]@host_remoto[:puerto][/extension_remota])
A modo de ejemplo, se puede marcar a un servidor de demostración en Digium utilizando el protocolo
IAX2 mediante la siguiente extensión:
exten => 500,1,Dial(IAX2/[email protected]/s)
La sintaxis completa de la aplicación Dial() es ligeramente diferente para los canales DAHDI:
Dial(DAHDI/[gGrR]canal_o_grupo[/extension_remota])
Por ejemplo, así es como usted marcaria 1-809-200-1212 sobre el canal DAHDI número 4:
exten => 501,1,Dial(DAHDI/4/18092001212)
Argumento 2: Timeout
El segundo argumento de la aplicación Dial() es un timeout (tiempo de espera), especificado en
segundos. Si un tiempo de espera es dado, Dial() intentará llamar al destino especificado(s) por ese
número de segundos antes de abandonar y pasar a la siguiente prioridad en la extensión. Si no se
especifica tiempo de espera, Dial() continuará marcando hasta que alguien contesta o la persona que
llama cuelgue. Vamos a añadir un tiempo de espera de 10 segundos para nuestra extensión:
exten => 502,1,Dial(DAHDI/1,10)
Si se contesta la llamada antes de que el tiempo de espera se agote, los canales son puenteados y el
dialplan se hace. Si el destino simplemente no contesta, está ocupado, o de otro modo deshabilitado,
Asterisk establecerá una variable llamada DIALSTATUS y luego continuará con la siguiente prioridad en
la extensión.
Vamos a poner lo que hemos aprendido hasta ahora en otro ejemplo:
exten => 502,1,Dial(DAHDI/1,10)
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
Como puede ver, este ejemplo reproducirá el archivo de audio vm-nobodyavail.gsm si la llamada no es
contestada.
Argumento 3: Opción
El tercer argumento para Dial() es una cadena de opciones. Puede contener uno o más caracteres que
modifican el comportamiento de la aplicación Dial().Mientras que la lista de posibles opciones es
demasiado larga como para cubrir aquí, una de las más populares es la opción m. Si se coloca la letra m
como tercer argumento, la persona que llama escuchará música de espera en lugar del ringing mientras
el canal de destino está siendo llamado (suponiendo, por supuesto, que la música en espera se ha
configurado correctamente). Para agregar la opción m a nuestro último ejemplo, simplemente
cambiamos la primera línea:
exten => 502,1,Dial(DAHDI/1,10,m)
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
Argumento 4: URI
El cuarto y último argumento de la aplicación Dial() es un URI. Si el canal de destino soporta recibir URI
en el momento de la llamada, el URI especificado será enviado (por ejemplo, si usted tiene un teléfono
que soporta recibir URI, este aparecerá sobre la pantalla del teléfono; Del mismo modo, si usted está
usando un softphone, el URI podría aparecer en la pantalla del ordenador). Este argumento se utiliza
muy raramente.
Actualizando el dialplan
Vamos a modificar las extensiones 1 y 2 en el menú, para usar la aplicación Dial():
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
same => n,WaitExten(5)
exten => 1,1,Dial(SIP/0000FFFF0001,10) ; Remplace 0000FFFF0001 con el nombre de su dispositivo
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
exten => 2,1,Dial(SIP/0000FFFF0002,10) ; Remplace 0000FFFF0002 con el nombre de su dispositivo
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
exten => i,1,Playback(pbx-invalid)
same => n,Goto(MenuPrueba,start,1)
exten => t,1,Playback(vm-goodbye)
same => n,Hangup()
Argumentos en Blanco
Tenga en cuenta que el segundo, tercer, y cuarto argumentos pueden dejarse en blanco; únicamente el
primer argumento es requerido. Por ejemplo, si desea especificar una opción, pero no un timeout,
simplemente deje en blanco el argumento timeout, así:,
exten => 1,1,Dial(DAHDI/1,,m)
Usando Variables
Las variables se pueden utilizar en el dialplan de Asterisk para ayudar a reducir la escritura, mejorar la
claridad, o agregar lógica. Si usted tiene alguna experiencia en programación de computadora, usted ya
sabe lo que es una variable. Si no, vamos a explicar brevemente qué son las variables y cómo se utilizan.
Ellas son un concepto del dialplan de Asterisk de vital importancia (y algo que no encontrará en el plan
de marcado de cualquier PBX propietaria).
Una variable es un nombre contenedor que puede guardar un valor. La ventaja de una variable es que su
contenido puede cambiar, pero su nombre no cambia, lo que significa que puede escribir código que
haga referencia al nombre de la variable y no preocuparse por el valor que tenga. Así, por ejemplo,
podríamos crear una variable llamada JUAN y asignarle el valor de DAHDI/1. De esta manera, cuando
estamos escribiendo nuestro plan de marcado puede referirse al canal de JUAN por su nombre, en lugar
de recordar que Juan está usando el canal llamado DAHDI/1. Si en algún momento se cambia el canal de
JUAN por alguna otra cosa, no tenemos que cambiar cualquiera de nuestro código que hace referencia a
la variable JUAN, sólo tenemos que cambiar el valor asignado a la variable.
Hay dos maneras de hacer referencia a una variable. Para referirse al nombre de la variable,
simplemente escriba el nombre de la variable, como LIAN. Si, por el contrario, desea hacer referencia al
valor de la variable, debe escribir un signo de dólar, una llave de apertura, el nombre de la variable, y
una llave de cierre (en el caso de LIAN, podemos hacer referencia el valor de la variable con ${LIAN}). He
aquí cómo se puede utilizar una variable dentro de la aplicación Dial():
exten => 301,1,Set(LIAN=SIP/0000FFFF0001)
same => n,Dial(${LIAN})
En nuestro plan de marcado, cada vez que nos referimos a ${LIAN}, Asterisk automáticamente lo
reemplazará por el valor que se ha asignado a la variable llamada LIAN.
Tenga en cuenta que los nombres de las variables son sensibles a mayúscula y minúscula. Una variable
nombrada LIAN es diferente de una variable nombrada Lian. Para una mejor legibilidad todos los
nombres de las variables en los ejemplos se escriben en mayúscula. También debe ser consciente de que
las variables definida por Asterisk están en mayúscula. Algunas variables, como CHANNEL y EXTEN, son
reservadas por Asterisk. Usted no debe tratar de usar estas variables.
Hay tres tipos de variables que podemos utilizar en nuestro dialplan: variables globales, las variables de
canales y variables de entorno. Tomemos un momento para ver cada tipo.
Variables Globales
Como su nombre lo indica, las variables globales son visibles para todos los canales en todo momento.
Las variables globales son útiles porque se pueden usar en cualquier lugar dentro de un plan de marcado
para aumentar la legibilidad y facilidad de manejo. Supongamos por un momento que usted tiene un
gran dialplan y varios cientos de referencias al canal SIP/0000FFFF0001. Ahora imagine que tiene que ir
a través de su plan de marcado y cambiar todas las referencias para SIP/0000FFFF0001. Sería un proceso
largo y propenso a errores, por decir lo menos.
Por otro lado, si hubiera definido una variable global que contenga el valor SIP/0000FFFF0001 al inicio
de su plan de marcado y, a continuación se hace referencia esta, únicamente habría que cambiar una
sola línea de código para afectar todos los lugares en el dialplan donde se utilizó ese canal.
Las variables globales deben ser declaradas en el contexto [globals] en el principio del archivo
extensions.conf. Como ejemplo, vamos a crear una variable global llamada LIAN con un valor de
SIP/0000FFFF0001. Esta variable se establece en el tiempo que Asterisk analiza el dialplan:
[globals]
LIAN=SIP/0000FFFF0001
Variables de Canales
Una variable de canal es una variable que se asocia únicamente con una llamada en particular. A
diferencia de las variables globales, variables del canal sólo se definen por el tiempo que dura la llamada
y sólo están disponibles para los canales que participan en la llamada.
Hay muchas variables de canales predefinidas disponibles para su uso dentro del plan de marcado, que
se explican en el wiki de Asterisk. Las variables de canales son configuradas vía la aplicación Set():
exten => 202,1,Set(MagicNumber=42)
same => n,SayNumber(${MagicNumber})
Usted va a ver mucha más variables de canales. Siga leyendo.
Variables de Entorno
Las variables de entorno son una forma de acceder a las variables de entorno de Unix desde dentro de
Asterisk. Esta son referenciadas usando la función del dialplan ENV(). La sintaxis luces como esta
${ENV(var)}, donde var es la variable de entorno Unix a la cual usted desea hacer referencia. Las
variables de entorno no se utilizan comúnmente en el dialplan de Asterisk, pero están disponibles si las
necesita.
Agregando variables a nuestro dialplan
Ahora que hemos aprendido acerca de las variables, vamos a ponerla a trabajar en el plan de marcado.
Vamos a añadir tres variables globales que asocian un nombre de variable al nombre del canal:
[globals]
LIAN=SIP/0000FFFF0001
MASS=SIP/0000FFFF0002
BERN=SIP/0000FFFF0004
[Local]
exten => 101,1,Dial(${LIAN})
exten => lian,1,Dial(${LIAN})
exten => 102,1,Dial(${MASS})
exten => mass,1,Dial(${MASS})
exten => 104,1,Dial(${BERN})
exten => bern,1,Dial(${BERN})
exten => 201,1,Goto(MenuPrueba,start,1) ; accede el contexto MenuPrueba
[MenuPrueba]
exten => start,1,Answer()
same => n,Background(enter-ext-of-person)
same => n,WaitExten()
exten => 1,1,Dial(DAHDI/1,10)
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
exten => 2,1,Dial(SIP/MASS,10)
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
exten => i,1,Playback(pbx-invalid)
same => n,Goto(MenuPrueba,start,1)
exten => t,1,Playback(vm-goodbye)
same => n,Hangup()
Se dará cuenta de que hemos añadido a los nombres de extensión seudónimo de nuestros números de
extensión. En "Extensiones" en la página 114, se explicó que Asterisk no le importa que esquema de
nombres se utilice para identificar una extensión. Simplemente hemos añadido identificadores de
extensiones tanto numérica y el nombre de extensión para llegar al mismo punto, extensiones 101 y lian
ambas alcanzan el dispositivo ubicado en SIP/0000FFFF0001, extensiones 102 y mass ambas alcanzan el
dispositivo ubicado en SIP/0000FFFF0002, y la extensión 104 y bern ambas alcanzan el dispositivo
ubicado en SIP/0000FFFF0004.
Los dispositivos se identifican con las variables globales ${LIAN}, ${MASS} y ${BERN}, respectivamente, y
estamos marcando esas ubicaciones mediante la aplicación Dial().
En nuestro menú de prueba simplemente hemos elegido un par de puntos finales al azar para marcar,
como DAHDI/1 y SIP/MASS. Estos podrían ser sustituidos por cualquier dispositivo final disponibles que
desee. Nuestro contexto MenuPrueba se ha construido para comenzar a darle una idea de cómo luce el
dialplan de Asterisk.
Patrones de Marcado
Si queremos ser capaces de permitirle a la gente que marquen a través de Asterisk y tenemos a Asterisk
conectado a los recursos externos, necesitamos una manera de machear cualquier número de teléfono
posible que las personas puedan marcar. En situaciones como esta, Asterisk ofrece los patrones de
marcado (o patrones de coincidencia). Los patrones de marcado le permiten crear una extensión en su
plan de marcado que coincide con muchos números diferentes. Esto es enormemente útil.
Sintaxis de los patrones de marcado
Cuando se usan los patrones de marcado, algunas letras y símbolos representan lo que estamos
tratando de igualar. Los patrones siempre inician con un guion bajo (_). Esto le dice a Asterisk que
estamos en un patrón de marcado, y no sobre el nombre de una extensión explícita.
Si olvida el guion bajo en el comienzo de su patrón, Asterisk va a pensar que es sólo el nombre de una
extensión y no hará ninguna coincidencia de patrones. Este es uno de los errores más comunes que se
cometen al empezar a aprender Asterisk.
Después del guion, puede utilizar uno o más de los siguientes caracteres:
X
Coincide con cualquier dígito del 0 al 9.
Z
Coincide con cualquier dígito del 1 al 9.
N
Coincide con cualquier dígito del 2 al 9.
[15-7]
Coincide con un solo carácter del rango de dígitos especificado. En este caso, el patrón coincide solo
con 1, así como cualquier número en el rango de 5, 6, 7.
. (punto)
El Comodín; coincide con uno o más caracteres, no importa cuál de ellos sean.
Si usted no tiene cuidado, con el uso del .(punto) puede hacer que sus dialplan haga cosas que no
espera (como coincidir con extensiones como i o h). Debe utilizar el carácter comodín en un patrón
sólo después de haber macheado tantos otros dígitos como sea posible. Por ejemplo, el siguiente
patrón de marcado probablemente nunca debe ser utilizado:
_.
De hecho, Asterisk le avisará si intenta utilizarlo. En cambio, si usted realmente necesita un patrón
que capture todo, utilice éste para que coincida con todas las cadenas que comiencen con un dígito
seguido de uno o más caracteres ( vea !si usted quiere ser capaz de igualar cero o más caracteres):
_X.
O este otro, para que coincida con cualquier cadena alfanumérica:
_[0-9a-zA-Z].
! (bang)
Coincide con cero o más caracteres, no importa cuales ellos sean.
Para utilizar los patrones de marcado en tu dialplan, simplemente ponga el patrón en el lugar del
nombre de la extensión (o número):
exten => _NXX,1,Playback(silence/1&auth-thankyou)
En este ejemplo, el patrón coincide con cualquier extensión de tres dígitos del 200 al 999 (la N coincide
con cualquier dígito entre 2 y 9, y cada X coincide con un dígito entre 0 y 9). Es decir, si una persona
marcó cualquier extensión de tres dígitos entre 200 y 999, en este contexto, escucharía el archivo de
audio auth-thankyou.gsm.
Otra cosa importante a saber sobre la coincidencia de patrones es que si Asterisk encuentra más de un
patrón que coincide con la extensión marcada, se utilizará el más específico (yendo de izquierda a
derecha).
Digamos que hemos definido los siguientes dos patrones, y una persona marcó 544-5555:
exten => _544XXXX,1,Playback(silence/1&digits/1)
exten => _54455XX,1,Playback(silence/1&digits/2)
En este caso la segunda extensión puede ser seleccionada, porque es más específica.
Ejemplos de patrones de marcados
Este patrón coincide con cualquier número de siete dígitos, siempre y cuando el primer dígito es 2 o
superior:
_NXXXXXX
El patrón anterior puede ser compatible con cualquier número local de siete dígitos en el Plan de
Numeración de América del Norte.
En zonas con marcado de 10 dígitos, el patrón se vería así:
_NXXNXXXXXX
El NANP
El Plan de Numeración de América del Norte (NANP) es un esquema de numeración telefónico
compartido, utilizado por 19 países de América del Norte y el Caribe. Todos estos países comparten
código de país 1.
Vamos a tratar de otro ejemplo:
_1NXXNXXXXXX
Este coincide con el número 1, seguido de un código de área entre 200 y 999, después cualquier número
de siete dígitos. En el área de llamadas NANP, deberá utilizar este patrón para que coincida con un
número de larga distancia.
Y finalmente este:
_011.
Note el punto al final. Este patrón coincide con cualquier número que inicia con 011 y tiene al menos
uno o más dígitos. En el NANP, esto indica un número de teléfono internacional. (Vamos a utilizar estos
patrones en la siguiente sección para agregar capacidades para hacer llamadas al exterior en nuestro
plan de marcado.)
Patrones de Marcado en Otros Países
Los ejemplos de esta sección fueron centrado NANP, pero la lógica básica es aplicable en cualquier país.
Estos son algunos ejemplos de otros países (tenga en cuenta que no hemos sido capaces de probar
estos, y son casi ciertamente incompleto):
; UK, Alemania, Italia, China, etc.
_00. ; Código de marcado internacional
_0. ; Prefijo de marcado nacional
; Australia
_0011. ; Código de marcado internacional
_0. ; Prefijo de marcado nacional
Esto no es en absoluto comprensible, pero debe darle una idea general de los patrones que usted querrá
tener en cuenta para su propio país.
Usando la Variable de Canal ${EXTEN}
¿Pero qué pasa si usted desea utilizar patrones de marcado, pero necesita saber cuáles dígitos fueron
marcados? Introduzca la variable de canal ${EXTEN}. Cada vez que se marca una extensión, Asterisk
asigna los dígitos marcados a la variable de canal ${EXTEN}. Podemos utilizar una aplicación llamada
SayDigits() para probar esto:
exten => _XXX,1,Answer()
same => n,SayDigits(${EXTEN})
En este ejemplo, la aplicación SayDigits() leerá los tres dígitos de la extensión que usted marco y le dirá
cuales son.
A menudo, es útil manipular la variable ${EXTEN} para extraer un cierto número de dígitos de la parte
frontal de la extensión. Esto se logra mediante el uso de la sintaxis ${EXTEN: x}, donde x es donde usted
quiere que la cadena de retorno inicie, de izquierda a derecha. Por ejemplo, si el valor de ${EXTEN} es
95445555, ${EXTEN: 1} será igual a 5445555. Probemos otro ejemplo:
exten => _XXX,1,Answer()
same => n,SayDigits(${EXTEN:1})
En este ejemplo, la aplicación SayDigits() comenzaría en el segundo dígito, y así solo devuelve los dos
últimos dígitos de la extensión marcada.
Manipulación de dígitos más avanzada
La variable ${EXTEN} tiene propiamente la sintaxis ${EXTEN: x: y}, donde x es la posición inicial; y es el
número de dígitos a devolver. Dada la cadena de marcado siguiente:
98092201411
Podemos extraer las siguientes cadenas de dígitos usando ${EXTEN: x: y}:
•
${EXTEN:1:3} devolvería 809
•
${EXTEN:4:7} devolvería 2201411
•
${EXTEN:-4:4} inicia en el cuarto dígitos desde la derecha y retorna 4 dígitos, tendríamos 1411
•
${EXTEN:2:-4} inicia a partir del segundo dígitos y excluir a los últimos cuatro dígitos, tendríamos 09220
•
${EXTEN:-6:-4}inicia a partir del sexto digito desde la derecha y excluye los últimos cuatro, tendríamos
20
${EXTEN:1} nos daría todo después del primer dígito o 8092201411 (si el número de dígitos a retornar se
deja en blanco, devolverá toda la cadena restante) Este un constructor muy potente, pero la mayoría
de estas variaciones no son muy comunes en el uso normal. La mayor parte, solo va a utilizar
${EXTEN} (o tal vez ${EXTEN:1} si necesita quitar un código de acceso externo, como un 9
antepuesto).
•
Includes
Asterisk tiene una característica muy importante que le permite a las extensiones de un contexto estar
disponible dentro de otro contexto. Esto se logra mediante el uso de la directiva include. La directiva
include nos permite controlar el acceso a las diferentes secciones del plan de marcado.
La declaración include tiene la forma siguiente, donde el contexto es el nombre del contexto remoto
que queremos incluir en el contexto actual:
include => context
Incluir un contexto dentro de otro contexto permite a las extensiones dentro del contexto incluido que
se puedan marcar.
Cuando incluimos otros contextos dentro de nuestro contexto actual, hay que tener en cuenta el orden
en el cual nosotros estamos incluyendo estos. Asterisk en primer lugar trata de coincidir con la extensión
marcada en el contexto actual. Si no tiene éxito, entonces trata con el primer contexto incluido
(incluyendo cualquier contexto incluido en este contexto), y luego continua con otros contextos
incluidos en el orden en el que fueron incluidos.
Discutiremos la directiva include mas adelante.
Capı́tulo 9
Conectividad con el mundo exterior
En los capítulos anteriores hemos cubierto una gran cantidad de información importante que es esencial
para que un sistema Asterisk trabaje. Sin embargo, todavía tenemos que llevar a cabo lo único que es
vital para cualquier PBX útil: nombrada, conectividad con el mundo exterior. En este capítulo vamos a
rectificar esa situación.
La arquitectura de Asterisk es significativa, debido en gran parte al hecho de que se trata a todos los
tipos de canales como iguales. Esto es un contraste con una PBX tradicional, donde los troncos (que se
conectan con el mundo exterior) y extensiones (que se conectan a los usuarios y recursos) son muy
diferentes. El hecho de que el plan de marcado de Asterisk trata a todos los canales de una manera
similar significa que en un sistema Asterisk se puede lograr muy fácilmente cosas que son mucho más
difícil (o imposible) de lograr en una PBX tradicional.
Sin embargo, esta flexibilidad viene con un precio. Dado que el sistema no conoce la diferencia entre un
recurso interno (por ejemplo, un teléfono) y un recurso externo (como un circuito de
telecomunicaciones), depende de usted asegurar que su dialplan maneja cada tipo de recurso
apropiadamente.
Fundamento de Trunking
El propósito del trunking es proveer una conexión compartida entre dos entidades. Por ejemplo, una vía
principal sería una carretera que conecta dos ciudades. En los Ferrocarriles se utiliza el término "tronco"
ampliamente, para referirse a la línea mayor que conectados las demás líneas entre sí.
Similarmente, en las telecomunicaciones, trunking se utiliza para conectar dos sistemas juntos. Las
compañías telefónicas usan los troncos de telecomunicación para conectar sus redes entre sí. Y en una
PBX, los circuitos que conectan la PBX para el mundo exterior son comúnmente llamados troncales
(aunque las telefónicas por lo general no consideran esto como troncos. Desde una perspectiva técnica,
la definición de un tronco no está clara (Los Troncales PBX utilizan tecnología totalmente diferente de
los circuitos de la estaciones), pero como concepto, los troncos siguen siendo muy importantes. Por
ejemplo, con VoIP, todo es en realidad punto a punto (por lo que desde la perspectiva de la tecnología
no es realmente un tronco), pero todavía es útil para ser capaz de diferenciar entre los recursos de VoIP
que se conectan a el mundo exterior y los recursos de VoIP que se conectan a los puntos finales de
usuario (tales como teléfonos SIP).
Probablemente es mucho más fácil pensar en un tronco como conjunto de circuitos que sirve como una
ruta. Así, en una PBX Asterisk, usted podría tener troncos que van a su proveedor de VoIP para llamadas
de larga distancia, los troncos de los circuitos PSTN y los troncales que conectan las diferentes oficinas
entre sí. Estos troncos en realidad pueden correr a través de la misma conexión de red, pero en su
dialplan pueden ser tratados muy diferente.
Si bien creemos que la VoIP eventualmente reemplazar totalmente el PSTN, muchos de los conceptos
que son usados en los circuitos de VoIP (como un "número de teléfono") deben su existencia a la
historia más que cualquier requisito técnico, por lo que creemos que será útil discutir el uso de los
circuitos tradicionales PSTN con Asterisk antes de entrar en VoIP.
Si el sistema que está instalando usará circuitos VoIP solamente, esto no es un problema. Vaya
directamente a la sección VoIP de este capítulo, y lo guiaremos a través de lo que necesita hacer.
Recomendamos la lectura de la sección PSTN a su conveniencia, ya que puede ser un conocimiento
general que le podría ser de utilidad, pero no es estrictamente necesario, a fin de entender y usar
Asterisk.
Dialplan Básico para Conectividad con exterior
En un PBX tradicional, las líneas externas se acceden generalmente por medio de un código de acceso
que se debe marcar antes del número. Es común utilizar el dígito 9 para este propósito.
En Asterisk, es igualmente posible asignar el 9 para el enrutamiento de las llamadas externas, pero ya
que el dialplan de Asterisk es mucho más inteligente, no es realmente necesario obligar a sus usuarios a
marcar 9 antes de realizar una llamada. Por lo general, usted tendrá un rango de extensión para su
sistema (por ejemplo, 100 a 199), y una serie de códigos de funciones (*00 a *99). Cualquier cosa fuera
de ese rango que coincide con el patrón de marcado de su país o región puede ser entendida como una
llamada externa. Si usted tiene un proveedor que proporciona todo el enrutamiento externo, puede
manejar su marcado externo a través de algunos pocos patrones de marcado simples. El ejemplo de esta
sección es válido para el Plan de Numeración de América del Norte (NANP). Si su país no está dentro del
NANP (tal como Canadá, los EE.UU. y varios países del Caribe), necesitará patrones de marcado
diferentes.
La sección [globals] contiene dos variables, llamadas LOCAL e ITSP. El propósito de estas variables es el
de simplificar la administración de su plan de marcado si alguna vez necesita cambiar de compañía
telefónica. Ellas le permiten hacer un cambio en el plan de marcado que afectará a todos los lugares
donde se hace referencia al canal especificado:
[globals]
LOCAL=DAHDI/G0
; asumiendo que tiene una tarjeta de PSTN en su sistema
ITSP=SIP/Su_ Proveedor_Voip
; Como se definió en sip.conf
La sección [externa] contiene el código dialplan actual que reconoce los números marcados y
luego los pasa a la aplicación Dial():
[externa]
exten => _NXXNXXXXXX,1,Dial(${LOCAL}/${EXTEN})
; patrón de 10 dígitos para NANP
exten => _NXXXXXX,1,Dial(${LOCAL}/${EXTEN})
; patrón de 7 dígitos para NANP
exten => _1NXXNXXXXXX,1,Dial(${ITSP}/${EXTEN}) ;patrón de larga distancia, por NANP
exten => _011.,1,Dial(${ITSP}/${EXTEN}) ; patrón internacional para las llamadas realizadas desde
NANP
; Esta sección es funcionalmente igual que la sección anterior.
; Es para las personas que les gusta marcar '9 'antes de su llamada.
exten => _9NXXNXXXXXX,1,Dial(${LOCAL}/${EXTEN:1})
exten => _9NXXXXXX,1,Dial(${LOCAL}/${EXTEN:1})
exten => _91NXXNXXXXXX,1,Dial(${ITSP}/${EXTEN:1})
exten => _9011.,1,Dial(${ITSP}/${EXTEN:1})
Cualquier contexto, que será usado por extensiones o dispositivos de usuario, deberá utilizar la directiva
include => para permitir el acceso al contexto externo:
[Local]
include => externa
Es muy importante que no utilice include para dar acceso a las líneas externas en cualquier contexto
que podría procesar una llamada entrante. El riesgo aquí es que un robot de phishing podría llegar a
tener acceso a sus troncales salientes. No podemos hacer suficiente hincapié en lo importante que es
asegurar que ningún recurso externo puede acceder a sus líneas de larga distancia.
Circuitos PSTN
La red telefónica pública conmutada (PSTN) existe desde hace más de un siglo. Es el precursor de
muchas de las tecnologías que dan forma a nuestro mundo de hoy, desde el Internet hasta los
reproductores de MP3.
Los Troncos PSTN Tradicionales
Hay dos tipos de tecnología fundamentales que las compañías telefónicas utilizan para ofrecer circuitos
telefónicos: analógica y digital.
La telefonía analógica
Las primeras redes telefónicas eran analógicas. La señal de audio generada con su voz fue usada para
generar una señal eléctrica que se llevó al otro extremo. La señal eléctrica tenía las mismas
características que produce el sonido.
Los circuitos analógicos tienen varias características que los diferencian de otros circuitos que quizá
desee conectar a Asterisk:
•
•
•
•
No existe canal de señalización, más la señalización es electromecánica.
La supervisión de desconexión suele retrasarse por varios segundos, y no es del todo fiable.
La supervisión del extremo final es mínima (por ejemplo, la supervisión de respuesta es
deficiente).
Las diferencias entre los circuitos significan que las características de audio varían de circuito en
circuito y requerirán sintonización.
Los circuitos analógicos que desee conectar a su sistema Asterisk tendrán que conectarse a un puerto
Foreign eXchange Office (FXO). Puesto que no hay tal cosa como un puerto FXO en cualquier
computador estándar, una tarjeta FXO debe ser comprada e instalada en el sistema para poder conectar
líneas analógicas tradicionales.
FXO y FXS
Para cualquier circuito analógico, hay dos extremos: la oficina (típicamente la oficina central de la
PSTN), y la estación (típicamente un teléfono, pero también podría ser una tarjeta, tales como un
módem o tarjeta de línea en una PBX).
La oficina central se encarga de:
•
•
•
•
•
Energizar las líneas (nominalmente 48 voltios de corriente directa)
Voltaje del timbrado (nominalmente 90 voltios de corriente alterna)
Proporcionar tono de marcado
Detectar el estado de hook (off-hook y on-hook)
Envío de señales complementarias tales como el identificador de llamadas (CallerID)
La estación se encarga de:
•
•
•
Proporcionar un timbre (o por lo menos ser capaz de manejar el voltaje del timbrado de
alguna manera)
Proporcionar un teclado (o alguna forma de enviar DTMF)
Proporcionar un switch hook para indicar el estado de la línea
Un puerto Foreign eXchange (FX) es nombrado por lo que este conecta a, y no por lo que hace. Así,
por ejemplo, un puerto Foreign eXchange Office (FXO) es actualmente una estación: se conecta a la
oficina central. Un puerto Foreign eXchange Station (FXS) es en realidad un puerto que ofrece los
servicios de una oficina central (en otras palabras, debe conectar un teléfono analógico a un puerto
FXS).
Esta es la razón por la cual la configuración de señalización en los archivos de configuración de
Asterisk parecen al revés: Los puertos FXO utilizan señalización FXS, FXS utilizan señalización FXO.
Cuando usted entiende que el nombre del tipo de puerto físico se basa en lo que se conecta a este,
los nombres de señalización en Asterisk tomaran un poco más de sentido: Si un puerto FXO se
conecta a la oficina central, tiene que ser capaz de comportarse como una estación, y por lo tanto
necesita señalización FXS.
Tenga en cuenta que el cambio de FXO a FXS no es algo que se puede hacer simplemente con un
cambio de configuración. Los puertos FXO y FXS necesitan electrónica completamente diferente. La
mayoría de tarjetas analógicas disponibles para Asterisk usan algún tipo de tarjeta secundaria que se
conecta a la tarjeta principal y ofrece el tipo de canal correcto, lo que significa que usted tiene cierta
flexibilidad en la definición de qué tipos de puertos tiene en su tarjeta.
Los puertos analógicos no se utilizan generalmente en sistemas medianos o grandes. Ellos son más
utilizados en oficinas pequeñas (menos de 10 líneas, menos de 30 extensiones). Su decisión de utilizar
puertos analógicos podría basarse en algunos de los siguientes factores:
•
Disponibilidad de troncales digitales en su área
•
Costo (análogo es menos costoso en densidades más pequeñas, pero más caro en densidades
más altas)
Logística(si usted ya tiene una línea análoga instalada, es posible que desee mantenerla)
•
Desde un punto de vista técnico, normalmente se desea tener circuitos digitales en lugar de circuitos
analógicos. La realidad es que no siempre se acomodan, aunque, los circuitos analógicos probablemente
estarán por algunos cuantos años más todavía.
Telefonía digital
La telefonía digital fue desarrollada con el fin de superar muchas de las limitaciones de la telefonía
análoga. Algunos de los beneficios de los circuitos digitales incluyen:
•
No hay pérdida de amplitud a través de largas distancias
•
Reducción del ruido en los circuitos (especialmente los circuitos de larga distancia)
•
Capacidad para llevar más de una llamada por circuito
•
Configuración y desmontaje de llamada más rápida
•
Rico en información de señalización (especialmente si está usando ISDN)
•
Menor costo para la compañía telefónica
•
Menor costo para los clientes (con densidades más altas)
En un sistema Asterisk (o cualquier PBX, para el caso), hay varios tipos de circuitos digitales que usted
puede querer conectar:
•
T1 (24 canales): usado en Canadá y Estado Unidos (mayormente para ISDN-PRI)
•
E1 (32 canales): Usado en el resto del mundo (ISDN-PRI o MFC/R2)
•
BRI(2 canales): Usado para circuitos ISDN-BRI (Euro-ISDN)
Tenga en cuenta que el circuito físico además puede ser definido por el protocolo que se ejecuta en el
circuito. Por ejemplo, un T1 podría ser utilizado ya sea para ISDN-PRI o CAS, y un E1 podría ser utilizado
para ISDN-PRI, CAS, o MFC/R2. Vamos a discutir los diferentes protocolos en la siguiente sección.
Instalando troncales PSTN
Dependiendo del hardware que haya instalado, el proceso para la instalación de sus tarjetas PSTN
variará. Vamos a discutir la instalación en términos generales, que aplica a todas las tarjetas de Digium
PSTN. Otros fabricantes tienden a proporcionar scripts de instalación con su hardware, lo que permitirá
automatizar gran parte esto para usted.
Descargando e instalando DAHDI
La interfaz Digium Asterisk Hardware Device, conocida como DAHDI (DAW-dee), es la plataforma de
software necesario para permitir la comunicación entre las tarjetas PSTN y Asterisk. Incluso si usted no
tiene ningún hardware PSTN, se recomienda instalar DAHDI ya que es una manera simple, y fiable para
obtener una fuente de sincronización válida. Las instrucciones completas sobre la instalación de DAHDI
se pueden encontrar en la página 63.
Desactivar la carga de módulos extra de DAHDI
Por defecto DAHDI cargará todos los módulos compilados en la memoria. Como esto no es necesario,
vamos a deshabilitar la carga de cualquiera de los módulos de hardware, por ahora. Si ningún módulo es
cargado en los archivos de configuración, DAHDI cargará el controlador dahdi_dummy, que proporciona
una interfaz para que Asterisk obtenga el tiempo desde kernel para que los módulos dependientes de
tiempos, como MeetMe y los trunking IAX2 trabajen correctamente.
A partir de DAHDI 2.3.0, los requerimiento para cargar dahdi_dummy para una interfaz de tiempo ya no
existen. La misma funcionalidad se ha integrado en el módulo principal del kernel DAHDI.
El archivo de configuración define cuales módulos DAHDI serán cargado en /etc/dahdi/modules. Para
desactivar la carga de módulos extra, todo lo que tenemos que hacer es editar el archivo de módulos y
comentar todos los módulos mediante la colocación de una almohadilla (#) al inicio de cada línea.
Cuando haya terminado, el archivo de configuración de módulos debe ser similar al siguiente:
# Contiene la lista de módulos que se cargan/descargan en /etc/init.d/dahdi.
#
#Nota: por favor, añadir/editar /etc/modprobe.d/dahdi o /etc/modprobe.conf si le gustaría añadir algún
# parámetro al módulo.
#
#Formato del archivo: lista de módulos, cada uno en su propia línea.
# Cualquier cosa después de un '#' se ignora, así mismo como espacio en blanco trasero y delantero y
# líneas vacías.
# Digium TE205P/TE207P/TE210P/TE212P: PCI dual-port T1/E1/J1
# Digium TE405P/TE407P/TE410P/TE412P: PCI quad-port T1/E1/J1
# Digium TE220: PCI-Express dual-port T1/E1/J1
# Digium TE420: PCI-Express quad-port T1/E1/J1
#wct4xxp
# Digium TE120P: PCI single-port T1/E1/J1
# Digium TE121: PCI-Express single-port T1/E1/J1
# Digium TE122: PCI single-port T1/E1/J1
#wcte12xp
# Digium T100P: PCI single-port T1
# Digium E100P: PCI single-port E1
#wct1xxp
# Digium TE110P: PCI single-port T1/E1/J1
#wcte11xp
# Digium TDM2400P/AEX2400: up to 24 analog ports
# Digium TDM800P/AEX800: up to 8 analog ports
# Digium TDM410P/AEX410: up to 4 analog ports
#wctdm24xxp
# X100P - Single port FXO interface
# X101P - Single port FXO interface
#wcfxo
# Digium TDM400P: up to 4 analog ports
#wctdm
# Digium B410P: 4 NT/TE BRI ports
#wcb4xxp
# Digium TC400B: G729 / G723 Transcoding Engine
#wctc4xxp
# Xorcom Astribank Devices
#xpp_usb
También puede utilizar el dahdi_genconf modules para generar un archivo de configuración vacío
apropiado. La aplicación dahdi_genconf buscará en su sistema el hardware y, si no se encuentra
ninguno, crea un archivo de módulos que no carga ningún módulo de hardware.
A continuación, puede reiniciar el proceso de DAHDI para descargar los controladores existentes que se
cargaron, y cargar sólo el módulo dahdi_dummy con el script init:
$ sudo /etc/init.d/dahdi restart
Unloading DAHDI hardware modules: done
Loading DAHDI hardware modules:
No hardware timing source found in /proc/dahdi, loading dahdi_dummy
Running dahdi_cfg: [ OK ]
Antes de que usted pueda iniciar a usar su hardware, tendrá que configurar el archivo
/etc/dahdi/system.conf, este proceso se describe en "Configuración de circuitos digitales" y
"Configuración de circuitos analógicos" en las siguientes páginas.
Configuración de circuitos analógicos
La telefonía digital fue desarrollada por las compañías telefónicas como una forma de reducir los costos
de los circuitos de larga distancia, así como mejorar la calidad de la transmisión. Toda la red troncal
PSTN ha sido totalmente digital desde hace muchos años. La esencia de un circuito digital es la
digitalización del audio, pero los troncales digitales también permiten una señalización más complejas y
confiable. Varios estándares se han desarrollado e implementado, y para cada estándar puede haber
diferencias regionales.
Usted puede utilizar dahdi_hardware y lsdahdi para ayudarle a determinar de qué tipo de hardware
de telefonía dispone su sistema. También puede utilizar el módulo dahdi_genconf para construir un
archivo /etc/asterisk/modules, basado en el hardware encontrado.
PRI ISDN. Primary Rate Interface ISDN (comúnmente conocido como PRI) es un protocolo diseñado para
correr primariamente sobre circuitos DS1 (un T1 o E1, dependiendo en que parte del mundo usted está)
entre una telefónica y un cliente. PRI utiliza uno de los canales DS0 como un canal de señalización
(referido como el canal D). Por tanto, un circuito típico PRI se divide en un grupo de canales B (los
canales portadores que realmente llevan las llamadas), y un canal D de señalización. Aunque es más
común encontrar un circuito PRI que está siendo llevado a través de un solo circuito físico (tal como un
T1 o E1), es posible tener circuito PRI que abarcan múltiples DS1, e incluso tener múltiples canales D.
Si bien hay muchas maneras diferentes para configurar circuitos PRI, tenemos la esperanza de evitar
confundir con todas las opciones (muchas de las cuales son obsoletas o por lo menos fuera de uso
común), y en cambio ofrecer ejemplos de las configuraciones más comunes.
Cuando instala hardware de telefonía, asegúrese de actualizar el archivo /etc/dahdi/modules para
habilitar los módulos apropiados para su hardware y vuelva a recargar DAHDI con el init script
(/etc/init.d/dahdi). Usted puede utilizar el comando dahdi_genconf modules para generar el archivo
de módulos para su sistema también.
La mayoría de los circuitos PRI en Norteamérica usan una T1 con las siguientes características:
•
Código de línea: B8ZS (bipolar con sustitución de 8 ceros)
•
Framing: ESF (superframe extendido)
Usted necesita configurar dos archivos. El archivo etc/dahdi/system.conf que puede lucir algo como
esto:
loadzone = us
defaultzone = us
span = 1,1,0,esf,b8zs
bchan = 1-23
echocanceller = mg2,1-23
hardhdlc = 24
Y el archivo /etc/asterisk/chan_dahdi.conf puede lucir como este:
[trunkgroups]
[channel]
usecallerid=yes
hidecallerid=no
callwaiting=no
usecallingpres = yes
callwaitingcallerid = yes
threewaycalling=yes
transfer=yes
canpark = yes
cancallforward = yes
callreturn = yes
echocancel=yes
echotraining=yes
immediate=no
context=Local
signalling=fxo_ks
echocancel = yes
echocancelwhenbridged = yes
relaxdtmf = yes
rxgain = 0.0
txgain = 0.0
group = 1
callgroup = 1
pickupgroup = 1
immediate = no
switchtype = national
context = from-pstn
group = 0
echocancel = yes
signalling = pri_cpe
channel => 1-23
; comúnmente llamados NI2
Algunas compañías utilizarán el switch DMS de Nortel, que habitualmente utiliza el protocolo DMS100
en vez de National ISDN 2. En este caso establezca el switchtype a DMS100:
switchtype = dms100
Fuera de Canadá y de los EE.UU., los circuitos PRI son llevados en un circuito E1.
En Europa, un circuito E1 usado para PRI normalmente tendrá las siguientes características:
•
Código de línea: CCS
•
Framing: HDB3 (bipolar de alta densidad)
El archivo /etc/dahdi/system.conf podría ser algo como esto:
span = 1,0,0,ccs,hdb3,crc4
bchan = 1-15,17-31
hardhdlc = 16
Y el archivo /etc/Asterisk/chan_dahdi.conf puede ser algo como esto:
[trunkgroups]
[channels]
usecallerid = yes
hidecallerid = no
callwaiting = yes
usecallingpres = yes
callwaitingcallerid = yes
threewaycalling = yes
transfer = yes
canpark = yes
cancallforward = yes
callreturn = yes
echocancel = yes
echocancelwhenbridged = yes
relaxdtmf = yes
rxgain = 0.0
txgain = 0.0
group = 1
callgroup = 1
pickupgroup = 1
immediate = no
switchtype = qsig
context = pri_incoming
group = 0
signalling = pri_cpe
channel => 1-15,17-31
BRI ISDN. Basic Rate Interface ISDN (comúnmente conocido como BRI, o, a veces incluso sólo ISDN) fue
pensado para ser el hermano más pequeño de PRI. BRI sólo proporciona dos canales B de 64K y un canal
D 16K. El uso de BRI ha sido algo limitado en América del Norte (no se recomienda su uso por cualquier
razón), pero en algunos países de Europa es ampliamente utilizado y ha reemplazado casi totalmente los
circuitos analógica.
El soporte BRI bajo Asterisk será diferente dependiendo de la tarjeta BRI que está instalando. El
fabricante de la tarjeta BRI proporcionará instrucciones específicas para su hardware.
Cuando instala hardware de telefonía, asegúrese de actualizar el archivo /etc/dahdi/modules para
habilitar los módulos apropiados para su hardware y vuelva a recargar DAHDI con el init script
(/etc/init.d/dahdi). Usted puede utilizar el comando dahdi_genconf modules para generar el archivo
de módulos para su sistema también.
MFC/R2. El protocolo MFC/R2 podría ser considerado como un precursor de ISDN. Fue utilizado por
primera vez en los circuitos analógicos, pero ahora es en su mayoría implementado en los mismos
circuitos E1 que también llevan ISDN-PRI. Este protocolo no se encuentra típicamente en Canadá, los
EE.UU., y Europa occidental, pero es muy popular en algunas partes del mundo (especialmente en
América Latina y Asia), sobre todo porque tiende a ser un servicio menos costoso ofrecido por las
compañías telefónicas.
Hay muchos sabores diferentes de este protocolo, cada país tiene una variante regional diferente.
El proyecto OpenR2 provee la librería libopenr2, que necesita ser instalada en su sistema para que
Asterisk pueda soportar sus circuitos R2. Antes de instalar libopenr2, sin embargo, es necesario tener
instalado DAHDI.
El orden de compilación y la instalación, por lo tanto, es:
1. DAHDI
2. libopenr2
3. Asterisk
Una vez OpenR2 se ha instalado, puede utilizar la aplicación r2test para ver una lista de variantes que
son soportadas:
$ r2test -l
Código Variante
AR
BR
CN
CZ
CO
EC
ITU
MX
PH
VE
País
Argentina
Brasil
China
República Checa
Colombia
Ecuador
Unión Internacional de Telecomunicaciones
México
Filipinas
Venezuela
Para obtener información adicional sobre la configuración de R2 en Asterisk, consulte el archivo
configs/chan_dahdi.conf.sample incluido en el árbol de código fuente de Asterisk (busque "mfcr2").
Además, OpenR2 contiene algunos archivos de configuración de ejemplo para conectar Asterisk a las
redes en varios países. Para obtener información acerca de algunas de las variantes de países, busque el
folder /doc/asterisk y refiérase a los documentos dentro del subdirectorio apropiado:
$ ls doc/asterisk/
ar br ec mx ve
Como ejemplo, OpenR2 proporciona un ejemplo de configuración para la conexión a Telmex o Axtel en
México. Daremos un paseo a través de este para que te tengas una idea del proceso. En primer lugar,
debe configurar DAHDI modificando /etc/dahdi/system.conf como se muestra aquí:
loadzone = us
defaultzone = us
span = 1,1,0,cas,hdb3
cas = 1-15:1101
cas = 17-31:1101
span = 2,1,0,cas,hdb3
cas = 32-46:1101
cas = 48-62:1101
A continuación, debe configurar Asterisk modificando /etc/asterisk/chan_dahdi.conf de la siguiente manera:
signalling = mfcr2
mfcr2_variant = mx
mfcr2_get_ani_first = no
mfcr2_max_ani = 10
mfcr2_max_dnis = 4
mfcr2_category = national_subscriber
mfcr2_mfback_timeout = -1
mfcr2_metering_pulse_timeout = -1
; esto es para fines de depuración
mfcr2_logdir = log
mfcr2_logging = all
; fin de configuración de depuración
channel => 1-15
channel => 17-31
Configuración de circuitos analógicos
Hay muchas empresas que producen tarjetas PSTN para Asterisk. La tarjeta tendrá que tener sus
controladores instalados para que Linux pueda reconocerlo. A partir de ese punto, la configuración es
manejado por el módulo de Asterisk chan_dahdi.
Para configurar una tarjeta FXO para trabajar con Asterisk, se requieren dos archivos: el primero no es
un archivo de configuración de Asterisk, y por lo tanto se encuentra en la carpeta /etc/dahdi en su
sistema. Este archivo, system.conf, le permite definir algunos parámetros básicos, así como especificar
los canales que estarán disponibles para su sistema. Nuestro ejemplo asume una tarjeta FXO de cuatro
puertos, pero muchas combinaciones diferentes son posibles, dependiendo de su hardware:
loadzone = us
defaultzone = us
; tonezone define el sonido que la interfaz debe producir
; (Tono de marcado, tono de ocupado, de devolución de llamada, etc)
; define un tonezone predeterminado
fxsks = 1-4
; Los canales de la tarjeta que tendrán estos parámetros
Una vez que su tarjeta y canales son conocidos por el sistema operativo, debe configurarlos para
Asterisk a través del archivo /etc/asterisk/chan_dahdi.conf:
[channels]
;
; Para aplicar otras opciones para estos canales, poner antes de "canal".
;
signalling = fxs_ks
; en Asterisk los canales FXO usan señalización FXS
; (y si, los canales FXS usan señalización FXO)
channel => 1-4
; aplicar todos los parámetros previamente definidos en estos canales
En este ejemplo, le hemos dicho Asterisk que los cuatro primeros canales DAHDI en el sistema son
puertos FXO.
La extensión S. Si se conecta a la PSTN usando canales analógicos, tenemos que explicar la extensión s.
Cuando las llamadas entran en un contexto sin una extensión de destino específico (por ejemplo, una
línea FXO timbra desde la PSTN), se pasan a la extensión s. (la “s” significa "start", ya que es donde la
llamada se iniciará si ninguna información de la extensión fue pasada con la llamada). Esta extensión
también puede ser útil para aceptar llamadas que han sido redirigidas desde otras partes del plan de
marcado. Por ejemplo, si tenemos una lista de números Direct Inward Dialing (DID) que van todos al
mismo lugar, podríamos querer apuntar cada DID a la extensión s, en lugar de tener que codificar lógica
del dialplan duplicada para cada DID.
Dado que esto es exactamente lo que necesitamos para nuestro plan de marcado, vamos a empezar a
rellenar las piezas. Vamos a realizar tres acciones sobre la llamada (contestarla, reproducir un archivo de
sonido, y colgar la llamada), por lo que nuestra extensión s tendrá tres prioridades. Nosotros
colocaremos las tres prioridades debajo de [entrada], porque hemos decidido que todas las llamadas
entrantes deben comenzar en este contexto:
[entrada]
exten => s,1,Answer()
same => n,Playback(tt-weasels)
same => n,Hangup()
Obviamente, usted normalmente no contestaría una llamada para luego colgarla. Por lo general, las
llamadas entrantes o bien serán atendida por una operadora automática, o timbrará directamente a un
teléfono (o grupo de teléfonos).
VoIP
En comparación con la gran historia de las telecomunicaciones, VoIP es todavía un concepto
relativamente nuevo. Por un siglo más o menos antes de la VoIP, la única manera de conectar su sitio a
la PSTN era mediante el uso de circuitos proporcionados para este propósito por la compañía telefónica
local. VoIP ahora permite conexiones entre puntos finales sin que la PSTN participe del todo (aunque en
la mayoría de los escenarios de VoIP, todavía habrá un componente PSTN en algún momento, sobre
todo si hay un número de teléfono tradicional E.164 involucrado).
Lidiando con la traducción de direcciones de red (NAT)
Si usted va a usar VoIP a través de cualquier tipo de red de área amplia (como la Internet), usted tendrá
que lidiar con los firewalls y traducción de direcciones de red (NAT). Un entendimiento básico de cómo
los protocolos SIP y RTP trabajan juntos para crear una llamada VoIP puede ser útil para comprender y
depurar problemas (como el muy común problema "One-way audio", que los problemas de
configuración de NAT a menudo crean). NAT permite que una sola dirección IP externa sea compartida
por varios dispositivos detrás de un router.
Dado que NAT se maneja normalmente en el Firewall, este también forma parte de la capa de seguridad
entre una red privada e Internet.
Una llamada VoIP usando SIP no consiste sólo de los mensajes de señalización para establecer la llamada
(la parte SIP de la conexión). Esta también requiere los streams RTP (el medio), los cuales llevan la
conexión de audio actual, como se muestra en la Figura.
Imagen SIP y RTP
El uso de protocolos separados para llevar el audio es lo que puede hacer que NAT sea problemático
para las conexiones VoIP, especialmente si los teléfonos remotos están detrás de un NAT, y la central
está detrás de un NAT diferente. El problema es causado por el hecho de que mientras que la
señalización SIP típicamente se le permite pasar a través de los firewall en ambos extremos, los streams
RTP pueden no ser reconocidos como parte de la sesión SIP que toma lugar, y por lo tanto se omitirá o
se bloquea, como se muestra en la Figura siguiente:
RTP bloqueado por el firewall
En esta sección vamos a discutir algunos de los métodos que puedes emplear para aliviar los problemas
causados por NAT. Hay dos escenarios diferentes que deben tenerse en cuenta, cada uno requiere
definir parámetros en el archivo sip.conf. Siempre y cuando usted entienda cuál es el escenario con el
que está tratando, la mayoría de los problemas de NAT vienen a ser cosa del pasado.
Dispositivos detrás de NAT
En primer lugar, vamos a tratar con los dispositivos detrás de un NAT remoto que se conectan a la caja
de Asterisk, como se muestra en la imagen.
Dispositivo remoto detrás de un NAT
Cuando un dispositivo intenta iniciar una sesión, se construye un mensaje SIP que contiene la dirección
IP y alguna información adicional. Cuando Asterisk ve esta información, la utiliza para determinar el
punto a donde responder. Dado que el dispositivo está detrás de NAT, el mensaje SIP tiene una
dirección de respuesta que no se puede enrutar (por ejemplo, 192.168.1.121). Sin embargo, podemos
decirle a Asterisk que ignore la dirección del mensaje SIP, y en cambio que use la que es suministrada
por la pila de red. Podemos habilitar esto a través de la opción nat en el archivo sip.conf. La tabla
siguiente enumera los argumentos que podemos establecer con la opción nat.
Argumento
no
Descripción
No realizar ninguna manipulación especial NAT que no sea lo que se especifica en
el RFC 3581.
force_rport
Incluso si no se especifica ningún parámetro rport, actúa como si hubiera habido
uno.
comedia
Envía los datos de regreso por el puerto que se recibieron e ignora el puerto
solicitado en el encabezado SDP.
auto_force_rport
Si Asterisk puede determinar que el dispositivo está detrás de NAT, establece la
opción force_rport. Este es el valor predeterminado.
auto_comedia
Si Asterisk puede determinar que el dispositivo está detrás de NAT, defina la
opción comedia.
RFC 3581 permite a un dispositivo utilizar el parámetro rport para indicarle al dispositivo en el otro
extremo que debe responder a la IP de origen y el puerto desde donde se originó la solicitud, en lugar de
utilizar la dirección suministrada en la cabecera SIP. El suministro del parámetro rport puede pasar
cuando el dispositivo sabe que está detrás de un NAT y no puede escribir la información que se requiere
en la cabecera SIP para comunicarse bidireccionalmente. Asterisk siempre honrará el parámetro rport si
es suministrado, pero ya que esto no es tan común como uno le gustaría, podemos forzar a Asterisk a
asumir que el dispositivo le ha suministrado un parámetro rport. Al hacer esto, instruimos a Asterisk
para responder siempre a la IP de origen y el puerto desde el cual se recibió la solicitud. Si ningún
parámetro nat es explícitamente definido, Asterisk usará de forma predeterminada auto_force_rport
como el valor del parámetro nat. Usted puede forzar este comportamiento estableciendo
nat=force_rport.
La opción comedia (medios de comunicación orientados a conexión) se puede utilizar para instruir
Asterisk para enviar los datos (RTP) a la dirección y el puerto del extremo de procedencia desde donde
llegaron los datos. Esto se utiliza cuando un dispositivo está detrás de NAT y no puede decirle a Asterisk
la ubicación correcta para enviar los datos. También puede especificar varias opciones para la
configuración de NAT, separando los argumentos con una coma. Por ejemplo, es común fijar tanto
force_rport y comedia como el método de manejo de NAT (recomendamos comenzar con):
nat=force_rport,comedia
Otro truco cuando trata con dispositivos detrás de NAT es para activar la opción qualify. En muchos
sistemas NAT, sino se mantiene un diálogo periódicamente, entonces, el dispositivo que proporciona el
NAT puede cerrar la conexión. Mediante el uso de qualify, Asterisk enviará una solicitud al dispositivo en
el otro extremo, la cual debe ser respondida. Por defecto, si usa qualify=yes sobre un peer, entonces el
tiempo de estas operaciones es cada 2000 milisegundos (2 segundos). También puede especificar el
tiempo en milisegundos en lugar de usar yes:
qualifyfreq=60
qualify=120000
; sondea el dispositivo en el otro extremo cada 60 segundos.
; permite 10 segundo para una repuesta (qualify).
Asterisk detrás de NAT
El segundo escenario es que Asterisk esté detrás de NAT, como se ilustra en la imagen a continuación.
Asterisk detrás de NAT
En este caso, tenemos un par de maneras de escribir los encabezados SIP de una manera amigable para
el otro extremo.
Hay dos opciones principales cuando Asterisk está detrás de NAT: externip y externhost. Al usar estas
opciones tenemos que decidir entre una o la otra, ya que realizan efectivamente la misma
funcionalidad: componen la cabecera SIP utilizando la dirección de la interfaz externa. Puesto que
nuestra caja Asterisk tendrá una dirección IP no direccionable a través de Internet (estamos detrás de
NAT), podemos decirle a Asterisk cuál es su dirección enrutable externa, por lo que podemos colocar
esta en las cabeceras de nuestro mensaje SIP.
Si nuestra dirección IP externa fuera algo como 196.3.81.24, podríamos fijar externip así:
externip=196.3.81.24
También se puede especificar el número de puerto que debe ser respondido:
externip=196.3.81.24:9999
Si no se proporciona el número de puerto, se utilizará el número de puerto especificado con la opción
udpbindaddr.
Alternativamente, puede usar la opción externhost, la cual es similar a la opción externip, pero la
dirección IP se resolverá cuando chan_sip.so sea cargado en memoria (o en recargas posteriores). El
formato es similar a externip excepto que utiliza un nombre de host. También puede especificar un
número de puerto. Por ejemplo:
externhost=pbx.sncvoip.com:9999
Si quieres que el nombre de host externo se actualice periódicamente, puede utilizar la opción
externrefresh. El valor especificado es en segundos:
externhost= pbx.sncvoip.com:5060
externrefresh=300
Si ha implementado su servidor Asterisk detrás de NAT, es probable que usted también tenga un
conjunto de teléfonos locales conectado a este. Nosotros no queremos destrozar los encabezados de los
mensajes SIP que estamos enviando a nuestras extensiones locales, por lo que podemos especificar qué
direcciones IP se consideren parte de la red local. De esta manera Asterisk responderá simplemente con
los encabezados como lo serían en una red interna. Nosotros usamos la opción localnet para especificar
qué redes se consideran locales para nuestro sistema Asterisk.
También es importante establecer el parámetro localnet incluso si no hay dispositivos locales que se
comunican con Asterisk, ya que el propio sistema Asterisk es parte de la red local. Con la opción
localnet en combinación con externip o externhost ayudará Asterisk entender que direcciones de
red debe buscar en las cabeceras SIP con el fin de sobrescribirla.
La opción localnet toma el formato de una dirección IP y la máscara de subred. También se puede usar
la notación CIDR o notación separada por puntos. Se permiten entradas múltiples:
externip=196.3.81.24
localnet=192.168.0.0/24
localnet=192.168.100.0/255.255.255.0
Manejando Medio RTP
En esta sección vamos a explorar cómo Asterisk maneja los medios de comunicación y esbozar algunas
de las opciones disponibles para usted. Si usted tiene una topología de red simple donde su caja de
Asterisk es conectada directamente a la PSTN vía hardwares tradicionales (conexiones análogas o
digitales) y sus dispositivos finales están todos en la misma LAN como Asterisk, la configuración
predeterminada es probablemente adecuada y puede pasar a la siguiente sección. Si se conecta a un
proveedor de servicios de telefonía por Internet (ITSP) a través de SIP, es posible que desee comenzar
con la configuración de directmedia = no en el archivo sip.conf.
A menos que tenga una razón para dirigir lo medio fuera de su caja de Asterisk, el uso de
directmedia=no normalmente hace la configuración un poco más fácil de tratar con:
•
Asterisk siempre utilizará el modo de RTP simétrico tal como se define en el RFC 4961, lo que
significa que Asterisk siempre enviará los paquetes desde el mismo puerto que inicialmente
recibió los datos. El texto en el RFC 4961 es relativamente corto y es una lectura útil sobre cómo
Asterisk maneja los datos RTP entre dispositivos finales. Este conocimiento debería simplificar
sus esfuerzos de diseño de red que debe esperar para manejar los dispositivos fuera de su
entorno LAN en cualquier punto en el futuro.
•
Si necesita reemplazar la dirección IP utilizada para los medios, puede hacerlo con la opción
media_address. Esta opción le permitirá ignorar la dirección de los medios suministrado en las
cabeceras de SDP y dirigir los medios a otro lugar. Usando la opción media_address no se puede
configurar por dispositivo: esta es una opción general (global) solamente.
•
Por defecto Asterisk intentará re-invitar a los medios entre los puntos finales directamente. La
redirección de los datos pasa cuando Asterisk determina que no es necesario permanecer en la
ruta de los medio. (algunas veces cuando Asterisk necesita estar en la ruta de los datos RTP
incluye la grabación de llamada y escucha de los DTMF.) Cuando Asterisk se encuentra en el
exterior de una red en la que los dispositivos finales están detrás de un NAT, la redirección de
los datos RTP no funciona muy bien (o en absoluto). En este caso usted debe usar la opción
directmedia=no para prevenir el redireccionamiento de los medios.
La configuración predeterminada es directmedia=yes, así que si usted tiene dispositivos finales
detrás de un NAT que Asterisk no es parte de este, debe establecer la opción de
directmedia=no.
Cambiar la opción directmedia únicamente afecta el re-INVITE de los streams de medios, y
no otras instancias de re-INVITE, como durante la negociación T.38.
Existe una opción que permite a Asterisk la redirección de medios RTP entre puntos finales
sobre la misma red que Asterisk, al menos como mejor determinado por el núcleo RTP. Habilitar
la redirección de los medios en la red local se puede hacer con directmedia=nonat. Si usted
quiere realizar un UPDATE en vez de un re-INVITE cuando re direcciona los medios, puede hacer
esto con directmedia=update. Si combina update con nonat (ejemplo, directmedia=nonat,
update), entonces efectivamente está realizando una directmedia =yes.
Si tiene un dispositivo que usted conoces que este va a enviar para Asterisk un re-INVITE en una
llamada entrante, puedes definir directmedia=outgoing, para instruir a Asterisk para no
molestarse en intentar un re-INVITE para los medios desde este dispositivo (puesto que se
espera que el dispositivo en el otro extremo intente esto). Al establecer esta opción puede
ayudar a evitar situaciones, donde ambos extremos al mismo tiempo intentan redireccionar los
medios tras el establecimiento de una llamada inicial (vea las imágenes siguientes).
RTP sin re-INVITE
RTP con re-INVITE
El protocolo SIP fue diseñado para permitirles a los dispositivos finales negociar las capacidades de los
medios, posteriormente, hacer conexiones directas entre sí. El concepto era que los servidores no
necesitaban manejar la carga de datos para los clientes que tenía la capacidad de intercambiar los datos
directamente entre sí (por ejemplo, tal como dos teléfonos que participan en una llamada telefónica).
Sin embargo, debido a los problemas inherentes a los firewall con NAT habilitados y otras topologías de
red complejas, acoplado con el increíble poder de procesamiento de los servidores modernos, a menudo
es más fácil pasar siempre los datos a través del servidor, en lugar de lidiar con la complejidad de
clasificar problema de re-INVITE a través todas las clases de diversas redes y topologías.
•
Asterisk puede también intentar configurar los medios directamente entre dispositivo sin un reINVITE al habilitar directrtpsetup=yes. El uso de directrtpmedia viene con algunas salvedades,
sin embargo, se considera experimental, y no va a funcionar para el vídeo o los casos en que el
destinatario envía cargas RTP y cabeceras fmtp en el 200 OK que no coinciden con el INVITE de
la persona que llama. Adicionalmente, esta opción no puede ser usada cuando los dispositivos
están debajo de NAT.
•
Usted puede controlar cuales dispositivos finales pueden intentar enviar directmedia entre sí
con directmediadeny y directmediapermit. Esto es útil en situaciones donde su topología de
redes no permite que ciertas redes intercambie datos una con otras, al contrario requieren que
los medios fluyan a través del servidor Asterisk. Un ejemplo del uso sería negar todos los medios
que fluyen entre las redes, entonces permitirles explícitamente a ciertas redes enviar
directmedia:
directmediadeny=0.0.0.0/0
directmediapermit=192.168.101.0/24
directmediapermit=172.16.1.0/24
Como puedes ver, hay varias opciones que le permiten controlar como los medio son manejado por
Asterisk. Esta flexibilidad es lo que hace a Asterisk tan atractivo para usarse en muchas redes. Con el
conjunto de opciones adecuada (y mucha paciencia), usted debe ser capaz de manejar casi cualquier
obstáculo en red.
PSTN Terminación
Hasta que VoIP reemplace totalmente la PSTN, habrá una necesidad de conectar las llamadas de las
redes VoIP a la red telefónica pública. Este proceso se conoce como terminación. Lo que esto significa es
que en algún punto un gateway conectado a la PSTN necesita aceptar llamadas desde la red VoIP y
conectar está a la red PSTN. Desde la perspectiva de la PSTN aparecerá que la llamada se originó en el
punto de terminación.
Asterisk se puede ser usado como un punto de terminación PSTN. De hecho, dado que Asterisk se
encarga de la conversión de protocolo con facilidad, este puede ser un excelente uso de un sistema
Asterisk.
Con fin de proporcionar terminación, una caja de Asterisk tendrá que ser capaz de manejar todos los
protocolos que desee conectarse a la PSTN. En general, esto significa que su caja de Asterisk necesitará
un circuito PRI para manejar las conexiones a la PSTN, y canales SIP para manejar las llamadas que
vienen desde la red VoIP. El principio básico es el mismo, independientemente de si se está ejecutando
un pequeño sistema que proporciona troncos PSTN a una oficina llena de teléfonos VoIP, o una red
compleja de maquina gateway desplegadas en lugares estratégicos, ofreciendo terminación para miles
de suscriptores.
Las llamadas de la red VoIP llegarán en el dialplan en cualquier contexto que ha asignado a los canales
SIP entrantes, y el dialplan llevara las llamadas a través de la interfaz PSTN.
En su más simple, una porción del dialplan que soporta terminación podría ser como esta:
[desde-voip-redes]
exten => _X.,1,Verbose(2, Llamada desde la red VoIP de ${EXTEN})
same => n,Dial(DAHDI/g0/${EXTEN})
Sin embargo, a menudo tendrá que manejar un plan de enrutamiento más complejo que tenga en
cuenta factores como la geografía, la política empresarial, costos, recursos disponibles, etc.
Dado que la mayoría de los circuitos PSTN le permiten marcar cualquier número en cualquier parte
del mundo, y dado que se espera que usted pague por todos los gastos incurridos, no podemos
estresarnos bastante con la importancia de la seguridad en cualquier equipo gateway que
proporciona terminación PSTN. Los delincuentes ponen mucho esfuerzo en el craqueo de los
sistemas de teléfono (especialmente sistemas Asterisk mal asegurado), y si usted no presta mucha
atención a todos los aspectos de la seguridad, usted será víctima del fraude telefónico. Es sólo una
cuestión de tiempo.
No permita cualquier conexión VoIP insegura en cualquier contexto que contiene terminación PSTN.
PSTN Originación
Obviamente, si usted desea pasar llamadas desde la red VoIP a la PSTN, es posible también que quiera
ser capaz de aceptar las llamadas desde la PSTN a la red VoIP. El proceso de hacer esto se conoce
comúnmente como Originación. Esto simplemente significa que la llamada se originó en la PSTN.
A fin de proporcionar originación, se requiere un número de teléfono. Por lo tanto, tendrá que obtener
un circuito de su compañía telefónica local, el cual usted conectará a su sistema Asterisk. Dependiendo
de dónde se encuentre en el mundo, hay varios tipos diferentes de circuitos que podrían proporcionar
esta funcionalidad, desde una línea POTS analógica básica a un circuito carriergrade SS7.
Los números de teléfono que se utilizan con el propósito de originación son comúnmente llamados
números de marcación interna directa (DID por su sigla en inglés). Esto no es estrictamente el caso
en todas las situaciones (por ejemplo, no se considera un DID el número de teléfono en una línea
analógica tradicional), pero el término es lo suficientemente útil que ha alcanzado gran popularidad.
Históricamente, un DID se refiere a un número de teléfono asociado con un tronco conectado al
equipo local del cliente (CPE).
Como los números de teléfono están controlados por la industria de las telecomunicaciones tradicional,
tendrá que obtener el número ya sea de una compañía telefónica directamente, o de una de las muchas
empresas que compra los números a granel y los venden en bloques más pequeños. Si obtiene un
circuito tal como un circuito PRI, normalmente será capaz de ordenar números DID que se entregarán
con el circuito.
Para aceptar una llamada desde un circuito que está usando para originación, normalmente se necesita
manejar el paso del número de teléfono al cual se llamó. Esto se debe a que los troncos PSTN suelen
manejar más de un número de teléfono, por lo que la compañía telefónica necesita identificar cual
número fue llamado para que su sistema Asterisk conozca cómo enrutar la llamada. El número marcado
se conoce comúnmente como el número de servicio de identificación de número marcado (DNIS). El
número DNIS y el DID no tienen que coincidir, pero típicamente lo hacen. Si usted está ordenando un
circuito desde la compañía telefónica, tendrá que pedir que le envíen el DNIS (si no entienden eso,
puedes querer considerar otra compañía telefónica).
En el dialplan, usted asocia los circuitos entrantes con un contexto que conoce cómo manejar los dígitos
entrantes. A modo de ejemplo, podría ser algo como esto:
[desde-pstn]
; Este es el contexto que se listo en el archivo config para el
; circuito (es decir chan_dahdi.conf)
exten => _X.,1,Verbose(2,llamadas entrantes para ${EXTEN})
same => n,Goto(mapeo-numero,${EXTEN},1)
[mapeo-número] ; Este contexto no es estrictamente necesario, pero será más fácil hacer
; un seguimiento de sus DID en un solo lugar en su dialplan.
; Desde aquí se puede pasar la llamada a otra parte del dialplan
; donde el trabajo real del dialplan toma lugar.
exten => 8094834912,1,Dial(SIP/0000FFFF0001)
exten => 8094834913,1,Goto(contexto-operadora-automatica,start,1)
exten => 8094834914,1,VoiceMailMain()
; una puerta trasera muy útil para escuchar,
; los mensajes de voz
exten => i,1,Verbose(2, Llamada entrante de un número inválido)
En el contexto mapeo-número, usted enumera explícitamente todos los DIDs que usted espera manejar,
además de un manejador de números inválido para cualquier DID que no es listado en el contexto
(puede enviar lo números inválidos a la recepción, o a una operadora automática, o a un contexto que
reproduzca un mensaje de numero inválido).
De VoIP a VoIP
Con el tiempo, la necesidad de la PSTN probablemente desaparecerá, y la mayoría de las
comunicaciones de voz se llevarán a cabo a través de conexiones de redes.
La idea original detrás del protocolo SIP fue que iba a ser un protocolo peer-to-peer (punto-a-punto).
Técnicamente, este sigue siendo el caso. Sin embargo, temas como la seguridad, la privacidad, las
políticas corporativas, la integración, la centralización, etc. han hecho las cosas un poco más complicado
que simplemente poner un URI en un teléfono SIP y tener un teléfono SIP en otro lugar que timbra para
responder.
Llamadas no autenticadas para el Marcado SIP
Como aludimos en capítulo anteriores, se puede configurar el contexto no-autenticado en la sección
general del sip.conf y establecer allowguest=yes. Al hacer esto, permitimos las llamadas no
autenticadas en el dialplan. Este es un requisito si desea recibir llamadas como si fuera un correo
electrónico. (un URI SIP sería algo así como sip:[email protected], que es similar a
mail:[email protected]). Una vez que hayas configurado el contexto no-autenticado en el
extensions.conf, simplemente incluya cualquier cosa que quieras que sea públicamente accesible
desde el mundo exterior; o cree un nuevo contexto para incluir en su contexto no-autenticado. Usted
podría por ejemplo, crear una subrutina GoSub() que busque direcciones de correo de las personas y
extensiones desde su base de datos o un servidor LDAP, y enrutar las llamadas basadas en el SIP URI
que coincidan con sus direcciones de correo electrónico.
El protocolo SIP se ha convertido en inflado y complejo. La implementación de sistemas y redes basadas
en SIP sin duda se ha convertido en aún más complicada que la implementación de las PBX de telefonía
tradicional y redes.
No vamos a entrar en las complejidades del diseño e implementación de redes VoIP en este libro, pero
vamos a hablar de algunas de las formas que se puede configurar Asterisk para soportar conectividad
VoIP para otros sistemas VoIP.
Configurando Troncos VoIP.
En Asterisk, no hay la necesidad de instalar explícitamente los módulos VoIP (a menos que por alguna
razón usted no compile Asterisk con los módulos necesarios). Hay varios protocolos VoIP que se pueden
elegir para usar con Asterisk, pero nosotros nos centraremos en los dos más populares: SIP e IAX.
Configuración de troncales SIP entre sistemas Asterisk
SIP es el más popular de los protocolos de VoIP, tanto es así que muchas gente consideraría que otros
protocolos VoIP son obsoletos (no lo son, pero no se puede negar que SIP ha dominado VoIP desde hace
varios años).
El protocolo SIP es peer-to-peer y realmente no tienen una especificación formal de tronco. Esto
significa que si va a conectar un solo teléfono a su servidor o conectar dos servidores juntos, las
conexiones SIP serán similares.
Conectando dos sistemas Asterisk con SIP. Ser capaz de conectar dos sistemas Asterisk juntos para
permitir que las llamadas se envíen entre ellos es un requisito bastante común. Tal vez usted tiene una
empresa con dos ubicaciones físicas y quiere tener una PBX en cada lugar, o tal vez usted es el
administrador de la PBX de la empresa y le gusta Asterisk tanto que también le gustaría instalarlo en su
casa. Esta sección proporciona una guía rápida sobre cómo configurar dos servidores Asterisk para
poder pasar llamadas entre ellos a través de SIP. En nuestro ejemplo, vamos a referirnos creativamente
a los dos servidores como servidorA y servidorB.
El primer archivo que se debe modificar es /etc/asterisk/sip.conf. Este es el archivo de configuración
principal para la creación de cuentas SIP. Primero, esta entrada debe ser agregada a sip.conf en el
servidorA. Define un peer SIP para la conexión con el otro servidor:
[servidorB]
;
; Especifique el tipo de cuenta SIP como "peer". Esto significa que las llamadas entrantes deberán
; coincidir con la dirección IP y número de puerto. Así que, cuando Asterisk recibe una llamada de
; 192.168.1.107 y el puerto SIP estándar 5060, coincidirá con la entrada en sip.conf. A
; continuación, solicita la autenticación y espera que la contraseña coincida con el "secret"
; que se especifico aquí.
;
Type=peer
;
; Esta es la dirección IP para la caja remota (servidor). Esta opción también se puede proporcionar un
;nombre de host.
host = 192.168.1.107
;
; Cuando enviamos las llamadas a este peer SIP debemos proporcionar autenticación, se utiliza
; ‘servidorA’ como nuestro nombre de usuario por defecto.
;
defaultuser = servidorA
;
; Este es el secret compartido con el servidorB. Se puede utilizar como la contraseña cuando se esta
; recibiendo una llamada del servidorB, o él envió de una llamada al servidorB.
;
secret = s1e2g3
;
; Cuando se recibe una llamada del servidorB, compara este con las extensiones en el contexto 'entrada' del
; extensions.conf.
;
context = entrada
;
; Iniciamos limpiando la lista de códecs permitidos.
;
disallow = all
;
; Únicamente permitimos el códec ulaw
;
allow = ulaw
Asegúrese de cambiar la opción de host para que coincida con la dirección IP correspondiente a su
propia configuración.
Ahora ponga la siguiente entrada en /etc/asterisk/sip.conf en el servidorB. Es casi idéntico al contenido
de la entrada que nosotros pusimos sobre el servidorA, pero el nombre del peer y la dirección IP fueron
cambiadas:
[servidorA]
type = peer
host = 192.168.1.106
defaultuser = servidorB
secret = s1e2g3
context = entrada
disallow = all
allow = ulaw
En este punto usted debería ser capaz de verificar que la configuración se ha cargado correctamente en
Asterisk con algunos comandos del CLI. El primer comando a tratar es sip show peers. Como su nombre
indica, mostrará todos los dispositivos SIP que se han configurado:
*CLI> sip show peers
Name/username
Host
Dyn
Forcerport
ACL
Port
servidorB/servidorA
192.168.1.106
5060
1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 0 offline]
Status
Unmonitored
También puede intentar con el comando sip show peer serverB. Este comando mostrará mucho más
detalle.
El último paso en la configuración de las llamadas SIP entre dos servidores Asterisk es modificar el plan
de marcado en /etc/asterisk/extensions.conf. Por ejemplo, si usted quiere que cualquier llamada hecha
desde el servidorA para las extensiones 4000 al 4999 sea enviadas al servidorB, deberá utilizar esta línea
en el dialplan:
exten=> _4XXX,1,Dial(SIP/${EXTEN}@servidorB)
Conectando un sistema Asterisk a un proveedor SIP.
Cuando se suscribe a un proveedor SIP, es posible tener servicio para enviar y/o recibir llamadas
telefónicas. La configuración difiere ligeramente en función de su uso del proveedor SIP. Además, la
configuración será diferente entre cada proveedor. Idealmente, el proveedor SIP que usted se suscribe
debe de ofrecer ejemplos de configuración de Asterisk para ayudarle a que se conecte tan rápido como
sea posible. En caso de que no, vamos a tratar de darle una configuración muy común que le ayudará a
empezar.
Si usted recibirá llamadas desde su proveedor de servicio, los proveedores de servicios comúnmente
requieren que su servidor se registre en uno de sus servidores. Para hacer esto, debe añadir una línea de
registración en la sección [general] del archivo /etc/asterisk/sip.conf:
[general]
...
register => usuario:contraseñ[email protected]
...
A continuación, necesitará crear una entrada en sip.conf para su proveedor de servicios. He aquí un
ejemplo de la entrada por enlace:
[miprovedor]
type = peer
host = su.provedor.tld
defaultuser = nombre de usuario
secret = contraseña
; La mayoría de los proveedores no se autentican cuando envían las llamadas para usted.
; pero usted necesita esta línea para aceptar sus llamadas.
insecure = invite
dtmfmode = rfc2833
disallow = all
allow = ulaw
Ahora que la cuenta ha sido definida, debe agregar algunas extensiones en el dialplan que le permitan el
envío de llamadas a su proveedor de servicios:
exten => _1NXXNXXXXXX,1,Dial(SIP/${EXTEN}@mi -proveedor)
Encriptando las llamadas SIP.
Asterisk soporta TLS para el cifrado de la señalización SIP y el Protocolo de transporte en tiempo real
seguro (SRTP) para el cifrado de los media streams de una llamada telefónica. En esta sección vamos a
configurar llamadas usando SIP TLS y SRTP entre dos servidores Asterisk. El primer paso es asegurar que
las dependencias adecuadas se han instalado. Asegúrese de que tiene tanto OpenSSL y LibSRTP
instalados. Si no se ha instalado uno de estos, vuelva a instalar Asterisk después instale estas
dependencias para asegurarse de que el soporte a TLS y SRTP están incluidos. Una vez completado,
asegúrese de que el módulo res_srtp fue compilado e instalado. Para instalar OpenSSL, el paquete es
openssl-devel sobre RHEL y libssl-dev sobre Ubuntu. Para instalar LibSRTP, el paquete es libsrtp-devel
en RHEL y libsrtp0-dev en Ubuntu.
A continuación, vamos a configurar SIP TLS. Debe habilitar TLS mediante la opción global tlsenable en la
sección [general] del archivo /etc/asterisk/sip.conf en ambos servidores. Opcionalmente, puede
especificar una dirección si usted desea limitar la escucha de conexiones TLS a una dirección IP única en
el sistema. En este ejemplo, tenemos la dirección comodín IPv6 especificada para permitir conexiones
TLS en todas las direcciones IPv4 e IPv6 en el sistema:
[general]
tlsenable = yes
tlsbindaddr = ::
El siguiente paso es obtener los certificados. A los fines de demostrar la configuración y funcionalidad,
vamos a generar certificados con firma utilizando un script de ayuda distribuido con Asterisk. Si se
configura esto en un entorno de producción, es posible que no desee utilizar certificados de firma. Sin
embargo, si lo hace, hay una serie de aplicaciones que le ayudaran a que sea más fácil administrar su
propia autoridad de certificación (CA), como TinyCA.
El script que vamos a utilizar es ast_tls_cert, que está en el directorio /contrib/scripts del árbol de
directorios del código fuente de Asterisk. Tenemos que generar un certificado CA y dos certificados de
servidor. La primera invocación de ast_tls_cert generará el certificado CA y el certificado del servidor
para servidorA. La segunda invocación de ast_tls_cert generará el certificado del servidor para
servidorB:
$ cd contrib/scripts
$ mkdir certs
$ ./ast_tls_cert -d certs -C servidorA -o servidorA
$ ./ast_tls_cert -d certs -C servidorB -o servidorB -c certs/ca.crt -k certs/ca.key
$ ls certs
ca.cfg ca.crt ca.key servidorA.crt servidorA.csr servidorA.key servidorA.pem
servidorB.crt servidorB.csr servidorB.key servidorB.pem tmp.cfg
Ahora que se han creado los certificados, deben ser trasladados a los lugares apropiados del servidorA y
servidorB. Vamos a utilizar el directorio /var/lib/asterisk/keys para guardar los certificados. Mueva los
archivos siguientes para servidorA:
•
•
ca.crt
servidorA.pem
Y mueva estos archivos para el servidorB:
•
•
ca.crt
servidorB.pem
Con los certificados en su lugar, podemos completar la configuración de asterisk. Nosotros necesitamos
apuntar Asterisk para el servidor de certificado que hemos creado. Puesto que estamos utilizando
certificados con firma, también hay que apuntar para el certificado CA. En la sección [general] del
archivo /etc/asterisk/sip.conf sobre el servidorA, agreguemos estas opciones:
[general]
tlscertfile = /var/lib/asterisk/keys/servidorA.pem
tlscafile = /var/lib/asterisk/keys/ca.crt
Haga los mismo cambio en el archivo sip.conf sobre el servidorB.
[general]
tlscertfile = /var/lib/asterisk/keys/servidorB.pem
tlscafile = /var/lib/asterisk/keys/ca.crt
Al crear los certificados de servidor, el campo Nombre común debe coincidir con el nombre de host
del servidor. Si utiliza el script ast_tls_cert, este es el valor dado a la opción -C. Si hay un problema al
verificar el certificado del servidor cuando se hace una llamada, puede que tenga que reparar el
campo Nombre común. Por otra parte, puede establecer la opción tlsdontverifyserver = yes en la
sección [general] del archivo /etc/asterisk/sip.conf y Asterisk permitirá que la llamada proceda
incluso si falla la verificación del certificado del servidor.
En la sección “Conectando dos sistemas Asterisk con SIP” en la página 154, hemos creado la
configuración necesaria para pasar las llamadas entre el servidorA y el servidorB. Ahora vamos a
modificar esa configuración para que Asterisk conozca que las llamadas entre los dos servidores deben
ser encriptadas. El único cambio requerido es agregar la opción transport=tls a la entrada para el peer
en el otro servidor.
Sobre servidorA:
[servidorB]
type = peer
host = 192.168.1.107
defaultuser = servidorA
secret = s1e2g3
context = entrada
disallow = all
allow = ulaw
transport = tls
Sobre servidorB:
[servidorA]
type = peer
host = 192.168.1.106
defaultuser = servidorB
secret = s1e2g3
context = entrada
disallow = all
allow = ulaw
transport = tls
Ahora, cuando usted haga una llamada usando Dial(SIP/servidorA) o Dial(SIP/servidorB), la señal SIP
estará cifrada. Puede modificar el dialplan para forzar que las llamadas salientes tengan señalización
cifradas por configurar la función CHANNEL(secure_bridge_signaling) a 1:
[default]
exten => 1234,1,Set(CHANNEL(secure_bridge_signaling)=1)
same => n,Dial(SIP/1234@servidorB)
En el lado que recibe la llamada, se puede comprobar si la señalización de una llamada entrante se ha
cifrado usando la función del dialplan CHANNEL(secure_signaling). Consideremos el siguiente ejemplo
del dialplan:
[entrada]
exten => _X.,1,Answer()
same => n,GotoIf($["${CHANNEL(secure_signaling)}" = "1"]?segura:insegura)
same => n(segura),NoOp(señalización esta encriptadas.)
same => n,Hangup()
same => n(insegura),NoOp(señalización no está encriptadas.)
same => n,Hangup()
Cuando una llamada se envía desde servidorA al servidorB usando esta configuración, se puede ver
desde la salida sobre la consola de Asterisk que el dialplan determina que la señalización de la llamada
entrante está cifrada:
-- Executing [1234@entrada:1] Answer("SIP/servidorA-00000000", "")
in new stack
-- Executing [1234@entrada:2] GotoIf("SIP/servidorA-00000000",
"1?segura:insegura") in new stack
-- Goto (entrada,1234,3)
-- Executing [1234@entrada:3] NoOp("SIP/servidorA-00000000",
" señalización esta encriptadas.") in new stack
-- Executing [1234@entrada:4] Hangup("SIP/servidorA-00000000", "")
in new stack
Ahora que SIP TLS se ha configurado para las llamadas entre el servidorA y servidorB, vamos a configurar
SRTP para que los streams de datos asociados a la llamada sean cifrados también. Afortunadamente, es
muy fácil de configurar, en comparación con lo que se requería para conseguir que SIP TLS trabaje. En
primer lugar, asegúrese de que tiene el módulo res_srtp cargado en Asterisk:
*CLI> module show like res_srtp.so
Module
Description
res_srtp.so
Secure RTP (SRTP)
1 modules loaded
Use
0
Count
Para habilitar SRTP, configure la función CHANNEL(secure_bridge_media) a 1:
[default]
exten => 1234,1,Set(CHANNEL(secure_bridge_signaling)=1)
same => n,Set(CHANNEL(secure_bridge_media)=1)
same => n,Dial(SIP/1234@servidorB)
Esto indica que se requiere de medios cifrados para una llamada saliente. Cuando la llamada es enviada
a través de SIP, Asterisk requerirá que SRTP sea usado, o la llamada fallará.
Con todas estas herramientas en su lugar, puedes asegurar que las llamadas entre los dos servidores
Asterisk son completamente encriptadas. Las mismas técnicas pueden ser aplicadas para cifrar las
llamadas entre asterisk y un teléfono SIP.
Las funciones del dialplan proveen un mecanismo para verificar el estatus de encriptación de una
llamada entrante y forzar la encriptación sobre la llamada saliente. Sin embargo, tenga en cuenta que
estas herramientas sólo ofrecen los medios para controlar el cifrado de un tramo de la ruta de llamada.
Si la llamada va a través de múltiples servidores, estas herramientas no garantizan que la llamada sea
encriptada a través de todo el trayecto de la llamada. Es importante considerar cuidadosamente cuáles
son sus requerimientos para asegurar sus llamadas y tomar todas las medidas necesarias para garantizar
que esos requisitos sean respetados en todo el trayecto de la llamada. La seguridad es complicada, es
trabajo duro.
Configurando troncales IAX entre sistemas Asterisk.
El protocolo Inter-Asterisk eXchange, versión 2 (comúnmente conocido como IAX), es un protocolo VoIP
propiedad de Asterisk. Este difiere de SIP en que la señalización y los datos son llevados en la misma
conexión. Esta diferencia es una de las ventajas del protocolo IAX, ya que hace el trabajo de IAX a través
de conexiones NAT mucho más simple.
IAX trunking. Una de las características única del protocolo IAX es el trunking. Troncar una conexión IAX
podría ser útil sobre cualquier enlace de red que a menudo lleva múltiples llamadas VoIP simultáneas
entre dos sistemas. Al encapsular múltiples streams de audio en un solo paquete, un troncal IAX reduce
la sobrecarga de la conexión de datos, que puede ahorrar ancho de banda en un enlace de red muy
utilizados.
Encriptación IAX. La principal ventaja del cifrado IAX es que requiere un simple cambio en el archivo
/etc/asterisk/iax.conf:
[general]
encryption = yes
Para protección extra, se puede configurar la siguiente opción para asegurarse de que una conexión IAX
no puede ocurrir sin cifrado:
forceencryption = yes
Ambas de estas opciones pueden ser especificada en la sección [general], como también las secciones
peer/user/friend en iax.conf.
Marcación de Emergencia
En América del Norte, la gente está acostumbrada a ser capaz de marcar el 911 con el fin de llegar a los
servicios de emergencia. Fuera de Norteamérica, los números de emergencia conocidos son 112 y 999.
Si usted hará que su sistema Asterisk esté a disposición de la gente, usted está obligado (en muchos
casos regulados) a asegurar que se puedan hacer llamadas a servicios de emergencia desde cualquier
teléfono conectado al sistema (incluso desde los teléfonos que están restringido a la realización de
llamadas).
Una de las piezas esenciales de información es que la organización que responde las emergencia
necesita saber dónde está la emergencia (es decir, a dónde enviar los camiones de bomberos). En un
tronco PSTN tradicional, esta información ya es conocida por la compañía telefónica y es
subsecuentemente pasada a lo largo del Punto de Respuesta de Seguridad Pública (PSAP). Con los
circuitos VoIP las cosas pueden ser un poco más complicado, por el hecho de que los circuitos VoIP no
están vinculados físicamente a cualquier ubicación geográfica.
Usted necesita asegurarse que su sistema maneja adecuadamente las llamadas al 911 desde cualquier
teléfono conectado al mismo, y tiene que comunicar que está disponible para los usuarios. Como un
ejemplo, si usted permite que los usuarios se registren en el sistema desde un softphones en sus
computadoras portátiles, que pasa si ellos se encuentran en una habitación de un hotel en otro país, y
marcan el 911?
El dialplan para el manejo de las llamadas de emergencia no tiene que ser complicado. De hecho, es
mucho mejor que sea sencillo. La gente a menudo son tentado a implementar todo tipo de
funcionalidad en las porciones de los servicios de emergencia de su dialplan, pero si un error en una de
esas funcionalidades de fantasía hace que una llamada de emergencia falle, vidas podrían estar en
peligro. Este no es lugar para jugar. La sección de los [servicios-emergencia] de su plan de marcado
podría ser algo como esto:
[servicios-emergencia]
exten => 911,1,Goto(dialpsap,1)
exten => 9911,1,Goto(dialpsap,1)
; Alguna personas van a marcar el 9
; Porque están acostumbrada hacerlo desde su PBX
exten => 999,1,Goto(dialpsap,1)
exten => 112,1,Goto(dialpsap,1)
exten => dialpsap,1,Verbose(1,llamada iniciada para PSAP!)
same => n,Dial(${LOCAL}/911)
; REMPLACE 911 AQUI CON EL NUMERO
; APPROPIADO PARA SU AREA
[interno]
include => servicios-emergencia
; Tiene que tener este en cualquier contexto
; que tiene usuario en él.
En contexto donde usted sabe que los usuarios no están en el lugar (por ejemplo, usuarios remotos
conectados con su laptops), algo como esto podría ser mejor:
[no-servicios-emergencias]
exten => 911,1,Goto(nopsap,1)
exten => 9911,1,Goto(nopsap,1) ; para persona que marcan el '9' antes del número externo
exten => 999,1,Goto(nopsap,1)
exten => 112,1,Goto(nopsap,1)
exten => nopsap,1,Verbose(1,Llamada iniciada para PSAP!)
same => n,Playback(no-emerg-service) ; necesitará grabar este mensaje
[usuarios-remoto]
include => no-servicios-emergencias
En América del Norte, las regulaciones han obligado muchos a los proveedores de VoIP para ofrecer lo
que popularmente se conoce como E911. Cuando se suscribe a sus servicios, ellos requieren información
de la dirección de cada DID que desea asociar a las llamadas salientes. Esta información de la dirección
entonces se envía al PSAP apropiado para esta dirección, y sus llamadas de emergencia pueden ser
manejadas de la misma manera que si fueran marcadas desde un circuito tradicional PSTN.
La conclusión es que usted necesita asegurarse de que el sistema telefónico que ha creado permite las
llamadas de emergencia.
Capı́tulo 10
Correo de Voz
Antes de que el correo electrónico y la mensajería instantánea se generalizaran, el correo de voz era un
método popular de mensajería electrónica. A pesar de que la mayoría de la gente prefiere los sistemas
de mensajería basados en texto, el correo de voz sigue siendo un componente esencial de cualquier
PBX.
Comedian Mail
Una de las características más populares de cualquier sistema telefónico moderno es el correo de voz.
Asterisk dispone de un sistema de correo de voz razonablemente flexible llamado Comedian Mail. El
correo de voz en Asterisk está previsto en el plan de marcado por el módulo app_voicemail.so.
Algunas de las características del sistema de correo de voz de Asterisk son:
•
Buzones de voz protegidos por contraseña ilimitados, cada uno contienen su carpetas buzón de
correo de voz para la organización
•
Diferentes saludos para los estados ocupados y no disponible
•
Saludos predeterminados y personalizados
•
La capacidad de asociar los teléfonos con más de un buzón de correo y buzones de correo con
más de un teléfono
•
Notificación por correo electrónico de correo de voz, el correo de voz opcionalmente adjunto
como un archivo de sonido.
•
El reenvío de correo de voz y transmisiones
•
Indicador de mensaje en espera (luz intermitente o tono de marcado entrecortado) sobre
muchos tipos de teléfonos.
•
Directorio de los empleados de la empresa, basado en los buzones de voz.
Y eso es sólo la punta del iceberg!
La versión por defecto del archivo de configuración /etc/asterisk/voicemail.conf requiere algunos
ajustes con el fin de proporcionar una configuración que sea adecuada para la mayoría de las
situaciones.
Vamos a empezar por ir a través de las diferentes opciones que se pueden definir en voicemail.conf, y
luego vamos a proporcionar un archivo de configuración de ejemplo con los ajustes que recomendamos
para la mayoría de las implementaciones.
El archivo voicemail.conf contiene varias secciones donde los parámetros se pueden definir. Las
siguientes secciones detallan todas las opciones que están disponibles.
La sección [general]
La primera sección, [general], permite definir la configuración global de su sistema de correo de voz. Las
opciones disponibles se muestran en la tabla a continuación.
Tabla sección [general] opciones para voicemail.conf
Opción
Valor/Ejemplo
Notas
format
wav49|gsm|wav
Para cada formato listado, Asterisk crea una grabación
separada en ese formato cada vez que se deja un mensaje.
El beneficio es que algunos pasos de transcodificación se
pueden ahorrar si el formato almacenado es el mismo que
el códec utilizado en el canal. Nosotros preferimos WAV,
porque es de superior calidad, y wav49 que es bien
comprimido y fácil de enviar por correo electrónico. No
nos gusta GSM debido a su sonido estridente, pero goza
de cierta popularidad.
serveremail
usuario@dominio
Cuando se envía un correo desde Asterisk, esta es la
dirección de correo electrónico que aparece cuando llega.
attach
yes,no
Si se especifica una dirección de correo electrónico para
un buzón, éste determina si el mensaje se adjuntara al
correo electrónico (si no, un mensaje simple de
notificación se envía).
maxmsg
9999
Por defecto, Asterisk únicamente permite un máximo de
100 mensajes por usuario para ser almacenado. Para los
usuarios que borran los mensajes, esto no es problema.
Para las personas que les gusta guardar sus mensajes, este
espacio puede ser devorado rápidamente. Con el tamaño
de los discos duros en estos días, se puede fácilmente
almacenar miles de mensajes para cada usuario, por lo
que nuestro pensamiento actual es establecer esta opción
al máximo y dejar que los usuarios administren las cosas
de allí.
maxsecs
0
Este tipo de ajuste fue útil anteriormente cuando un
sistema de correo de voz grande únicamente podía tener
sólo 40 MB de almacenamiento: era necesario limitar el
sistema, ya que era fácil llenar el disco duro. Hoy en día,
con unidades de terabyte comunes, no hay ninguna razón
técnica para limitar la longitud de un mensaje. Dos
consideraciones son las siguientes: 1) si un canal se queda
enganchada en un buzón, es bueno establecer algún valor,
de modo que no se quede allí durante días, pero 2) si un
usuario desea utilizar el buzón para grabar notas para sí
mismo, no se lo agradecerá si lo interrumpió después de 3
minutos. Una configuración entre 600 segundos (10
minutos) y 3600 segundos (1 hora), probablemente será
adecuada.
minsecs
4
Muchas personas cuelgan en vez de dejar un mensaje
cuando llaman a alguien y obtienen el correo de voz. A
veces esto sucede después que la grabación ha
comenzado, por lo que el propietario del buzón recibe un
mensaje de 2 segundos de alguien que colgó. Esta
configuración asegura que Asterisk ignore los mensajes
que son más cortos que la longitud mínima configurada.
Usted debe tener cuidado de no establecer un valor
demasiado alto, sin embargo, porque un mensaje como
"Hey, soy yo, llámame" (que se puede decir en menos de 1
segundo) se pierde, y le llegarán quejas de que los
mensajes se desaparecen. Tres segundos parecen ser
adecuados. Para disuadir a las personas de dejar mensajes
ultracortos que podrían ser descartados, el saludo puede
solicitar al que llama identificarse y dejar un poco de
información acerca de por qué ha llamado.
maxgreet
1800
Puede definir la máxima longitud del saludo si usted
desea. Una vez más, ya que el almacenamiento no es un
problema y establecer está opción con un valor demasiado
bajo puede molestar a sus usuarios más expresivos, se
sugiere configurar a un valor alto y dejar a sus usuarios
averiguar la longitud apropiada para ellos.
skipms
3000
Al escuchar los mensajes, los usuarios pueden saltar hacia
delante o hacia atrás pulsando (por defecto) * y #. Este
valor indica la longitud del salto (en milisegundos).
maxsilence
5
Esta configuración define el tiempo máximo durante el
cual la persona que llama puede permanecer en silencio
antes de detener la grabación. Nos gusta establecer este
valor a 1 segundo más que minsecs (si se define igual o
mayor que minsecs, obtendrá una advertencia que dice
"maxsilence debe ser inferior a minsecs o puede recibir
mensajes vacíos"). Este valor es probablemente más útil
cuando se tienen troncales analógicos, cuando el otro
extremo se desconecta puede ser poco fiable en tales
circuitos.
silencethreshold
128
Este parámetro le permite afinar la sensibilidad de silencio
del parámetro anterior, maxsilence. Los valores válidos
son de 0 a 32767. El valor predeterminado es 128. El valor
ayuda app_voicemail a decidir qué amplitud se utiliza
como un punto de referencia en cuanto a lo que se
considere "silencio". Como se trata de un valor lineal, y la
amplitud debe ser considerada adecuadamente en
términos de decibeles (las cuales son logarítmicas), no
recomendamos ajustar este parámetro a menos que tenga
una sólida comprensión de amplitud, decibeles, escalas
logarítmicas, programación en C, procesamiento digital de
la señal, y así sucesivamente. Si usted tiene problemas de
audio con el sistema, éste no es el primer lugar al que ir
para tratar de resolverlos.
maxlogins
3
Esta pequeña característica de seguridad está diseñado
para hacer que los ataques de fuerza bruta sobre las
contraseñas de buzones tomen más tiempo. Si una
contraseña incorrecta se recibe muchas veces, el correo
de voz colgará y tendrás que volver a llamar e intentarlo
de nuevo. Tenga en cuenta que esto no va a bloquear el
buzón. Curiosos pacientes pueden seguir tratando de
iniciar sesión en su buzón tantas veces como quieran, ellos
sólo tienen que llamar cada tres intentos. Si usted tiene
una gran cantidad de usuarios puede establecer esto a
algo así como 5.
moveheard
yes
Este ajuste mueve los mensajes escuchados a la carpeta
Old. Recomendamos dejar esto en el valor
predeterminado.
forward
_auto
_
urgent no
Si se establece en sí conservará la configuración original de
la urgencia de los mensajes que el usuario recibe y
reenvía. Si lo deja en no, los usuarios pueden ajustar el
nivel de urgencia sobre los mensajes que ellos reenvían.
userscontext
default
Si utiliza el archivo users.conf (nosotros no), puede definir
aquí el contexto en el que las entradas son registrada.
externnotify
/path/to/script
Si desea ejecutar una aplicación externa siempre que un
mensaje es dejado, lo puede definir aquí.
smdienable
no
Si usted está usando Asterisk como un servidor de correo
de voz sobre una PBX que soporta SMDI, puede habilitar
esto aquí.
smdiport
/dev/ttyS0
Aquí es donde se podría definir el puerto SMDI que los
mensajes entre Asterisk y una PBX externa pasarían a
través.
externpass
/path/to/script
Cada vez que se cambia la contraseña de un buzón de
correo, el script que se define aquí, será notificado del
contexto, buzón de correo, y la nueva contraseña.
externpassnotify
/path/to/script
Cada vez que se cambia la contraseña de un buzón de
correo, el script que se define aquí, será notificado del
contexto, buzón de correo, y la nueva contraseña. Asterisk
se encargará de la actualización de la contraseña en
voicemail.conf. Si ha definido externpass, esta opción será
ignorada.
externpasscheck
/usr/local/bin/voice
mailpwcheck.py
Consulte el recuadro después de esta tabla para obtener
una descripción de esta opción.
directoryintro
dir-intro
La aplicación del dialplan Directory() utiliza el archivo
voicemail.conf para buscar por nombre desde la
operadora automática (Auto attendant). Hay un prompt
predeterminado que es reproducido, llamados dir-intro. Si
lo desea, puede especificar un archivo diferente para
reproducir en su lugar.
charset
ISO-8859-1
Si usted necesita un conjunto de caracteres que no sea
ISO-8859-1 (también conocido como Latín 1) que sea
compatible, puede especificarlo aquí.
adsifdn
0000000F
Use esta opción para configurar el número descriptor de
funciones. (Feature Descriptor Number).
adsisec
9BDBF7AC
Utilice esta opción para configurar el código de bloqueo de
seguridad.
adsiver
1
Especifica el número de versión de la aplicación de correo
de voz ADSI.
pbxskip
yes
Si usted no quiere que los correos electrónicos de su
buzón de voz tengan la cadena [PBX] agregada al asunto,
se puede establecer este valor en yes.
fromstrin
The Asterisk PBX
Puede utilizar esta opción para configurar el From:
nombre que aparecerá en los correos electrónicos de su
PBX.
usedirectory
yes
Esta opción permite a los usuarios crear mensajes desde
sus buzones de correo para aprovechar la ventaja del
Directorio.
odbcstorage
<item from
res_odbc.conf>
Si quiere almacenar su mensajes de voz en una base de
datos, puede hacerlo mediante el conector res_odbc
Asterisk. En este caso, deberá establecer el nombre del
elemento en el archivo res_odbc.
odbctable
<nombre de tabla>
Este parámetro especifica el nombre de la tabla en la base
de datos que el ajuste odbcstorage se refiere.
emailsubject
PBX]: New
message $
{VM_MSGNUM} in
mailbox $
{VM_MAILBOX}
Cuando Asterisk envía un correo electrónico, usted puede
utilizar esta opción para definir como la línea Subject: del
correo electrónico se verá. Consulte el archivo
voicemail.conf.sample para más detalles.
emailbody
Dear $
{VM_NAME}:\n\n
\tjust wanted
to let you
know you were
Cuando Asterisk envía un correo electrónico, puede
utilizar esta opción para definir como se verá el cuerpo del
mensaje. Consulte el archivo voicemail.conf.sample para
más detalles.
just left a $
{VM_DUR} long
message (num
ber $
{VM_MSGNUM})
\nin mailbox $
{VM_MAILBOX u
might\nwant to
check it when
you get a
chance.
Thanks!\n\n\t
\t\t\t-Asterisk\n
pagerfromstring
The Asterisk PBX
En realidad no conocemos a nadie que use los pagers más
(ni podemos recordar haber visto uno en muchos años),
pero si usted tiene una de estas rarezas históricas y desea
personalizar Asterisk para que envié notificación de
pagers, presumiblemente lo podemos hacerlo con esta
opción. Una aplicación muy práctica de esta funcionalidad
es para las notificaciones de mensajes de correo de voz
cortos es enviar un mensaje a un gateway correo-a-SMS.
pagersubject
New VM
Como la opción anterior.
pagerbody
New ${VM_DUR}
long msg in
box ${VM_MAIL
BOX}\nfrom $
{VM_CALLERID},
on ${VM_DATE}
El formato de esta utiliza las mismas reglas que emailbody.
emaildateformat
%A, %d %B %Y
at %H:%M:%S
Esta opción le permite especificar el formato de fecha en
los correos electrónicos. Utiliza las mismas reglas que la
función en C STRFTIME.
pagerdateformat
%A, %d %B %Y
at %H:%M:%S
Esta opción le permite especificar el formato de fecha en
pagerbody. Utiliza las mismas reglas que la función en C
STRFTIME.
mailcmd
/usr/sbin/send mail -t
Si desea anular la aplicación por defecto del sistema
operativo para el envío de correo, puede especificarlo
aquí.
pollmailboxes
no, yes
Si el contenido de buzones es cambiado por alguna otra
cosa que no es app_voicemail (como una aplicación
externa u otro sistema Asterisk), configurando esta opción
a yes hará que app_voicemail sondee todos los buzones
por los cambios, que provocarán el mensaje apropiado
waiting indication (MWI) updates.
pollfreq
30
Utilizado en conjunto con pollmailboxes, esta opción
especifica el número de segundos que se debe esperar
entre sondeos buzón.
imapgreetings
no, yes
Esto activa/desactiva el almacenamiento remoto de los
saludos en la carpeta IMAP.
greetingsfolder
INBOX
Si ha habilitado imapgreetings, este parámetro permite
definir la carpeta en donde sus saludos se almacenan (Por
defecto es la Bandeja de entrada, INBOX).
imapparentfolder
INBOX
Los servidores IMAP pueden manejar las carpetas padre
de diferentes maneras. Este campo le permite especificar
la carpeta principal de los buzones.
imapserver
localhost
Define el servidor IMAP que Asterisk debe conectarse.
imapport
143
Define el puerto del servidor IMAP para conectarse.
imapflags
ssl
Servidores IMAP suelen tener diferentes indicadores que
se pueden pasar, junto con el nombre del buzón. Un
indicador común para pasar es ssl, el cual activas la
encriptación OpenSSl en la comunicación si la librería
IMAP fue compilada con el soporte de OpenSSl.
imapfolder
INBOX
Especifica el folder para almacenar los mensajes de correo
de voz en el servidor IMAP. Por defecto es INBOX.
authuser
user
Si el servidor IMAP se ha definido con una cuenta que
pueda acceder a todos los buzones, puede definir el
usuario de Asterisk para conectar con el servidor.
authpassword
password
Esta opción define la contraseña que se utilizará con el
atributo authuser.
imapopentimeout
60
El tiempo de espera para abrir TCP en segundos.
imapclosetimeout
60
El tiempo de espera para cerrar TCP en segundos.
imapreadtimeout
60
El tiempo de espera para TCP leer en segundos.
imapwritetimeout
60
El tiempo de espera para TCP escribir en segundos.
a) El separador que se utiliza para cada opción de formato debe ser el carácter (|).
b) El envío de correo electrónico desde Asterisk puede requerir alguna configuración cuidadosa, debido a
que muchos filtros de spam encuentran los mensajes de Asterisk sospechoso y simplemente ignoran
esto.
c) Sí, usted leyó correctamente: megabytes.
d) La interfaz de servicios de Pantalla analógica (Analog Display Services Interface) es un estándar que
permite interacciones con funciones más complejas mediante el uso de la pantalla del teléfono y los
menús. Con el advenimiento de los teléfonos de VoIP, la popularidad de ADSI ha disminuido en los
últimos años.
Validación externa de las contraseñas de correo de voz
Por defecto, Asterisk no validad las contraseñas de los usuarios, para asegurarse de que son al menos
algo segura. Cualquier persona que da mantenimiento a los sistemas de correo de voz le dirá que un gran
porcentaje de los usuarios de buzones definen sus contraseñas con algo así como 1234 o 1111, o alguna
otra cadena que son fáciles de adivinar. Esto representa un enorme agujero de seguridad en los sistemas
de correo de voz.
Puesto que el módulo app_voicemail.so no tiene la capacidad integrada para validar contraseñas, los
parámetros externpass, externpassnotify y externpasscheck le permiten validar contraseñas utilizando
un programa externo. Asterisk llamará el programa basándose en la ruta que usted especifique, y pasará
los siguientes argumentos:
buzón contexto contraseña-vieja nueva-contraseña
El script entonces evalúa los argumentos basados en las reglas que usted ha definido en el script externo
y, basado en esas reglas, debe retornar a Asterisk un valor VÁLID para satisfactorio o INVALID para no
satisfactorio (en realidad, el valor retornado por una contraseña fallida puede ser cualquier cosa excepto
las palabras VALID o FAILURE). Este valor normalmente se imprime en la salida estándar. Si el script
devuelve INVALID, Asterisk reproduce un mensaje de “contraseña-Invalidad” y el usuario tendrá que
intentar algo diferente.
Idealmente, usted querrá implementar reglas como las siguientes:
•
•
•
Las contraseña deben ser mínimo de seis dígitos de longitud
Las contraseñas no deben ser cadenas de dígitos repetidos (por ejemplo, 111111)
Las contraseñas no deben ser cadenas de dígitos contiguos (por ejemplo, 123456 o 987654)
Asterisk viene con un script simple que mejora grandemente la seguridad de sistema de correo de voz.
Está localizado en el código fuente bajo el folder: /contrib/scripts/voicemailpwcheck.py.
Le recomendamos encarecidamente que copie este scripts en el archivo /usr/local/bin (o donde usted
prefiera poner este tipo de cosas), y luego quitar el comentario de externpasscheck=opción en el archivo
voicemail.conf.
En la sección [general] hay una parte que es un área que se conoce como opciones avanzadas. Estas
opciones (listadas en la tabla a continuación) son definidas en la misma manera que las otras opciones
en la sección [general], pero también se pueden definir en función de cada buzón, las cuales
sobrescriben lo que se define en [general] para ese entorno particular.
Tabla opciones Avanzada para voicemail.conf
Opción
Valor/Ejemplo
tz
eastern, european, etc.
Notas
Especifica el nombre zonemessages, tal como se
define en [zonemessages] (discutido en la próxima
sección).
locale
de_DE.utf8, es_US.utf8, etc.
Se utiliza para definir cómo Asterisk genera la
cadena fecha/hora en diferente localidad. Para
determinar los lugares que son válidos en el
sistema Linux, escriba locale -a en el shell.
attach
yes, no
Si una dirección de correo electrónico es
especificada para un buzón, esta opción determina
si los mensaje son atachado a la notificación de
correo (de lo contrario, se envía un mensaje de
notificación simple).
attachfmt
wav49, wav, etc.
Si attach está habilitado y los mensajes son
almacenados en diferentes formatos, esta opción
define el formato que es enviado con el correo
electrónico de notificaciones. A menudo wav49 es
una buena opción, ya que utiliza un mejor
algoritmo de compresión y por lo tanto utiliza
menos ancho de banda.
saycid
yes, no
Este comando declarará el callerID de la persona
que dejó el mensaje.
cidinternalcontexts <contexto>, <otro contexto>
Cualquier contexto del dialplan listado aquí será
buscado en un intento de localizar el contexto
mailbox, por lo que el nombre asociado con el
número del buzón se puede hablar. El número de
buzón del correo de voz debe coincidir con el
número de la extensión desde donde viene la
llamada, y el contexto voicemail debe coincidir con
el contexto en el dialplan.
sayduration
yes, no
Este comando declara la longitud del mensaje.
saydurationm
2
Utilice esta opción para especificar la duración
mínima de un mensaje para calificar para la
longitud que se está reproduciendo. Por ejemplo,
si usted establece esta opción a 2, cualquier
mensaje menor de 2 minutos de longitud no
tendrá su longitud declarada. (La opción es
realmente saydurationm y no es un error.)
dialout
<contexto>
Si se permite, a los usuarios que pueden marcar
fuera desde sus buzones. Esto se considera una
característica muy peligrosa en un sistema de
teléfono (principalmente debido a que muchos
usuarios de correo de voz les gustan usar 1234
como su contraseña), y por lo tanto no se
recomienda. Si usted insiste en permitir esto,
asegúrese de que tiene un segundo nivel en el
dialplan donde se especifica otra contraseña. Aun
así, esto no es una práctica segura.
sendvoicemail
yes, no
Esto permite a los usuarios escribir mensajes a
otros usuarios desde dentro de sus buzones.
searchcontexts
yes, no
Permite a las aplicaciones voicemail en el dialplan
para no tener que especificar el contexto de voz, ya
que se buscarán todos los contextos. Esto no es
recomendable.
callback
<contexto>
Especifica qué contexto del dialplan usar para
devolver la llama al remitente de un mensaje. El
contexto especificado tendrá que ser capaz de
manejar la marcación de números en el formato en
el que se reciben (por ejemplo, el código de país no
se puede recibir con el identificador de llamadas,
pero puede ser necesario para la llamada saliente).
exitcontext
<contexto>
Hay opciones que permiten a las personas que
llaman salir del sistema de correo de voz cuando
están en el proceso de dejar un mensaje (por
ejemplo, al presionar 0 para conseguir un
operador). De forma predeterminada, el contexto
desde donde viene la llamada se utilizará como el
contexto de salida. Si se desea, este parámetro
define un contexto diferente para las llamadas que
salen del sistema de correo de voz.
review
yes, no
Esto casi siempre se debe establecer en yes
(aunque por defecto es no). La gente se molesta si
su sistema de correo de voz no les permite revisar
sus mensajes antes de su entrega.
operator
yes, no
Las mejores práctica dicta que se debe permitir a
las personas que llaman la "salida al cero" de un
buzón de correo, en caso de que ellos no deseen
dejar un mensaje. Tenga en cuenta que se requiere
una extensión (no "cero", "oh") en el contexto de
salida con el fin de manejar estas llamadas.
envelope
no, yes
Usted puede tener correo de voz que reproduzca
los detalles del mensaje antes de reproducir el
mensaje actual. Dado que esta información
también se puede acceder pulsando 5, por lo
general, ponemos no.
delete
no, yes
Después de enviar una notificación de mensaje por
correo electrónico (que puede incluir el mensaje en
sí), el mensaje será borrado. Esta opción es
arriesgada, ya que el hecho de que un mensaje ha
sido enviado por correo electrónico no es una
garantía de que se ha recibido (los filtros de spam
parecen amar eliminar los mensajes de correo de
voz de Asterisk). En un sistema nuevo, deje esto en
no hasta que esté seguro de que no hay mensajes
que se pierden debido a los filtros de spam.
volgain
0.0
Esta configuración le permite aumentar el volumen
de los mensajes recibidos. El volumen solía ser un
problema en las versiones anteriores de Asterisk,
pero no ha sido un problema desde hace muchos
años. Recomendamos dejar esto en el valor
predeterminado. Se requiere del utilitario sox para
que esto funcione.
nextaftercmd
yes, no
Este pequeño ajuste le ahorrará tiempo, ya que
lleva directamente al siguiente mensaje una vez
que haya terminado de lidiar con el mensaje
actual.
forcename
yes, no
Esta opción verifica si la contraseña del buzón es la
misma que el número de buzón. Si lo es, obliga al
usuario a cambiar su contraseña de correo de voz y
grabar su nombre.
forcegreetings
yes, no
Igual que la opción anterior, pero para el saludo.
hidefromdir
no, yes
Si lo desea, puede ocultar buzones específicos de la
aplicación Directory() utilizando este ajuste.
tempgreetwarn
yes, no
Si se configura en yes avisará al propietario del
buzón que tiene un grupo de saludo temporal. Esto
puede ser un recordatorio útil cuando las personas
regresan de viajes o vacaciones.
passwordlocation
spooldir
Si lo desea, puede tener contraseñas de buzones
almacenados en la carpeta spool para cada buzón.
Una de las ventajas de utilizar la opción spooldir es
que le permitirá definir el archivo con la directiva
#include en voicemail.conf (lo que significa que
puede almacenar referencias de buzones en varios
archivos, como usted puede con, por ejemplo,
código del dialplan). Esto no es posible de otro
modo, porque app_voicemail normalmente escribe
los cambios de contraseña para el sistema de
archivos, y no se puede actualizar una contraseña
del buzón almacenados fuera de voicemail.conf o
spool. Si usted no utiliza passwordlocation, usted
no será capaz de definir buzones fuera del
voicemail.conf, ya que las actualizaciones de
contraseña no se van a realizar. El almacenamiento
de contraseñas en un archivo en la carpeta de
buzón de correo especificada en el spool resuelve
este problema.
messagewrap
no, yes
Si se establece a yes, cuando el usuario ha
escuchado el último mensaje, pulsando Siguiente
(6) le llevará al primer mensaje. Además, pulsando
anterior (4), le llevará al último mensaje.
minpassword
6
Esta opción impone una longitud mínima de la
contraseña. Tenga en cuenta que esto no impide
que los usuarios configuren sus contraseñas a algo
fácil de adivinar (por ejemplo, 123456).
vm-password
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para utilizar como mensaje de
solicitud de contraseña de correo de voz.
vm-newpassword
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para usar como mensaje "Por favor
ingrese su nueva contraseña seguido por la tecla
numeral" del sistema en correo de voz.
vm-passchanged
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para usar en el mensaje "Su
contraseña ha sido cambiada" del sistema de
correo de voz.
vm-reenterpassword
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para utilizar en el mensaje "Vuelva a
introducir su contraseña seguido por la tecla
numeral" en el buzón de voz.
vm-mismatch
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para usar en el mensaje "Las
contraseñas que ha entrado y volvió a entrar no
coinciden" del sistema de correo de voz.
vm-invalid-password
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para usar en el mensaje "Esta no es
una contraseña valida" del sistema de correo de
voz.
vm-pls-try-again
sonido_personalizado
Si lo desea, puede especificar un sonido
personalizado para usar en el mensaje "Vuelva a
intentarlo" del sistema de correo de voz.
vm-prepend-timeout
sonido_personalizado
listen-controlforwardkey
#
Si lo desea, puede especificar un sonido
personalizado aquí para utilizar cuando el usuario
agota el tiempo de grabación de un mensaje. El
sonido predeterminado es, "a continuación, pulse
almohadilla" y sigue el por favor trate de nuevo.
Puede utilizar esta opción para personalizar la
tecla de avance rápido.
listen-controlreversekey
*
Puede utilizar esta opción para personalizar la
tecla de rebobinado.
listen-control-pausekey
0
Puede utilizar esta opción para personalizar la
tecla Pausar/reanudar.
listen-controlrestart-key
2
Puede utilizar esta opción para personalizar la
tecla de reproducción.
listen-control-stopkey
13456789
Puede utilizar esta opción para personalizar la
tecla de interrumpir la reproducción.
backupdeleted
0
Esta configuración le permitirá especificar
cuántos mensajes eliminados se almacenan
automáticamente en el sistema. Esto es similar
a la papelera de reciclaje. Al definir este valor
como 0 se desactiva esta función. Un máximo
de 9.999 mensajes pueden ser almacenados,
después de lo cual el mensaje más antiguo se
borrará cada vez que otro mensaje se elimina.
A) Sí, nos pareció un poco confuso, también.
B) Típicamente, la carpeta spool esta /var/spool/asterisk, y se puede definir en /etc/asterisk/asterisk.conf.
La Sección [zonemessages]
La siguiente sección del archivo voicemail.conf es la sección [zonemessages]. El propósito de esta
sección es el de permitir el manejo de la zona horaria especifica de los mensajes, para que pueda
reproducir los mensajes de los usuarios con los tiempo correctos. Puede definir el nombre de la zona
para lo que usted necesita. Después del nombre de la zona, se define a cuál zona horaria usted quiere
que el nombre haga referencia, así como algunas de las opciones que definen cómo se reproducen las
marcas de tiempo.
Usted puede mirar en el archivo ~/src/Asterisk-complete/asterisk/11/configs/voicemail.conf.sample los
detalles de sintaxis. Asterisk incluye los ejemplos que se muestran en la tabla a continuación.
Nombre de zona
eastern
Valor/Ejemplo
America/New_York|'vm-received' Q
'digits/at' IMp
Nota
Este valor sería adecuado para el
horario del este (EST/EDT).
central
America/Chicago|'vm-received' Q
'digits/at' IMp
Este valor sería adecuado para la zona
horaria central (CST/CDT).
central24
America/Chicago|'vm-received' q
'digits/at' H N 'hours'
Este valor también sería conveniente
para CST/CDT, pero reproducir el
tiempo en formato de 24 horas.
military
Zulu|'vm-received' q 'digits/at'
H N 'hours' 'phonetic/z_p'
Este valor sería adecuado para el
Tiempo Universal Coordinado (hora
Zulú, anteriormente GMT).
european
Europe/Copenhagen|'vm-received' a
d b 'digits/at' HM
Este valor sería adecuado para el
Tiempo de Central Europea (CET).
La sección contexto
Todas las secciones restantes del archivo voicemail.conf serán los contextos de correo de voz, los cuales
permiten segregar grupos de buzones.
En muchos casos, sólo necesitará un contexto de correo de voz, comúnmente llamada [default]. Esto
vale la pena destacarlo, ya que hará las cosas más simples en el dialplan: todas las aplicaciones de
correo de voz relacionada asumen el contexto default si no se especifica ningún contexto. En otras
palabras, si usted no necesita separar sus usuarios de correo de voz use default como su único contexto
de correo de voz.
El formato para los buzones de correo es el siguiente (debe estar todo en una sola línea):
mailbox => contraseña[,Nombre Apellido[,correo addr[,pager addr[,opciones[|opciones]]]]]
El carácter de barra vertical (|) solía ser más popular en Asterisk. Durante los primeros años, fue
utilizado como el delimitador estándar. Más recientemente, ha sido casi completamente sustituido
por la coma, sin embargo, todavía hay unos pocos lugares donde se utiliza este carácter. Uno de ello
es en voicemail.conf: por ejemplo, como un separador para cualquier opción especificada en los
buzón de correo, y también como el carácter separador en el formato =declarativo. Usted verá esto
en nuestro próximo ejemplo, así como en el archivo voicemail.conf.sample.
Las partes de la definición buzón son:
mailbox: Este es el número de buzón. Por lo general, se corresponde con el número de extensión del
teléfono asociado.
Contraseña: Esta es la clave numérica que el propietario del buzón usará para acceder a su correo de
voz. Si el usuario cambia su contraseña, el sistema actualiza este campo en el archivo voicemail.conf.
Si la contraseña es precedida por el carácter guion (-), el usuario no puede cambiar la contraseña del
buzón.
Si va a guardar las contraseñas en la carpeta spool (mediante el uso del parámetro passwordlocation),
este campo se ignora. Sin embargo, el analizador aún requiere que haya un campo aquí, de manera que
si se va a especificar cualquier otra opción para el buzón, una coma será necesaria como un marcador de
posición para el campo de la contraseña.
Nombre Apellido: Este es el nombre del propietario del buzón. El directorio de la empresa utiliza el
texto de este campo para permitirles a las personas que llaman deletrear los nombres de usuarios.
Dirección de correo: Esta es la dirección de correo electrónico del propietario del buzón. Asterisk puede
enviar notificaciones de correo de voz (incluyendo el mensaje de correo de voz en sí, como un archivo
adjunto) a la casilla de correo electrónico especificada.
Dirección pager: Esta es la dirección de correo electrónico de pager o teléfono celular del propietario
del buzón. Asterisk puede enviar un mensaje de notificación de correo de voz corto a la dirección de
correo electrónico especificada.
Opciones: Este campo es una lista de opciones para configurar la zona horaria del propietario del buzón
y redefinición de la configuración global del correo de voz. Hay un buen número de opciones válidas:
tz, locale, attach, attachfmt, saycid, cidinternalcontexts, sayduration, saydurationm, dialout,
sendvoicemail, searchcontexts, callback, exitcontext, review, operator, envelope, delete,
volgain,
nextaftercmd,
forcename,
forcegreeting,
hidefromdir,
tempgreetwarn,
passwordlocation, messagewrap, minpassword.
Estas opciones deben estar en pares opción=valor, separadas por el carácter de barra vertical (|).
Consulte en las páginas siguientes para obtener más detalles acerca de lo que cada una de las opciones
hacen.
La opción tz establece la zona horaria del usuario a una zona horaria previamente definida en la sección
[zonemessages] de voicemail.conf. Las otras opciones sobrescriben los parámetros globales del correo
de voz con los mismos nombres.
Opción
Attach
Descripción
Si se debe adjuntar el correo de voz a la notificación de correo electrónico
versus el correo pager. Estableciendo en yes, será adjuntado al correo
electrónico definido para el campo email.
Attachfmt
Establece el formato para adjuntar al correo electrónico. Normalmente este es
el primer valor definido por la opción de formato, pero se puede cambiar eso
por buzón utilizando esta opción. Esta opción sólo se puede configurar por
buzón.
Callback
Si se define, esta opción le permitirá al receptor del correo electrónico
devolver la llamada al remitente del correo de voz directamente desde la
aplicación Voicemail(). Esta opción define desde cual contexto se enviará la
llamada. Si no se define, no será permitido devolver la llamada al emisor.
Cidinternalcontexts
Esta es una opción muy antigua del año 2004, pero en esencia, usted puede
definir múltiples contextos (separados por comas) que le dirá Asterisk para
comprobar si la llamada proviene de un contexto interno. Si es así, se
reproducirá la grabación del nombre de la persona en vez de decir su número
de extensión. No está claro si esta opción sigue siendo válida o funcional.
Probablemente mejor usada en la sección [general] de correo de voz en lugar
de en los buzón.
Delete
Una vez enviado el correo de voz vía correo electrónico, el correo de voz se
elimina del servidor. Esta opción es útil para usuarios que sólo quieren recibir
correo de voz por correo electrónico. Las opciones válidas son yes o no. Esta
opción sólo se puede configurar por buzón.
Dialout
Si se define, la opción 4 del menú avanzado le permitirá marcar desde la
aplicación VoicemailMain(). El argumento define desde cuales contexto se
realizará la marcación. Si no se define, la opción de marcar fuera no se le
pedirá a la persona que llama.
Envelope
Activa o desactiva la reproducción envolventes antes de la reproducción del
mensaje del buzón de voz. Las opciones válidas son yes o no. Por defecto es
yes.
Exitcontext
El contexto para salir al presionar * o 0 desde la aplicación Voicemail().
También trabaja en conjunto con la opción operator. Debe tener una extensión
en el contexto para salir con *. Debe tener una extensión en el contexto para
salir con 0.
forcegreeting
Obliga a grabar un saludo para los nuevos buzones. Un nuevo buzón de correo
está determinado por el número de buzón y la contraseña correspondiente.
Los valores válidos son yes o no. El valor predeterminado es no.
Forcename
Obliga a grabar el nombre de la persona para los nuevos buzones. Un nuevo
buzón de correo está determinado por el número de buzón y la contraseña
correspondiente. Los valores válidos son yes o no. El valor predeterminado es
no.
Hidefromdir
Si se establece en yes, este buzón de correo no estará visible desde la
aplicación Directory(). El valor predeterminado es no.
Locale
Le permite establecer la configuración regional para el buzón con el fin de
controlar el formato de las cadenas de fecha/hora. Ver voicemail.sample.conf
para más información.
minpassword
Define la longitud mínima de la contraseña. El argumento debe ser un número
entero.
nextaftercmd
Salta al siguiente mensaje después de pulsar la tecla 7 (eliminar) o la tecla 9
(guardar). Los valores válidos son yes o no. Por defecto es yes.
Operator
Permitirá que el remitente de un correo de voz presiones 0 antes, durante, o
después de la grabación de un mensaje de voz. Saldrá a la extensión o en el
mismo contexto, o el contexto definido para la opción exitcontext. Las opciones
válidas son yes o no. El valor predeterminado es no.
passwordlocation
De forma predeterminada, la contraseña de correo de voz se almacenan en el
archivo voicemail.conf, este archivo es modificado por Asterisk siempre que se
cambie la contraseña. Esto puede no ser deseable, especialmente si se desea
analizar la contraseña desde una ubicación externa (o script). La opción
alternativa para passwordlocation es spooldir, la cual pone la contraseña de los
usuarios de correo de voz en un archivo llamado secret.conf en el directorio
spool de correo de voz de usuario. Las opciones válidas son voicemail.conf y
spooldir. La opción por defecto es voicemail.conf.
Review
Cuando está activada, permitirá al usuario grabar un mensaje de voz y volver a
regrabar su mensaje. Después de pulsar la tecla # para salvar a su correo de voz,
le pedirá si desean volver a grabar o guardar el mensaje. Las opciones válidas
son yes o no. El valor predeterminado es no.
Saycid
Si
esta
activa,
y
existe
un
archivo
de
audio
en
/var/spool/asterisk/voicemail/recordings/callerids, entonces ese archivo se
reproducirá antes del mensaje, se reproduce el archivo en lugar de decir los
dígitos de los número del callerID. Las opciones válidas son yes o no. El valor
predeterminado es no.
Sayduration
Determina si desea reproducir el tiempo de duración del mensaje antes de la
reproducción del mensaje. Las opciones válidas son yes o no. Por defecto es yes.
saydurationm
Le permite establecer la duración mínima para reproducir (en minutos). Por
ejemplo, si establece el valor a 2, los mensajes con una duración menor de 2
minutos no serán informados. Los valores válidos son números enteros. El valor
predeterminado es 2.
searchcontexts
Para aplicaciones como Voicemail(), VoicemailMain(), y Directory(), el contexto
voicemail es un argumento opcional. Si el contexto de correo de voz no es
especificado, el valor por defecto es sólo buscar el contexto predeterminado.
Con esta opción activada, se buscará en todos los contextos. Este viene con una
advertencia de que, si se activa, el número del buzón debe ser único en todos
los contextos, de lo contrario habrá una colisión, y el sistema no va a entender
qué buzón usar. Las opciones válidas son yes y no. El valor predeterminado es
no.
sendvoicemail
Permite al usuario crear y enviar un mensaje de correo de voz desde dentro de
la aplicación VoicemailMain().Disponible como la opción 5 en el menú avanzado.
Si esta opción está desactivada, no se le pedirá la opción 5 en el menú avanzado.
Las opciones válidas son yes o no. El valor predeterminado es no.
tempgreetwarn
Habilita una notificación al usuario cuando su saludo temporal está activado. Las
opciones válidas son yes o no. El valor predeterminado es no.
Tz
Establece la zona horaria de un usuario de correo de voz (o global). Vea
/usr/share/timezone para las diferentes zonas horarias disponibles. No aplica si
envelope=no.
Volgain
La opción volgain le permite establecer la ganancia de volumen para los
mensajes de correo de voz. El valor se expresa en decibeles (dB). La aplicación
sox debe estar instalada para que esto funcione.
Los buzones de correo que se definen en el archivo voicemail.conf podría ser como el ejemplo
siguientes:
[default]
101 => 4879,Lian Massiel,[email protected]
102 => 96879,Bernard perez,[email protected]
103 => 698745,massi Guzman, [email protected]
; *** Esto necesita estar todo en la misma línea
103 => 5426,Algún tipo,,,dialout=fromvm|callback=fromvm|review=yes|operator=yes|envelope=yes
[correodevoz]
101 => 7005, Lian Massiel,[email protected]
102 => 4065, Bernard perez,[email protected],,attach=no|maxmsg=100
103 => 22082, massi guzman, [email protected],,,attach=no|tz=central
El directorio de Asterisk no puede manejar el concepto de los apellidos que son diferentes de una
palabra simple. Esto significa que los nombres familiares, como O'Neal, Jones-dison, no deben tener
ningún carácter de puntuación o espacios antes de ser añadido a voicemail.conf.
Los contextos en voicemail.conf son un concepto excelente y poderoso, pero es muy probable que
encuentres que el contexto predeterminado será todo lo que usted necesita en uso normal. La razón
principal para tener múltiples contextos de buzones es cuando el sistema está alojando más de una PBX
y hay que tener los buzones separados.
Un archivo voicemail.conf inicial
Recomendamos el siguiente ejemplo como punto de inicio. Puede referirse a
~/asteriskcomplete/asterisk/11/configs/voicemail.conf.sample para obtener más detalles sobre las
distintas opciones:
; Configuración correo de voz
[general]
format=wav49|wav
[email protected] ; servidor ficticio
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A,%B,%Y at %r
pagerdataformat=%A,%B,%Y at %r
sendvoicemail=yes ; Permite al usuario crear y enviar un mensaje de voz, mientras esta dentro del
; correo de voz.
[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
[default]
300 => 1234,Bernardo Perez,[email protected]
301 => 1234,Lian Massiel,[email protected]
302 => 1234,Massiel Guzman,[email protected]
303 => 1234,Encargado ventas,[email protected]
304 => 1234, Ventas2,[email protected]
Tenga en cuenta que en sus archivos de configuración de canal (sip.conf. iax.conf, etc.) debe
especificar la opción mailbox en cada dispositivo, para definir el buzón, ejemplo:
[100]
mailbox=100@default
Configuración de un servidor Linux para gestionar el envío de correo electrónico es una tarea de
administración de Linux que está más allá del alcance de este libro. Usted tendrá que poner a
prueba su servicio de correo de voz con el correo electrónico para asegurarse de que el correo
electrónico está siendo manejado adecuadamente por el Agente de Transferencia de Correo (MTA).
Integración con el Dialplan
Hay dos aplicaciones primarias del dialplan que son proporcionadas por el módulo app_voicemail.so
en Asterisk. La primera, es llamada simplemente VoiceMail(), hace exactamente lo que se espera, que
es grabar un mensaje en un buzón. La segunda, VoiceMailMain(), permite que la persona que llama
pueda iniciar sesión en un buzón para recuperar los mensajes.
La Aplicación del Dialplan VoiceMail()
Si desea pasar una llamada al correo de voz, debe proporcionar dos argumentos: el buzón (o buzones)
en el cual los mensajes deben ser dejado, y las opciones relacionadas con este, como el saludo a
reproducir o si se debe marcar el mensaje como urgente. La estructura de los comandos de VoiceMail()
es la siguiente:
VoiceMail(buzón[@contexto][&buzones[@contexto][&...]][,opciones])
Las opciones que se pueden pasar a VoiceMail() para proporcionar un mayor nivel de control son:
Argumentos
b
Propósito
Instruye a Asterisk para reproducir el saludo de ocupado para el buzón (si no se
encuentra un saludo de ocupado, se reproducirá el saludo de no disponible).
d([c])
Acepta dígitos para ser procesados por el contexto c. Si no se especifica el contexto,
de forma predeterminada se usa el contexto actual.
g(#)
Se aplica la cantidad especificada de ganancia (en decibeles) para la grabación. Sólo
funciona en los canales DAHDI.
s
Suprime la reproducción de instrucciones a las personas que llaman después de
reproducir el saludo.
u
Instruye a Asterisk para reproducir el saludo “de no disponible” para el buzón (este
es el comportamiento por defecto).
U
Indica que este mensaje ha de ser marcado como urgente. El efecto más notable de
esto es cuando tiene correo de voz que se almacenan en un servidor IMAP. En ese
caso, el correo electrónico será marcado como urgente. Cuando el propietario del
buzón llame al sistema de correo de voz de Asterisk, también debe ser informado de
que el mensaje es urgente.
P
Indica que este mensaje ha de ser marcado como prioridad.
El aplicación VoiceMail() envía la llamada al buzón especificado, para que pueda dejar un mensaje. El
buzón se debe especificar como buzón@contexto, donde el contexto es el nombre del contexto de
correo de voz. La opción letras b o u se pueden añadir para solicitar el tipo de saludo. Si se usa la letra b,
la persona que llama escuchará un mensaje de ocupado desde el propietario del buzón. Si se usa la letra
u, el llamante escuchará un mensaje de no disponible desde propietario del buzón (si uno existe).
Considere este ejemplo simple de la extensión 101, que permite a la gente llamar a LIAN:
exten => 101,1,NoOp()
same => n,Dial(${LIAN})
Vamos a añadir un mensaje de no disponible que será reproducido a la persona que llama si LIAN no
contesta el teléfono. Recuerde, que el segundo argumento de la aplicación Dial() es un timeout. Si la
llamada no es contestada antes que el tiempo de espera (timeout) expire, la llamada será enviada a la
próxima prioridad. Agreguemos un tiempo de espera de 10 segundos, y una prioridad para enviar a la
persona que llama al correo de voz si LIAN no contesta en ese tiempo:
exten => 101,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,VoiceMail(101@default,u)
Ahora, vamos a cambiar esto por lo que si LIAN está ocupada (con otra llamada), la persona que llama se
enviará a su correo de voz, donde escuchará un mensaje de ocupado desde la extensión de LIAN. Para
hacer esto, haremos uso de la variable ${DIALSTATUS}, la cual contiene uno de varios valores de estado
(escriba core show applicatión Dial en la consola de Asterisk para obtener una lista de todos los valores
posibles):
exten => 101,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail(101@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(101@default,b)
same => n,Hangup()
Ahora las personas que llamen conseguirán el correo de voz de LIAN (con el saludo apropiado) si LIAN
está ocupada o no está disponible. Una sintaxis alternativa es utilizar la función de IF() para definir cuál
de los mensajes usar, no disponibles u ocupado:
exten => 101,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,Voicemail(101@default,${IF($["${DIALSTATUS}" = "BUSY"]?b:u)})
same => n,Hangup()
Sin embargo, aún tenemos un pequeño problema, es que LIAN no tiene ninguna manera de recuperar
sus mensajes. Vamos a solucionar esto en la próxima sección.
La Aplicación del Dialplan VoiceMailMain()
Los usuarios pueden recuperar sus mensajes de correo de voz, cambiar sus opciones de correo de voz, y
grabar sus saludos para el correo de voz usando la aplicación VoiceMailMain(). VoiceMailMain() acepta
dos argumentos: el número del buzón (y opcionalmente el contexto) que se accede, y algunas opciones.
Ambos argumentos son opcionales.
La estructura de la aplicación VoiceMailMain es similar a:
VoiceMailMain([buzón][@contexto][,opciones])
Si no se pasa ningún argumento para VoiceMailMain(), se reproducirá un mensaje que le pregunta a la
persona que llama por el número de su buzón de correo. Las opciones que se pueden suministrar se
enumeran en la tabla a continuación:
Tabla: argumentos opcionales de VoiceMailMain()
Argumentos
P
Propósitos
Permite tratar el parámetro buzón como un prefijo para el número del buzón.
g(#)
Aumenta la ganancia por # decibeles durante la reproducción de mensajes.
s
Omite la comprobación de la contraseña.
a(folder)
Inicia la sesión en una de las siguientes carpetas de correo de voz (por defecto es 0):
• 0 - INBOX
• 1 - Old
• 2 - Work
• 3 - Family
• 4 - Friends
• 5 - Cust1
• 6 - Cust2
• 7 - Cust3
• 8 - Cust4
• 9 - Cust5
Para permitirles a los usuarios marcar una extensión para comprobar su correo de voz, puede agregar
una extensión al plan de marcado de esta manera:
[Servicios]
exten => *98,1,NoOp(Acceso para recuperar el correo de voz .)
same => n,VoiceMailMain()
A continuación, sólo tendrá que añadir un include en el contexto [Local] para que puedas marcar * 98:
[Local]
; Existente en el dialplan en ejemplos anteriores
include => Servicios
Creación de un directorio de marcación por nombre
Una última característica del sistema de correo de voz de Asterisk que debemos cubrir es el directorio
de marcación por nombre. Este es creado con la aplicación Directory().Esta aplicación utiliza los
nombres definidos en los buzones de voicemail.conf para presentar a la persona que llama un directorio
de marcado por nombres de usuarios.
Directory() toma tres argumentos: el contexto de correo de voz desde el cual leerá los nombres, el
contexto en el dialplan opcional en el cual marcara a los usuarios, y una cadena de opciones (que
también es opcional). Por defecto, Directory() busca los usuario por el apellido, si se pasa la opción f le
obliga a buscar por el nombre en lugar de apellidos. Vamos a añadir dos directorios de marcación por
nombre para el contexto [entrada] de nuestro dialplan de ejemplo, por lo que las personas que llaman
pueden buscar primero por nombre o por apellido:
exten => 6,1,Directory(default,entrada,f)
exten => 7,1,Directory(default,entrada)
Si las personas pulsan 6, van a poder buscar en el directorio primero por nombre. Si marcan 7, van a
tener el directorio por el apellido.
Usando un Jitterbuffer
Cuando se utiliza Asterisk como servidor de correo de voz, es posible que desee añadir un jitterbuffer
entre el correo de voz y la persona que llama. El propósito de un jitterbuffer es para ayudar a lidiar con
el hecho de que cuando llamada viaja a través de una red IP, el tráfico pueda que no lleguen a tiempo y
en perfecto orden. Si los paquetes llegan en ocasiones con un poco de retardo (jitter) o si llegan
fuera de orden, un jitterbuffer puede arreglar esto para que el sistema de correo de voz reciba los
stream de voz a tiempo y en orden. Si el jitterbuffer detecta que se ha perdido un paquete (o puede
llegar tan tarde que ya no importa), este puede realizar la ocultación de paquetes perdidos. Es decir, se
intentará hacer un marco de audio para poner en lugar del audio que se pierde para hacer que sea más
fácil de escuchar que el audio se perdió.
En Asterisk, el soporte de jitterbuffer se puede habilitar en un puente entre dos canales en dos maneras.
En el caso del correo de voz, generalmente sólo hay un único canal conectado a una de las aplicaciones
del correo de voz. El método antiguo (que se requiere en versiones anteriores a Asterisco 10) es permitir
el uso de un jitterbuffer en frente del correo de voz mediante la creación de un puente entre dos
canales usando un canal local y especificando la opción j.
Especificar la opción n para el canal local, además, asegura que el canal local no está optimizado fuera
de la ruta de llamada en Asterisk:
[Servicios]
; Método antiguo - sólo se requiere en versiones anteriores a Asterisk 10
exten => *98,1,Dial(Local/vmm@Servicios/nj)
exten => vmm,1,VoiceMailMain()
Como en Asterisk 10, existe una nueva función del dialplan jitterbuffer() la cual, desde la perspectiva del
usuario, realiza la misma funcionalidad. Simplemente por configurar los valores en el dialplan, nosotros
podemos activar un jitterbuffer antes de acceder una aplicación del dialplan tal como Voicemail():
[Servicios]
; nuevo método - disponible en Asterisk 10 y posterior
exten => *98,1,NoOp()
same => n,Set(JITTERBUFFER(fixed)=default)
same => n,VoiceMailMain()
Existen ambos, un jitterbuffer fijo y uno adaptable, junto con varias configuraciones diferentes. Hemos
utilizado el jitterbuffer fijo con la configuración por defecto, que son las siguientes. Vea core show
function JITTERBUFFER para más opciones de configuración:
•
200 ms longitud de búfer
•
Si existe más de 1.000 ms de diferencia en tiempo, el jitterbuffer será re sincronizado.
Almacenamiento en Backends
El almacenamiento de los mensajes en los sistemas de correo de voz tradicionales siempre ha tendido a
ser excesivamente complicado. Asterisk, por otra parte, no sólo proporciona un mecanismo de
almacenamiento simple, lógico, basado en sistema de archivo, pero también ofrece algunas opciones de
almacenamiento de mensajes adicionales.
Sistema de Archivos Linux
Por defecto Asterisk almacena los mensajes de voz en la carpeta spool, en
/var/spool/asterisk/voicemail/<contexto>/<buzón>. Los mensajes se pueden guardar en múltiples
formatos (como WAV y GSM), dependiendo de lo que se ha especificado como el formato en la sección
[general] del archivo voicemail.conf. Sus saludos también se almacenan en esta carpeta.
Asterisk no crea una carpeta para los buzones que no tienen ninguna grabación todavía (como sería
el caso con un nuevo buzón de correo), por lo que esta carpeta no se puede utilizar como un método
fiable para determinar qué buzones existe en el sistema.
He aquí un ejemplo de lo que podría estar en una carpeta de buzón. Este buzón no tiene mensajes
nuevos en la bandeja de entrada, tiene dos mensajes guardados en la carpeta antigua, y tiene saludos
grabados ocupado, no disponible y el nombre (saludar) como se muestra en la imagen a continuación.
Ejemplo Carpeta de buzones
Para cada mensaje, hay un archivo msg####.txt que contiene información sobre el mensaje. El
archivo msg####.txt es de vital importancia para la indicación de mensaje en espera (MWI), ya que
este es el archivo que Asterisk ve en la bandeja de entrada para determinar si la luz en el teléfono
que indica cuando hay mensaje para un usuario debe estar encendida o apagada.
ODBC
En un sistema centralizado o distribuido, puede que le resulte conveniente para almacenar mensajes
como objetos binarios en una base de datos, en lugar de como archivos en el sistema de archivos.
Vamos a discutir esto en detalle en "Mensaje de voz de almacenamiento en ODBC”.
IMAP
Muchas personas prefieren gestionar su correo de voz como parte de su correo electrónico. Esto ha sido
llamado mensajería unificada en la industria de las telecomunicaciones, y su implementación ha sido
tradicionalmente cara y compleja. Asterisk permite una muy sencilla integración entre el correo de voz y
correo electrónico, a través de su manejador integrado de correo de voz a correo electrónico, o por
medio de una relación con un servidor IMAP. Vamos a discutir la integración IMAP en detalle en
"Integración de Correo de voz con IMAP”.
Usando Asterisk como un Servidor de Correo de Voz Independiente
En un entorno de telecomunicaciones tradicional, el servidor de correo de voz era típicamente una
unidad independiente (proporcionado siempre como un servidor independiente por completo, o como
una tarjeta adicional para el sistema). Muy pocas PBXs tenían integrado plenamente el correo de voz (en
el sentido de que el correo de voz es una parte integral de la central en lugar de un dispositivo
periférico).
Asterisk es muy capaz de servir como un sistema de correo de voz independiente. Las dos razones más
comunes que uno puede querer hacer esto son:
1. Si usted está construyendo un sistema grande, centralizado y tiene varios servidores cada una
con una función específica (servidor proxy, gateway, buzón de voz, conferencias, etc.)
2. Si desea reemplazar el sistema de correo de voz en una PBX tradicional con el correo de voz de
Asterisk.
Asterisk puede servir en cualquiera de estas funciones.
La integración de Asterisk en un entorno SIP como un Servidor de
Correo de Voz Independiente.
Si usted quiere tener Asterisk actuando como un servidor de correo de voz dedicado (es decir, sin
extensiones registradas y ningún otro tipo de llamadas que pasan a través de él), el proceso desde la
perspectiva del dialplan es bastante simple. Sin embargo, trabajar con mensajes en espera puede ser un
poco más difícil.
Vamos a empezar con un esquema rápido. La figura a continuación muestra un ejemplo simplificado de
un entorno empresarial SIP típico. Ni siquiera tenemos un servidor de Asterisk allí (que no sea para el
correo de voz), con el fin de darle una representación genérica de cómo Asterisk puede servir como
servidor de correo de voz independiente en un entorno no Asterisk.
Entorno empresarial SIP simplificado.
Desafortunadamente, Asterisk no puede enviar notificaciones de mensajes a un punto final si no sabe
dónde está ese punto final. En un sistema Asterisk típico, donde las extensiones registradas y correo de
voz se manejan en el mismo equipo, esto no es un problema, ya que Asterisk sabe dónde están los
dispositivos finales. Sin embargo, en un entorno donde las extensiones no están registradas para
Asterisk, esto puede convertirse en un problema complejo.
Hay varias soluciones en Internet que recomiendan el uso de la opción externnotify en el
voicemail.conf, la activación de una script externo siempre que se deja un mensaje en un buzón de
correo (o eliminada). Si bien no podemos decir que es un mal planteamiento, nos parece un poco
ineficiente, y requiere que el administrador entienda cómo escribir script o programa para manejar
como pasar los mensajes actuales.
En su lugar se puede definir estáticamente una entrada para cada buzón en el archivo sip.conf del
servidor de correo de voz, que indique a donde los mensajes de notificaciones se deben enviar. En lugar
de definir la dirección de cada punto final, sin embargo, puede hacer que el servidor de correo de voz
envié todos los mensajes al servidor proxy, el cual se encargará de la retransmisión de los mensajes de
notificaciones a los puntos finales correspondientes.
El servidor de correo de voz aún necesita saber acerca de los dispositivos finales SIP, incluso aunque los
dispositivos no estén registrados directamente. Esto se puede hacer ya sea a través del archivo sip.conf
que identifica a cada punto final SIP, o a través de una base de datos estática en tiempo real que hace la
misma cosa. Si usted utiliza sip.conf o la Arquitectura de Realtime Asterisk (ARA), cada punto final
requerirá una entrada similar a la siguiente:
[messagewaiting](!)
type=peer
subscribecontext=voicemailbox
context=voicemailbox
host=192.168.2.1
[0000FFFF0001](messagewaiting)
mailbox=0000FFFF0001@DIR1
defaultuser=0000FFFF0001
; una plantilla para manejar los ajustes comunes a todos
; los buzones
; El contexto del dialplan en el servidor de correo de voz
; El contexto del dialplan en el servidor de correo
; dirección IP del servidor proxy
; esto tendrá que coincidir con el nombre del suscritor
; en el proxy
; debe estar en la forma mailbox@mailboxcontext
; esto tendrá que coincidir con el nombre del suscritor
; en el proxy
Tenga en cuenta que el realtime dinámico de Asterisk no trabaja con esta configuración, como la
información de un peer sólo se carga en memoria cuando se produce una llamada real que involucra
los peers.
Usted no tendrá que implementar esto a menos que tenga un prototipo de la operación básica de la
solución. Aunque todos estamos de acuerdo en que SIP es un protocolo, no todos están de acuerdo en
cuanto a la forma correcta de implementar el protocolo. Como resultado de ello, son muchos los
problemas de interoperabilidad que se deben abordar en una solución como esta. Hemos
proporcionado una introducción básica a este concepto en este libro, pero los detalles de
implementación dependerán de otros factores externos a Asterisk, como la capacidad del proxy.
El hecho de que ningún dispositivo tiene que registrarse con Asterisk reducirá significativamente la carga
en el servidor Asterisk, y como resultado de este diseño debe permitir que un servidor de correo de voz
puede soportar varios miles de abonados.
Requerimientos del Dialplan
El dialplan del servidor de correo de voz puede ser bastante simple. Dos necesidades deben ser
satisfechas:
1. Recibir llamadas entrantes y dirigirlos al buzón apropiado.
2. Manejar las llamadas entrantes de los usuarios que deseen revisar sus mensajes
El sistema que está pasando las llamadas al servidor de correo de voz debe establecer algunos
encabezados SIP con el fin de pasar información adicional al servidor de correo de voz. Normalmente,
esta información incluye el buzón/nombre de usuario que es relevante a la llamada. En nuestro ejemplo,
vamos a establecer los encabezados X-Voicemail-Mailbox y X-Voicemail-Context, que contendrá la
información que queremos transmitir con el servidor de correo de voz.
Si el sistema de origen es también un sistema Asterisk, es posible configurar los encabezados con la
aplicación de correo de voz SIPAddHeader(), de manera similar a la siguiente:
exten => sendtovoicemail,1,Verbose(2, define los encabezados SIP para el correo de voz)
same => n,SIPAddHeader(X-Voicemail-Mailbox: número de buzón)
same => n,SIPAddHeader(X-Voicemail-Context: voicemailbox)
Tenga en cuenta que este plan de marcado no va en el servidor de correo de voz. Sólo es útil si uno
de los otros servidores en el entorno es también un servidor Asterisk. Si utiliza otro tipo de
servidor, usted tendría que saber cómo configurar encabezados personalizados en esa
plataforma, o averiguar si ya utiliza algún encabezado específico para este tipo de cosas, y
posiblemente modificar el dialplan en el servidor de correo de voz para manejar esas cabeceras.
El servidor de correo de voz necesita un archivo extensions.conf que contendrá lo siguiente:
[correodevoz]
; Dirige las llamadas entrantes a un buzón
exten => Deliver,1,NoOp()
same => n,Set(Mailbox=${SIP_HEADER(X-Voicemail-Mailbox)})
same => n,Set(MailboxContext=${SIP_HEADER(X-Voicemail-Context)})
same => n,VoiceMail(${Mailbox}@${MailboxContext})
same => n,Hangup()
; Conecta a los usuarios a su buzón de correo, para que puedan recuperar los mensajes
exten => Retrieve,1,NoOp()
same => n,Set(Mailbox=${SIP_HEADER(X-Voicemail-Mailbox)})
same => n,Set(MailboxContext=${SIP_HEADER(X-Voicemail-Context)})
same => n,VoiceMailMain(${Mailbox}@${MailboxContext})
same => n,Hangup()
Requerimientos de sip.conf
En el archivo sip.conf en el servidor de correo de voz, no sólo son necesarias las entradas para todos los
buzones de correo de notificación de mensaje en espera, pero también algún tipo de entrada es
requerido para definir la conexión entre el servidor de correo de voz y el resto del entorno SIP:
[correodevoztrunk]
type=peer
defaultuser=voicemail
fromuser=voicemail
secret=8Hm45dT78Y
canreinvite=no
host=<dirección IP del proxy/registrar servidor>
disallow=all
allow=ulaw
dtmfmode=rfc2833
context=correodevoz
El otro extremo de la conexión (probablemente su servidor proxy) debe estar configurado para pasar
conexiones de correo de voz en el servidor de correo de voz.
Correr Asterisk como servidor de correo de voz independiente requiere un cierto conocimiento de
clustering e integración, pero el precio es insuperable.
SMDI (interfaz de escritorio de mensajería simplificada)
El protocolo Simplified Message Desk Interface (SMDI) está pensado para permitir la comunicación de
información básica de mensajes entre los sistemas de telefonía y sistemas de correo de voz.
Asterisk soporta SMDI, pero dado que este es un protocolo antiguo que se ejecuta a través de una
conexión serial, es probable que existan desafíos para la integración. El soporte en varias PBXs y otros
dispositivos puede ser irregular. Aún así, es un protocolo bastante simple, por lo que sin duda vale la
pena probar si usted está considerando el uso de Asterisk como un reemplazo de correo de voz en un
viejo PBX.
La siguiente no es una explicación detallada de cómo configurar SMDI para Asterisk, sino más bien una
introducción a los conceptos, con algunos ejemplos básicos. Si usted está pensando en implementar
SMDI, usted tendrá que escribir algo de lógica del dialplan complejas y tener una buena comprensión de
cómo interconectar los sistemas a través de conexiones seriales.
SMDI se habilitada en Asterisk usando dos opciones en la sección [general] del archivo voicemail.conf:
smdienable=yes
smdiport=/dev/ttyS0
; o cualquier puerto serial que se conecta a su servicio SMDI
Adicionalmente, necesitará un archivo smdi.conf en la carpeta /etc/asterisk para definir los detalles de
su configuración SMDI. Debería ver algo como esto (ver el archivo smdi.conf.sample para obtener más
información sobre las opciones disponibles):
[Interfaces]
charsize=7
paritybit=even
baudrate=1200
smdiport=/dev/ttyS0
[mailboxes]
smdiport=/dev/ttyS0
; Esperamos una tasa de bit más alta que la soportada
; o cualquier Puerto serial que esté usando para manejar
; los mensajes SMDI en Asterisk
; Mapa de cadenas de dígitos entrantes (normalmente números DID)
; para validar mailbox@context en voicemail.conf
;primero declare el puerto SMDI que los buzones siguientes Utilizaran.
6102381010=4321@default
6104442121=8888@default
En el dialplan hay dos funciones que se quieren en una configuración SMDI. La función
SMDI_MSG_RETRIEVE() extrae el mensaje correspondiente desde la cola de mensajes SMDI. Usted
necesita pasar a la función una clave de búsqueda (normalmente el DID que hace referencia al mensaje),
y este le devolverá un número de DID que puede ser referenciado por la función SMDI_MSG():
SMDI_MSG_RETRIEVE(<puerto smdi>,<clave de búsqueda>[,tiempo de espera[,opciones]])
Una vez que tenga el ID del mensaje SMDI, puede utilizar la función SMDI_MSG () para acceder a varios
detalles acerca del mensaje, como la estación, identificador de llamadas, y el tipo (el tipo de mensaje
SMDI):
SMDI_MSG(<mensaje_id>,<componente>)
En el plan de marcado, necesitará manejar las búsquedas de los mensajes SMDI que llegan, para
asegurar que las llamadas se manejan correctamente. Por ejemplo, si una llamada entrante está
destinada para ser entregada a un buzón de correo, el mensaje podría ser del tipo B (por ocupado) o N
(para llamadas sin respuesta). Si, por otro lado, la llamada está destinado a ir a VoiceMailMain(), porque
la persona que llama quiere recuperar sus mensajes, el tipo de mensaje SMDI sería D, y esto tendría que
ser manejado.
Integración con Base de Datos
La aplicación de correo de voz Asterisk se puede integrar con una base de datos. Esto puede ser muy
útil, especialmente en los sistemas en clustered y distribuidos.
Capı́tulo 11
Internacionalización
La telefonía es una de las áreas de la vida donde, ya sea en la casa o en el trabajo, a las gentes no les
gustan las sorpresas. Cuando las gentes usan los teléfonos, cualquier cosa fuera de lo normal es una
expectativa que no se cumplió, y como alguien que, probablemente, está en el negocio de suplir
sistemas de telefonía, usted sabrá que las expectativas insatisfechas pueden llevar a la miseria
incalculable en términos de trabajo extra, perdida de dinero y otros problemas que están asociados con
la insatisfacción del cliente.
Además de asegurar que las experiencias de los usuarios están en consonancia con lo que los usuarios
esperan, también existe la necesidad de hacer sentir a Asterisk como "en casa". Por ejemplo, si se coloca
una llamada saliente a través de una línea analógica (FXO), Asterisk tendrá que interpretar los tonos que
"escucha" en la línea (ocupado, timbre, etc.).
Por defecto (y tal como era de esperar, ya que "nació en los EE.UU."), Asterisk está configurado para
trabajar en América del Norte. Sin embargo, como Asterisk ha conseguido desplegarse a muchos lugares
y (afortunadamente) gente de todo el mundo hacen contribuciones al mismo, es muy posible sintonizar
Asterisk para su correcto funcionamiento en cualquier lugar que elija para implementarlo.
Si usted ha estado leyendo este libro desde el principio, capítulo por capítulo, usted ya habrá tomado
algunas decisiones durante la instalación y la configuración inicial para configurar su Asterisk para que
trabaje en su área local (y cumplir con las expectativas de sus clientes).
Muchos de los capítulos de este libro contienen información que le ayudará a internacionalizar o (quizás
más correctamente) localizar su implementación de Asterisk. El propósito de este capítulo es
proporcionar un único lugar donde todos los aspectos de los cambios que necesita hacer a su sistema
telefónico basado en Asterisk en este contexto, puedan ser referenciado, discutido y explicado. La razón
para usar la frase “sistema telefónico basado en Asterisk” es que algunos de los cambios necesarios son
hechos en otras partes del sistema (Teléfonos IP, ATAs, etc.), mientras que otros cambios son
implementados dentro de Asterisk y el Archivo de configuración DAHDI.
Vamos a empezar por obtener una lista (en ningún orden en particular) de las cosas que pueden
necesitar ser cambiada a fin de optimizar su sistema de telefonía basado en Asterisk para un lugar
determinado fuera de América del Norte. Puedes mencionar algunas si usted gusta...
•
•
•
Idioma/acento de los avisos.
Conectorización física para las interfaces PSTN (FXO, BRI, PRI).
Tonos escuchados por los usuarios de teléfonos IP y/o ATAs.
•
•
•
•
•
Formato de identificación de llamada enviada y/o recibida por interfaces analógicas.
Tonos para las interfaces analógicas suplido o detectados por Asterisk.
Formato de hora/fecha para el correo de voz.
La manera en que la hora/fecha son anunciadas por Asterisk.
Patrones dentro del dialplan (de teléfonos IP, ATAs, y Asterisk si está utilizando el dialplan de
ejemplo).
•
La forma de indicar a un dispositivo analógico que correo de voz está en espera (MWI).
•
Tonos suministrados a las personas que llaman por Asterisk (éstos entran en juego una vez que
un usuario se encuentra "dentro" del sistema, por ejemplo, los tonos que se escuchan durante
una transferencia de llamada)
Cubriremos todo en esta lista, la adopción de una estrategia de trabajo desde el borde exterior del
sistema hacia el centro del núcleo (Asterisk). Vamos a concluir con una lista práctica de lo que es posible
que tenga que cambiar y donde cambiar esto.
Aunque los principios discutidos en este capítulo le permitirán adaptar su instalación de Asterisk
específicamente para su región (o la de su cliente), en aras de la coherencia, todos los ejemplos se
centrarán en cómo adaptar Asterisk para una región: el Reino Unido (UK).
Dispositivos externos al servidor Asterisk
Hay una enormes diferencias entre un buen teléfono analógico antiguo y cualquiera de la gran cantidad
de teléfonos IP que hay por ahí, y tenemos que referirnos a una de las diferencias fundamentales con el
fin de arrojar luz sobre la siguiente explicación, la cual cubre la configuración que podríamos necesitar
cambiar sobre los dispositivos externos para Asterisk, tales como teléfonos IP.
¿Has pensado en el hecho de que un teléfono analógico es un dispositivo totalmente tonto (sabemos
que un modelo básico es muy, muy barato) que necesita conectarse a una red inteligente (PSTN),
mientras que un teléfono IP (por ejemplo, SIP o IAX2) es un dispositivo muy inteligente que se conecta a
una red tonta (Internet o cualquier red IP normal)? Las figuras a continuación ilustran la diferencia.
En los viejos tiempos: dispositivos tontos se conectan a una red inteligente
La situación de hoy: Los dispositivos inteligentes se conectan a través de una red tonta
¿Podríamos tener dos teléfonos análogos, conectados directamente el uno al otro y tener la
funcionalidad que normalmente se asocian con un teléfono regular? No, por supuesto que no, ya que la
red le proporciona todo: la energía, el tono de marcado (desde la central local o CO), la información de
identificación de llamada, el tono del timbre (desde el remoto [más cercano al teléfono de destino]
central local o CO), todas las señalización requerida, y así sucesivamente.
Por el contrario, ¿podríamos tener dos teléfonos IP, conectados directamente el uno al otro, y obtener
algunas funciones razonables? Claro que podemos, porque toda la inteligencia se encuentra dentro de
los teléfonos IP a sí mismos proporcionan los tonos que escuchamos (tono de marcado, el timbre,
ocupado) y corren el protocolo que proporciona toda la señalización requerida (generalmente SIP). De
hecho, puede probar esto por ti mismo, los teléfonos IP de precios moderados tienen incorporado un
switch Ethernet, así que puedes conectar los dos teléfonos IP directamente entre sí con un cable
Ethernet regular (straightthrough) o simplemente conectarlos a través de un switch regular. Tendrán
que tener direcciones IP fijas en la ausencia de un servidor DHCP, y normalmente se puede marcar la
dirección IP del otro teléfono con sólo usar la tecla * para los puntos en la dirección.
En la imagen anterior hacíamos referencia al hecho de que en un teléfono IP, nosotros somos los
responsables de configurar todos los tonos que la red proporcionaba en los viejos tiempos. Esto se
puede hacer en una de (al menos) dos maneras. La primera es configurar los tonos proporcionados por
el teléfono IP en la propia interfaz web del dispositivo. Esto se realiza buscando la dirección IP del
teléfono (la dirección IP por lo general se puede obtener por una opción de menú en el teléfono) y luego
seleccionando las opciones apropiadas. Por ejemplo, en un teléfono IP Yealink, los tonos se encuentran
en la página de Teléfono de la interfaz web, bajo la pestaña Tones (donde se puede encontrar una lista
de los diferentes tipos de tonos que se pueden cambiar en el caso de Yealink, estos son Dial, Ring Back,
Busy, Congestion, Call Waiting, Dial Recall, Record, Info, Stutter, Message, y Auto Answer).
La otra manera en que esta configuración puede ser aplicada es auto provisionando los teléfono con
estos ajustes. Una explicación completa del mecanismo de autoprovisionamiento está más allá del
alcance de este libro, pero usted puede configurar los tonos en los atributos adecuados de los
elementos relevantes en el archivo XML.
Mientras estamos cambiando los valores de los teléfonos IP, hay otras dos cosas que puede que se
tenga que cambiar para que los teléfonos funcionen correctamente como parte del sistema.
La mayoría de los teléfonos muestran el tiempo cuando están inactivos y, ya que a muchas personas les
resulta particularmente molesto cuando sus teléfonos muestran el tiempo equivocado, tenemos que
asegurarnos de que se muestre la hora local correcta. Es bastante fácil encontrar la página apropiada de
la interfaz web (o atributos XML) para especificar el servidor de tiempo. Usted también encontrará que
hay valores para el horario de verano y otras cosas relevante.
La última cosa a cambiar es un obstáculo potencial en cuanto a la realización de una llamada telefónica
se refiere el plan de marcado. No estamos hablando sobre el plan de marcado que encontramos en
/etc/asterisk/extensions.conf, nos referimos al plan de marcado del teléfono. No todo el mundo se da
cuenta de que los teléfonos IP también tienen un dialplan, aunque estos dialplan están más interesados
por cuales cadenas de marcado son permitidas, y no por lo que debe hacer en una línea determinada.
La regla general parece ser que si marca con el teléfono colgado el dialplan integrado se pasa por alto,
pero si se levanta el auricular el dialplan entra en juego, y lo que pasaría es que el dialplan no permitirá
la cadena que usted necesita marcar. Aunque este problema se puede manifestar con un rechazo por el
teléfono para pasar ciertos tipos de números a través de Asterisk, esto puede también afectar a los
códigos de funciones que planea usar. Esto se puede remediar fácilmente buscando en Google el
modelo del teléfono junto con "dialplan del Reino Unido" (o la región en particular que necesita), o
usted puede ir a la página correspondiente en la interfaz web y, o bien ajustar manualmente el dialplan
o seleccionar el país que necesita de una lista desplegable (dependiendo del tipo de teléfono que esté
trabajando).
La discusión anterior de configuración de teléfono IP también se aplica a los adaptadores telefónicos
analógicos (ATAs) que planea usar, específicamente, a los que soportan interfaz FXS. Además, es posible
que tenga que especificar algunas de las características eléctricas de la interfaz de telefonía, como el
voltaje y la impedancia, junto con el formato de identificación de llamadas que trabajará con los
teléfonos locales. Lo único que difiere es la forma de obtener la dirección IP para la interfaz web, esto se
suele hacer mediante la marcación de un código específico en el teléfono analógico conectado, lo que
retorna la dirección IP a la persona que marca el código.
Por supuesto, un ATA también puede presentar una interfaz FXO, que también tendrá que ser
configurada para interactuar correctamente con la línea analógica que se proporcionan en su región. Los
tipos de cosas que hay que cambiar son similares a la interfaces FXS.
¿Qué pasa si se va a conectar su teléfono analógico o la línea a una tarjeta de Digium? Vamos a cubrir
esto en la siguiente sección.
Conectividad PSTN, DAHDI, Tarjetas Digium y Teléfonos Analógicos
Antes de que lleguemos a DAHDI y la configuración de Asterisk, tenemos que conectarnos físicamente a
la red telefónica pública conmutada PSTN. Desafortunadamente, no existen un estándar mundial para
estas conexiones, de hecho, a menudo hay variaciones desde una parte de un país determinado a otra.
Primary Rate Interfaces (PRIs) generalmente se terminan en una conexión RJ45 estos días, a pesar de la
impedancia de las conexiones puede variar. En algunos países (sobre todo en América del Sur), todavía
es posible encontrar PRI terminado en dos conectores BNC, uno para transmitir y otro para recibir.
En términos generales, un PRI terminado en un RJ45 será una conexión ISDN, y si la conexión es hecha
mediante un par de conectores BNC (push-y-twist conectores coaxiales), lo más probable es que se trata
de una conexión basada en el protocolo CAS (como R2).
En la imagen a continuación se muestra el adaptador necesario si su compañía de telecomunicaciones
ha suministrado conectores BNC (las tarjetas de Digium requieren una conexión RJ45). Se llama un
balún, ya que convierte de una conexión balanceada (RJ45) a una conexión no balanceada (los
conectores BNC), además cambian la impedancia de la conexión.
Basic Rate Interfaces (BRIs) son comunes en Europa continental y casi siempre son suministradas a
través de una conexión RJ45.
Un balun
Las conexiones analógicas varían enormemente de un lugar a otro –usted debe conocer qué tipo de
conector se utiliza en su localidad. Lo importante es recordar que la línea analógica son sólo dos
alambres, y estos necesitan conectarse a los dos pines del centro del conector RJ11 que va en la tarjeta
Digium, el otro extremo se conecta al local. La imagen siguiente muestra el conector utilizado en el
Reino Unido, donde los dos alambres están conectados a los pines 2 y 5.
El conector BT utilizado para las conexiones PSTN analógicas en el Reino Unido
(nota sólo pines 2-5 están presentes)
El Digium Asterisk Hardware Device Interface, o DAHDI, en realidad abarca una serie de cosas.
Contiene los controladores del núcleo para tarjetas de adaptador de telefonía que trabajan en DAHDI,
así como utilidades de configuración automática y herramientas de pruebas. Estas piezas están
contenidas en dos paquetes separados (dahdi-linux y dahdi-tools), pero también podemos utilizar un
paquete completo, llamado dahdi-linux-complete. Los tres paquetes están disponibles en la página web
de Digium. La instalación de DAHDI fue cubierta en capítulos anteriores.
Si está utilizando una conexión PSTN digital, su trabajo es averiguar qué tipo de conexión la compañía de
telecomunicaciones le está dando. Generalmente, si usted ha solicitado un PRI, este será un T1 en
América del Norte, un J1 en Japón, o un E1 en casi el resto del mundo.
Una vez que haya establecido el tipo de conexión PRI que la compañía de telecomunicaciones le ha
dado, hay algunos detalles adicionales que se requieren con el fin de configurar correctamente DAHDI y
Asterisk (por ejemplo, si la conexión es ISDN o un protocolo basado en CAS).
DAHDI Drivers
Las conexiones donde tendrá que haber alguna localización real son las de interfaces analógicas. Para el
propósito de configurar su sistema telefónico basado en Asterisk para que trabaje mejor en una
localidad determinada, primero tendrá que configurar específicamente algunos aspectos de bajo nivel
de la manera en que la tarjeta Digium interactúa con el dispositivo o de la línea conectada. Esto se hace
a través de los drivers del núcleo DAHDI(s), en un archivo llamado /etc/dahdi/system.conf.
En las siguientes líneas (tomadas de la configuración de ejemplo que se obtiene con una nueva
instalación de DAHDI), se encuentra ambos parámetros loadzone y defaultzone. El parámetro loadzone
le permite elegir qué conjunto(s) de tono la tarjeta genera (para alimentar a los teléfonos analógicos) y
reconoce (en las líneas telefónicas analógicas conectadas):
# Tone Zone Data
# ^^^^^^^^^^^^^^
# Finally, you can preload some tone zones, to prevent them from getting
# overwritten by other users (if you allow non-root users to open /dev/dahdi/*
# interfaces anyway). Also this means they won't have to be loaded at runtime.
# The format is "loadzone=<zone>" where the zone is a two letter country code.
#
# You may also specify a default zone with "defaultzone=<zone>" where zone
# is a two letter country code.
#
# An up-to-date list of the zones can be found in the file zonedata.c
#
loadzone = us
#loadzone = us-old
#loadzone=gr
#loadzone=it
#loadzone=fr
#loadzone=de
#loadzone=uk
#loadzone=fi
#loadzone=jp
#loadzone=sp
#loadzone=no
#loadzone=hu
#loadzone=lt
#loadzone=pl
defaultzone=us
#
El archivo /etc/dahdi/system.conf utiliza el símbolo de almohadilla (#) para indicar un comentario en
lugar de punto y coma (;) como los archivos en /etc/asterisk.
Aunque es posible cargar un número de diferentes conjuntos de tonos (se pueden ver todos los
conjuntos de tonos con detalle en zonedata.c) y puedes cambiar entre estos, en las situaciones más
prácticas sólo necesitará:
loadzone=uk
defaultzone=uk
# Para cargar el conjunto de tono
# De forma predeterminada DAHDI usara este conjunto de tonos
... O cualquier tono que usted necesita para su región.
Si realiza una dahdi_genconf para configurar de forma automática los adaptadores DAHDI, te darás
cuenta de que el archivo /etc/dahdi/system.conf recién generado tienen tanto loadzone y defaultzone
predeterminado y no el que le hemos puesto nosotros. A pesar de las advertencias de no editar
manualmente este archivo, está bien cambiar estos parámetros a lo que usted necesita.
En el caso de que te estés preguntando ¿cómo podemos saber si hay correos de voz en el buzón
asociado al canal donde un teléfono analógico está conectado?, esto se hace con un tono entrecortado.
El formato de este tono de marcado entrecortado se decide por la combinación loadzone/defaultzone
que ha utilizado.
Eso es todo en el nivel DAHDI. Elegimos el protocolo(s) para las conexiones PRI o BRI, el tipo de
señalización para los canales analógicos, y los tonos de las conexiones analógicas que se han discutido.
La relación entre Linux, DAHDI y Asterisk (y por lo
/etc/asterisk/chan_dahdi.conf) se muestra en la siguiente imagen.
tanto
/etc/dahdi/system.conf
y
Una vez que haya completado la configuración a nivel DAHDI (en /etc/dahdi/system.conf), es
necesario realizar un dahdi_cfg -vvv para que DAHDI vuelva a leer la configuración. Este es también
un buen momento para utilizar dahdi_tool para comprobar que todo parece estar en orden a nivel
Linux.
De esta manera, si las cosas no funcionan correctamente después de configurar Asterisk para
trabajar con los adaptadores DAHDI, usted puede estar seguro de que el problema se limita a
chan_dahdi.conf (o a un #include dahdichannels.conf si está utilizando esta parte de la salida de
dahdi_genconf).
Relación entre Linux, DAHDI y Asterisk.
Asterisk
Con cada cosa configurada en el nivel de Linux, ahora sólo tenemos que configurar Asterisk para hacer
uso de los canales que acabamos de habilitar en el nivel Linux y para personalizar la forma en que
Asterisk interpreta y genera la información que viene o va a través de éstos canales. Este trabajo se hace
en /etc/Asterisk/chan_dahdi.conf.
En este archivo no sólo vamos a decirle a Asterisk qué tipo de canales tenemos (estos valores se ajustan
a lo que ya hicimos en DAHDI), sino también configuraremos una serie de cosas que asegurarán que
Asterisk se adapte bien a su nuevo hogar.
Caller ID
Un componente clave de este cambio es el callerID. Si bien los métodos de entrega del identificador de
llamadas son bastante estándar en el mundo de BRI y PRI, varían ampliamente en el mundo analógico,
por lo que, si se ha conectado un teléfono analógico de América en la red de telefonía del Reino Unido,
en realidad funciona como un teléfono, pero la información de identificación de llamada no se mostrará.
Esto es así porque esta información es transmitida de diferente manera en diferentes lugares alrededor
del mundo, y un teléfono americano buscaría la señalización del callerID en el formato US, mientras que
la red de telefonía del Reino Unido se suministra (si está habilitado –que no es el estándar en el Reino
Unido;! usted tiene que pagar por el identificador de llamadas) en el formato del Reino Unido.
No sólo es el formato, también el método de decirle a un teléfono (o Asterisk) que busque el
identificador de llamadas puede variar de un lugar a otro. Esto es importante, ya que no queremos que
Asterisk pierda tiempo buscando la información de identificación de llamadas si no está presente en la
línea.
Una vez más, el formato de identificación de llamadas de Asterisk es predeterminado para América del
Norte (no hay entradas en /etc/asterisk/chan_dahdi.conf que describa esto, es sólo el valor por
defecto), y con el fin de cambiarlo tendremos que hacer algunas entradas que describen los detalles
técnicos del sistema de identificación de llamadas. En el caso de UK, la entrega de la información de
identificación de llamada se señaliza con una polaridad inversas en la línea telefónica (en otras palabras,
las patas A y B del par de hilos telefónicos son temporalmente conmutada), y la información actual del
identificador de llamadas se entrega en un formato conocido como V.23 (modulación por
desplazamiento de frecuencia o FSK). Así, las entradas en chan_dahdi.conf para recibir el identificador
de llamadas al estilo del Reino Unido en cualquier interfaz FXO se verá así:
cidstart=polarity
; la entrega del identificador de llamadas será
; señalizados por una polaridad inversas.
cidsignalling=v23
; la entrega de la información de identificación de llamada
; estarán en formato V23
Por supuesto, es posible que tenga que enviar el identificador de llamadas usando la misma información
de señalización local para todos los teléfonos analógicos conectados a las interfaces FXS, y una entrada
más puede ser necesaria ya que en algunos lugares se envía la información de identificación de llamada
después de un número específico de timbrados. Si este es el caso, puede usar esta entrada:
sendcalleridafter=2
Antes de poder hacer estas entradas, tendrá que establecer los detalles de su sistema de identificación
de llamadas local (con alguien de su compañía local de telecomunicaciones o en Google, pero también
hay una buena información de ejemplo en /etc /asterisk/chan_dahdi.conf).
Idioma y/o acento de los Avisos
Como ustedes saben, las instrucciones (o grabaciones) que Asterisk utilizará se guardan en
/var/lib/asterisk/sounds. En anteriores versiones de Asterisk todos los sonidos se encuentran en este
directorio, pero estos días se encuentra en un número de subdirectorios que permiten el uso de
distintos idiomas o acentos. Los nombres de estos subdirectorios son arbitrarios; puede llamarlos como
usted quieras.
Tenga en cuenta que los nombres de archivos en estos directorios deben ser lo que Asterisk está
esperando –por ejemplo, en /var/lib/asterisk/sounds/en, el archivo hello.gsm puede contener la
palabra "Hello" (hablado por Allison), mientras que hello.gsm en /var/lib/asterisk/sounds/es (para el
español en este caso) podría contener la palabra "Hola" (hablado por el equivalente español de Allison).
El directorio por defecto es /var/lib/asterisk/sounds/en, así que, ¿cómo puede cambiar esto?
Hay dos maneras. Una de ellas es para establecer el idioma en el archivo de configuración de canal en el
cual las llamadas están entrando, a través del uso de la directiva language. Por ejemplo, la línea:
language=en_UK
Colocada en chan_dahdi.conf, sip.conf, y así sucesivamente (para aplicar generalmente, o para sólo un
canal o perfil dado) le dirá Asterisk que use los archivos de sonido que se encuentran en
/var/lib/asterisk/sounds/en_UK (que podrían contener avisos con acento británico) para todas las
llamadas que entran a través de esos canales.
La otra forma es cambiar el idioma durante una llamada telefónica es a través del plan de marcado. Esto
(junto con muchos de los atributos de una llamada individual) se puede configurar con la función del
dialplan CHANNEL().Vea el Capítulo 12 para un tratamiento completo de las funciones del dialplan.
El siguiente ejemplo se les permitiría a las personas que llaman elegir uno de los tres idiomas en el que
puede continuar la llamada:
; Permite elegir entre (1) Francés (2) Español, o (3) Alemán
exten => s,1,Background(choose-language)
same => n,WaitExten(5)
exten => 1,1,Set(CHANNEL(language)=fr)
exten => 2,1,Set(CHANNEL(language)=es)
exten => 3,1,Set(CHANNEL(language)=de)
; la siguiente prioridad para las extensiones de 1, 2, o 3 sería manejada aquí
exten => _[123],n,Goto(menu,s,1)
Si las personas que llaman pulsan 1, los sonidos se pueden reproducir desde /var/lib/asterisk/sounds/fr,
si pulsan 2, los sonidos vendrían desde /va /lib/asterisk/sounds/es, y así sucesivamente.
Como ya se ha mencionado, los nombres de estos directorios son arbitrarios y no tienen que ser sólo de
dos caracteres –lo principal es que coincidan con el nombre del subdirectorio que ha creado en la
directiva lenguage en el canal de configuración, o cuando se establece el argumento
CHANNEL(language) en el plan de marcado.
Fecha/hora y pronunciaciones
Asterisk utiliza la hora del sistema Linux desde el servidor host, como era de esperar, pero podemos
tener usuarios del sistema que se encuentran en diferentes zonas horarias, o incluso en diferentes
países. El correo de voz es donde el caucho golpea el camino, ya que es donde los usuarios entran en
contacto con la información de hora/fecha.
Consideremos un escenario en el que algunos usuarios del sistema están basados en los EE.UU.,
mientras que otros se encuentran en el Reino Unido. Así como la diferencia de tiempo, otra cosa que
hay que tener en cuenta es la forma en que la gente de las dos localidades utilizan para escuchar la
información sobre la fecha y la hora en los Estados Unidos, fechas suelen ordenarse mes, día, año, y los
tiempos se especifican en formato de reloj de 12 horas (p. ej., 14:54).
En cambio, las fechas del Reino Unido se ordenan día, mes, año, y los tiempos a menudo se especifican
en el formato de 24 horas (14:54 horas), aunque algunas personas en el Reino Unido prefieren el
formato de reloj de 12 horas, por lo que vamos a cubrir eso también.
Puesto que todas estas cosas están conectadas al correo de voz, estás en lo cierto al suponer que
debemos configurarlo en /etc/asterisk/voicemail.conf –específicamente, en la sección [zonemessages]
del archivo.
Aquí está la parte [zonemessages] del archivo voicemail.conf de ejemplo que viene con Asterisk, con la
zona UK24 (para las personas del Reino Unido que les gusta el tiempo en formato de reloj de 24 horas)
y UK12 (para las personas del Reino Unido que prefieren el formato de reloj de 12 horas):
; still applies here so you may have several directory trees that have
; alternate language choices.
;
; Look in /usr/share/zoneinfo/ for names of timezones.
; Look at the manual page for strftime for a quick tutorial on how the
; variable substitution is done on the values below.
;
; Supported values:
; 'filename' filename of a soundfile (single ticks around the filename
; required)
; ${VAR} variable substitution
; A or a Day of week (Saturday, Sunday, ...)
; B or b or h Month name (January, February, ...)
; d or e numeric day of month (first, second, ... thirty-first)
; Y Year
; I or l Hour, 12 hour clock
; H Hour, 24 hour clock (single digit hours preceded by "oh")
; k Hour, 24 hour clock (single digit hours NOT preceded by "oh")
; M Minute, with 00 pronounced as "o'clock"
; N Minute, with 00 pronounced as "hundred" (US military time)
; P or p AM or PM
; Q "today", "yesterday" or ABdY
; (*note: not standard strftime value)
; q " (for today), "yesterday", weekday, or ABdY
; (*note: not standard strftime value)
; R 24 hour time, including minute
;
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
UK24=Europe/London|'vm-received' q 'digits/at' H N 'hours'
UK12=Europe/London|'vm-received' Q 'digits/at' Imp
Estas zonas no sólo especifican un tiempo, pero también dictan la forma en que las fechas y los tiempos
son ordenados y leídos.
Después de haber creado estas zonas, podemos ir a la parte del contexto del buzón de voz en el
voicemail.conf para asociar los buzones correspondientes con las zonas correctas:
[default]
4001 => 1234,Lian Massiel,[email protected],,|tz=central
4002 => 4444,Massi Guzman,[email protected],,|tz=UK24
4003 => 4450,Bernard Perez,[email protected],,|tz=UK12|attach=yes
Como puede ver, cuando declaramos un buzón, también (opcionalmente) lo asociamos con una zona en
particular. Todos los detalles sobre el correo de voz se pueden encontrar en el capítulo 10.
Lo último cosa a localizar en nuestra configuración de Asterisk es los tonos que se reproducen a las
personas que llaman por Asterisk una vez que están dentro del sistema (por ejemplo, los tonos que la
persona que llama escucha durante una transferencia).
Como se identificó anteriormente en este capítulo, los tonos iniciales que las personas escuchan cuando
están llamando dentro del sistema vendrán desde el teléfono IP, o desde DAHDI para canales
analógicos.
Estos tonos se definen en /etc/asterisk/indications.conf. He aquí una parte del archivo de ejemplo,
donde se puede ver una región determinada especificada por la directiva country. Sólo tenemos que
cambiar el código de país según el caso:
;
; indications.conf
;
; Configuration file for location specific tone indications
;
; NOTE:
; When adding countries to this file, please keep them in alphabetical
; order according to the 2-character country codes!
;
; The [general] category is for certain global variables.
; All other categories are interpreted as location specific indications
;
[general]
country=uk
; default is US, so we have changed it to UK
Su plan de marcado deberá reflejar el esquema de numeración para su región. Si usted no conoce el
esquema para su área, el regulador local de telecomunicaciones por lo general será capaz de suministrar
los detalles del plan de marcado. Además, el ejemplo del archivo del dialplan en
/etc/asterisk/extensions.conf está, por supuesto, lleno de números de norteamericanos y patrones.
Capı́tulo 12
Dialplan Avanzados
Muy bien. Ya usted tiene los fundamentos de dialplan agarrados, pero usted sabe que hay más por
venir. Si usted no tiene el capítulo 8 resuelto todavía, por favor vuelva y dele otra lectura. Estamos a
punto de entrar en temas más avanzados.
Manipulación de Variables y Expresiones
Como parte de nuestro análisis de los aspectos más profundos del dialplan, es el momento de
presentarle a usted algunas herramientas que le añaden una gran potencia a sus ejercicios en el
dialplan. Estas construcciones le suman una increíble inteligencia a su dialplan por que le permiten
tomar decisiones basadas en los diferentes criterios que usted defina. Póngase su gorra para pensar,
que vamos a empezar.
A lo largo de este capítulo utilizamos las mejores prácticas que se han desarrollado en los últimos
años en la creación de plan de marcado. Lo principal que notará es que todas las primeras
prioridades comienzan con la aplicación NoOp(), que simplemente significa No Operación, nada
funcional va a suceder. Lo otro es que todas las líneas siguientes se iniciarán con el same=>n, que es
un acceso directo que dice: "Usar la misma extensión que se acaba de definir con anterioridad."
Además, la sangría es de cuatro espacios.
Expresiones Básicas
Las expresiones son combinaciones de variables, operadores y valores que se encadenan juntos para
producir un resultado. Una expresión puede probar valores, alterar las cadenas, o realizar cálculos
matemáticos. Digamos que tenemos una variable llamada COUNT. En español llano, dos expresiones
que utilizan esta variable podría ser "COUNT más 1" y " COUNT dividido por 2." Cada una de estas
expresiones tiene un resultado o valor en particular, en función del valor de la variable dada.
En Asterisk, las expresiones siempre comienzan con un signo de dólar y un corchete de apertura y
terminan con un corchete de cierre, como se muestra aquí:
$[expresión]
De este modo, escribiríamos nuestros dos ejemplos como éste:
$[${COUNT} + 1]
$[${COUNT} / 2]
Cuando Asterisk encuentra una expresión en el plan de marcado, reemplaza toda la expresión con el
valor resultante. Es importante señalar que esto toma lugar después de la sustitución de variables.
Para demostrarlo, vamos a ver el siguiente código:
exten => 321,1,NoOp()
same => n,Answer()
same => n,Set(COUNT=3)
same => n,Set(NEWCOUNT=$[${COUNT} + 1])
same => n,SayNumber(${NEWCOUNT})
En la segunda prioridad, se asigna el valor de 3 a la variable llamada COUNT.
En la tercera prioridad, únicamente la aplicación —Set()—está involucrada, pero tres cosas realmente
están sucediendo:
1. Asterisk sustituye ${COUNT} con el número 3 en la expresión. La expresión efectivamente se
convierte en la siguiente:
same => n,Set(NEWCOUNT=$[3 + 1])
2. Asterisk evalúa la expresión, le suma 1 a 3, y lo sustituye por su valor calculado de 4:
same =>n,Set(NEWCOUNT=4)
3. La aplicación Set() asigna el valor 4 a la variable NEWCOUNT.
La tercera prioridad, simplemente invoca la aplicación SayNumber(), que le dirá el valor actual de la
variable ${ NEWCOUNT } (establecida en el valor 4 en prioridad dos).
Pruebe esto en su propio dialplan.
Operadores
Cuando se crea un plan de marcado de Asterisk, en realidad estás escribiendo código en un lenguaje de
scripting especializado. Esto significa que el dialplan de Asterisk como cualquier lenguaje de
programación reconoce símbolos llamados operadores que permiten manipular variables. Echemos un
vistazo a los tipos de operadores que están disponibles en Asterisk:
Operadores booleanos
Estos operadores a evalúan la "verdad" de una declaración. En términos informáticos, se refiere
esencialmente a si la declaración es algo o nada (nulo o no, verdadero o falso, encendido o apagado, y
así sucesivamente). Los operadores booleanos son:
expr1 | expr2
Este operador (llamado el operador "o", o "pipe") devuelve la evaluación de la expr1 si es verdad (ni una
cadena vacía ni cero). De lo contrario, devuelve la evaluación de expr2.
expr1 & expr2
Este operador (llamado "y") devuelve la evaluación de la expr1 si ambas expresiones son verdaderas (es
decir, la expresión no se evalúa como una cadena vacía o nula). De lo contrario, devuelve cero.
expr1 {=, >, >=, <, <=, !=} expr2
Estos operadores devuelven los resultados de una comparación de enteros si ambos argumentos son
enteros, de lo contrario, devuelven los resultados de una comparación de cadenas. El resultado de cada
comparación es 1 si la relación especificada es verdadera, o 0 si la relación es falsa. (Si usted está
haciendo las comparaciones de cadenas, se llevará a cabo de una manera que es consistente con los
valores locales actuales de su sistema operativo.)
Operadores Matemáticos
¿Quieres realizar un cálculo? Usted querrá uno de estos:
expr1 {+, -} expr2
Estos operadores devuelven los resultados de la suma o resta de los argumentos enteros valorado.
expr1 {*, /, %} expr2
Estos operadores retornan, respectivamente, los resultados de la multiplicación, la división entera, o
resto de argumentos con valores enteros.
Operador De Expresión Regular
También puede utilizar el operador de expresión regular en Asterisk:
expr1: expr2
Este operador compara la expr1 contra expr2, donde expr2 debe ser una expresión regular. La expresión
regular es anclada al principio de la cadena con un implícito ^.
Si el patrón no contiene ninguna subexpresión, se devuelve el número de caracteres coincidentes. Esta
será 0 si la comparación falla. Si el patrón contiene una subexpresión --\ (... \)-- retorna la cadena
correspondiente a \ 1. Si la comparación falla, se devuelve la cadena vacía.
expr1 =~ expr2
Este operador funciona de la misma forma como el: operador, excepto que no está anclado
al principio. En Asterisk versión 1.0, el analizador era bastante simple, por lo que este requería que
usted ponga al menos un espacio entre el operador y cualquier otro valor. En consecuencia, lo siguiente
podría no haber funcionado como se esperaba:
exten => 123,1,Set(TEST=$[2+1])
Esto le asigna a la variable TEST la cadena 2+1, en lugar del valor 3. Para remediar eso, pondríamos
poner espacios alrededor del operador, así:
exten => 234,1,Set(TEST=$[2 + 1])
Esto ya no es necesario en las versiones actuales de Asterisk, como el analizador de expresiones se ha
hecho más tolerante en este tipo de escenarios. Sin embargo, por el bien de la legibilidad, le
recomendamos que incluya los espacios alrededor de sus operadores.
Para concatenar texto en el inicio o al final de una variable, simplemente colóquelos juntos, así:
exten => 234,1,Set(NEWTEST=blah${TEST})
Funciones del Dialplan
Las funciones del Dialplan le permiten añadir más potencia a sus expresiones, se puede pensar en ellas
como variables inteligentes. La funciones del dialplan le permiten calcular longitudes de cadenas, fechas
y horas, sumas de comprobación MD5 y, y así sucesivamente, todo desde dentro de una expresión del
dialplan.
Sintaxis
Las funciones del dialplan tienen la siguiente sintaxis básica:
NOMBRE_FUNCION(argumento)
Hacemos referencia a un nombre de función del mismo modo que al nombre de una variable, pero se
hace referencia al valor de una función con la adición de un signo de dólar, una llave de apertura, y una
llave de cierre:
${NOMBRE_FUNCION(argumento)}
Las funciones también pueden encapsular otras funciones, así:
${NOMBRE_FUNCION (${NOMBRE_FUNCION (argumento) } ) }
^
^^
^
^^^^
1
2 3
4
4321
Como usted probablemente ya habrá descubierto, debe tener mucho cuidado en asegurarse de que los
juego de paréntesis y llaves coincidan. En el ejemplo anterior, hemos etiquetado los paréntesis de
apertura y las llaves con los números y sus homólogos de cierre correspondientes con los mismos
números.
Ejemplos de Funciones del Dialplan
Las funciones se utilizan a menudo en combinación con la aplicación Set() para obtener o establecer el
valor de una variable. Como un simple ejemplo, echemos un vistazo a la función LEN(). Esta función
calcula la longitud de la cadena que es pasada como argumento. Vamos a calcular la longitud de una
variable y retornarle a la persona que llama la longitud de la cadena:
exten => 123,1,NoOp()
same => n,Set(TEST=ejemplo)
same => n,Playback(silence/1)
same => n,SayNumber(${LEN(${TEST})})
En este ejemplo primero se evaluará variable $TEST que es igual a ejemplo. La cadena "ejemplo" se pasa
entonces a la función LEN(), que evaluará la longitud de la cadena como, 7. Por último, 7 se pasa como
un argumento a la aplicación SayNumber().
Veamos otro ejemplo simple. Si quisiéramos establecer uno de los distintos canales de tiempos de
espera, podríamos utilizar la función TIMEOUT(). La función TIMEOUT() acepta uno de tres argumentos:
absoluto, dígitos, y respuesta. Para definir el Timeout como digito con la función TIMEOUT(), podemos
usar la aplicación Set(), así:
exten => s,1,Set(TIMEOUT(digit)=30)
Note que la falta de ${ } encerrando la función. Al igual que si estuviéramos asignando un valor a una
variable, se asigna un valor a una función sin el uso de la ${ } encapsulación.
Una lista completa de las funciones disponibles se encuentra escribiendo core show functions en la
interfaz de línea de comandos de Asterisk.
Bifurcaciones condicionales
Ahora que usted ha aprendido un poco más acerca de las expresiones y funciones, es el momento de
ponerlas en práctica. Mediante el uso de expresiones y funciones, puede agregar lógica aún más
avanzada a tu dialplan. Para permitirle al dialplan tomar decisiones, vamos a utilizar la bifurcación
condicional. Echemos un vistazo más de cerca.
Aplicación Gotoif()
La clave de la bifurcación condicional es la aplicación GotoIf(). GotoIf() evalúa una
expresión y envía la persona que llama a un destino específico en función de si la expresión es evaluada
como verdadero o falso.
GotoIf() utiliza una sintaxis especial, a menudo llamada sintaxis condicional:
GotoIf(expresion?destino1:destino2)
Si la expresión se evalúa como verdadera, la persona que llama se envía al destino 1. Si la expresión se
evalúa como falsa, la persona que llama se envía al segundo destino. Entonces, ¿qué es verdad y qué es
falso? Una cadena vacía y el número 0 se evalúan como falso. Cualquier otra cosa se evalúa como
verdadera.
Los destinos pueden ser cada uno de los siguientes:
•
Una etiqueta de prioridad dentro de la misma extensión, como nivalis.
•
Una extensión y una prioridad etiquetada dentro del mismo contexto, como 123, nivalis.
•
Un contexto, la extensión, y la prioridad etiquetada, como entrantes, 123, nivalis.
Cualquiera de los destinos puede omitirse, pero no ambos. Si el destino es omitido, Asterisk
simplemente pasa a la siguiente prioridad en la extensión actual.
Usemos un ejemplo de GotoIf():
exten => 345,1,NoOp()
same => n,Set(TEST=1)
same => n,GotoIf($[${TEST} = 1]?nivalis:iguanas)
same => n(nivalis),Playback(weasels-eaten-phonesys)
same => n,Hangup()
same => n(iguanas),Playback(office-iguanas)
same => n,Hangup()
Usted se dará cuenta de que se ha utilizado la aplicación Hangup() después de cada uso de la
aplicación Playback().Esto se hace para que cuando saltemos a la etiqueta nivalis, la llamada se
detiene antes de ejecutar el archivo de sonido de office-iguanas. Cada vez es más común ver las
extensiones divididas en varios componentes (protegidos unos de otros por el comando de Hangup(),
cada una de ellas es una secuencia clara de pasos ejecutados tras un GotoIf().
Proporcionando un Sólo camino condicional Falso.
Si quisiéramos, podríamos haber elaborado el ejemplo anterior de esta manera:
exten => 345,1,NoOp()
same => n,Answer()
same => n,Set(TEST=1)
same => n,GotoIf($[${TEST} = 1]?:iguanas)
; no usamos la etiqueta nivalis mas
; Pero esto seguirá funcionando
same => n,Playback(weasels-eaten-phonesys)
same => n,Hangup()
same => n(iguanas),Playback(office-iguanas)
same => n,Hangup()
No hay nada entre el signo “?” y los dos puntos : por lo que si la declaración se evalúa como verdadera,
la ejecución continuará en el próximo paso. Dado que eso es lo que queremos, no es necesaria una
etiqueta.
En realidad, no se recomienda hacer esto, porque es difícil de leer, pero veremos dialplan como este, así
que es bueno tener en cuenta que esta sintaxis es totalmente correcta.
Normalmente, cuando se tiene este tipo de diseño en el que dan ganas de prevenir que Asterisk caiga a
la siguiente prioridad después de haber realizado el salto, es probablemente mejor saltar a una
extensión separada en lugar de una prioridad etiquetada. Si en todo caso, esto hace que sea un poco
más claro al leer el plan de marcado. Podríamos reescribir el bit anterior del plan de marcado de esta
manera:
exten => 345,1,NoOp()
same => n,Answer()
same => n,Set(TEST=1)
same => n,GotoIf($[${TEST} = 1]nivalis,1:iguanas,1)
; ahora vamos a la extensión,
; prioridad
exten => nivalis,1,
same => n,Playback(weasels-eaten-phonesys) ; esto NO es una etiqueta es una
; extensión diferente.
same => n,Hangup()
exten => iguanas,1,NoOp()
same => n,Playback(office-iguanas)
same => n,Hangup()
Al cambiar el valor asignado a TEST en la segunda línea, usted debería ser capaz de que su servidor
Asterisk reproduzca un saludo diferente.
Vamos a ver otro ejemplo de bifurcación condicional. Esta vez, vamos a utilizar ambos Goto() y GotoIf()
para contar descendentemente desde 10 y después colgar:
exten => 123,1,NoOp()
same => n,Answer()
same => n,Set(COUNT=10)
same => n(start),GotoIf($[${COUNT} > 0]?:goodbye)
same => n,SayNumber(${COUNT})
same => n,Set(COUNT=$[${COUNT} - 1])
same => n,Goto(start)
same => n(goodbye),Hangup()
Analicemos este ejemplo. En la tercera prioridad, asignamos a la variable COUNT el valor de 10. Después
verificamos para ver si COUNT es mayor que 0. Si lo es, se pasa a la siguiente prioridad. (No olvide que si
omitimos un destino en la aplicación GotoIf(), el control pasa a la siguiente prioridad.) A partir de ahí, el
sistema le dice el número que contiene la variable, se resta 1 a COUNT, y vuelve a la prioridad etiqueta
como start. Si el número es menor o igual a 0, el control pasa a la prioridad etiquetada como goodbye, y
se cuelga la llamada.
Comilla y prefijar Variables en Bifurcaciones condicionales
Ahora es un buen tiempo para tomar un momento y mirar algunas cosas quisquillosas con bifurcaciones
condicionales. En Asterisk, no es válido tener un valor nulo en los lados del operador de comparación.
Veamos algunos ejemplos que producirían un error:
$[ = 0]
$[ foo = ]
$[ > 0 ]
$[ 1 + ]
Cualquiera de estos ejemplos produciría una advertencia como esta:
WARNING[28400][C-000000eb]: ast_expr2.fl:470 ast_yyerror: ast_yyerror():
syntax error: syntax error, unexpected '=', expecting $end; Input:
=0
^
Es bastante improbable (a menos que tenga un error) que quisiera poner en práctica a propósito algo
como nuestro ejemplo. Sin embargo, al realizar las matemáticas o la comparación con una variable de
canal no definida, esto es efectivamente lo que estás haciendo.
Los ejemplos que hemos utilizado para mostrar cómo funciona la bifurcación condicional no son
inválidos. Porque nosotros primeros hemos inicializado la variable y podemos ver claramente que la
variable de canal que estamos usando en nuestra comparación se ha definido, estamos a salvo. ¿Pero
que si no siempre estamos tan seguros?
En Asterisk, las cadenas no tienen que estar entre comillas dobles o simples, como en muchos lenguajes
de programación. De hecho, si se utiliza una comilla doble o simple, es una construcción literal de la
cadena. Si nos fijamos en la siguientes dos línea Set() ...
exten => n,Set(TEST_1=foo)
exten => n,Set(TEST_2='foo')
exten => n,NoOp($[${TEST_1} = ${TEST_2}])
... entonces el valor devuelto por nuestra comparación en el NoOp() no será un valor de 1 (los valores
coinciden, o verdadero) el valor de retorno será 0 (los valores no coinciden, o falso).
Podemos usar esto a nuestro favor cuando se realizan comparaciones encerrando nuestras variables de
canal entre comillas simples o dobles. De esta manera nos aseguramos de que, incluso cuando no se
pudo definir la variable de canal, que nuestra comparación es válida.
En el siguiente ejemplo, obtendríamos un error:
exten => 1000,1,NoOp()
same => n,GotoIf($[${TEST} = invalid]?error_handling)
same => n(error_handling),NoOp()
Sin embargo, podemos evitar esto, encerrando lo que estamos comparando entre comillas. El mismo
ejemplo, pero se hizo válido:
exten => 1000,1,NoOp()
same => n,GotoIf($["${TEST}" = "invalid"]?error_handling)
same => n(error_handling),NoOp()
Incluso si ${TEST} no se ha definido, estamos haciendo una comparación de:
$["" = "invalid"]
Podemos hacer el mismo tipo de red de seguridad en las comparaciones que están realizando
comparaciones numéricas prefijando nuestros números con un cero. Debido a que 01 es lo mismo que 1
cuando se comparan números, nuestro ejemplo potencialmente inválido de:
exten => 1001,1,NoOp()
same => n,GotoIf($[${TEST} < 1]?error_handling)
same => n(error_handling),NoOp()
¿Se puede hacer más seguro de esta manera:
exten => 1001,1,NoOp()
same => n,GotoIf($[0${TEST} < 1]?error_handling)
same => n(error_handling),NoOp()
Si usted adquiere el hábito de reconocer estas situaciones y usando la técnica de encerrar en comilla y
prefijar que hemos descrito, usted escribirá dialplan mucho más seguros.
El ejemplo clásico de bifurcación condicional se conoce cariñosamente como la lógica anti novia. Si el
número de identificación de la llamada entrante coincide con el número de teléfono de la ex novia del
destinatario, Asterisk da un mensaje diferente del que normalmente daría con cualquier otra persona
que llama. Mientras que esto es algo simple y primitivo, es un buen ejemplo para aprender acerca de la
bifurcación condicional en el dialplan de Asterisk.
En este ejemplo se utiliza la función CALLERID, lo que nos permite recuperar la información de
identificación de llamada de las llamadas entrantes. Vamos a asumir por el bien de este ejemplo que el
número de teléfono de la víctima es 610-483-8383:
exten => 123,1,NoOp()
same => n,GotoIf($[${CALLERID(num)} = 6104838383]?rechazar:permitir)
same => n(permitir),Dial(DAHDI/4)
same => n,Hangup()
same => n(rechazar),Playback(abandon-all-hope)
same => n,Hangup()
En la prioridad 1, llamamos la aplicación GotoIf(). Esto le dice Asterisk que vaya a la prioridad etiquetada
rechazar si el número de identificación de la llamada coincide con 6104838383, de lo contrario que vaya
a la prioridad etiquetada permitir. Si el número de identificación de llamada coincide, el control de la
llamada va a la prioridad etiquetada rechazar, que reproduce un mensaje poco inspirador a la llamada
no deseada. De lo contrario, la llamada intente marcar el receptor en el canal DAHDI/4.
Bifurcación condicional basada en tiempo con GotoIfTime()
Otra forma de utilizar la bifurcación condicional en tu dialplan es con la aplicación
GotoIfTime().Mientras GotoIf() evalúa una expresión para decidir qué hacer, GotoIfTime() busca el
tiempo actual del sistema y usa este para decidir si sigue o no una rama diferente en el dialplan.
El uso más obvio de esta aplicación es para dar a las personas que llaman un saludo diferente antes y
después de las horas normales de oficina.
La sintaxis para la aplicación GotoIfTime() se ve así:
GotoIfTime(horas,dias_de_semanas,dias_del_mes,meses?etiqueta)
En resumen, GotoIfTime() envía la llamada a la etiqueta especificada si la fecha y la hora actuales
coinciden con los criterios especificados por horas, DIAS_DE_SEMANA, DIAS_DEL_MESES y meses.
Echemos un vistazo a cada argumento con más detalle:
Horas
Esta es una lista de una o más rangos de horas, en un formato de 24 horas. Como ejemplo, 09 a.m. hasta
las 5:00 P.M. se especificaría como 09:00-17:00. El día comienza a las 0:00 y termina a las 23:59.
días_de_semana
Esta es una lista de uno o más días de la semana. Los días deben ser especificados como lun, mar, mié,
jue, vie, sáb, y/o dom. De lunes a viernes se expresaría como lun-vie, martes y jueves se expresarían
como mar&jue.
Tenga en cuenta que puede especificar una combinación de rangos y solo días, como en: domlun&mie&vie-sáb, o, más simplemente: mie&vie-lun.
Días_del_mes
Esta es una lista de los días numéricos del mes. Los días son especificadas por los números 1 al 31. El 7th
hasta el 12th se expresaría como 7-12, y el 15th y 30th de cada mes se escribiría como 15&30.
Meses
Esta es una lista de uno o más meses del año. Los meses se deberán ser escrito como ene-abr para un
rango, y ser separado con el signo & (ampersands) cuando espera incluir meses no secuenciales, como
ene&mar&jun. También puedes combinarlos de esta manera: ene-abr&jun&oct-dic.
Si se quiere hacer coincidir todos los valores posibles para cualquiera de estos argumentos, simplemente
ponga un * para ese argumento.
El argumento etiqueta puede ser cualquiera de los siguientes:
•
Una prioridad etiquetada dentro de la misma extensión, como el tiempo _ha_pasado.
•
Una extensión y una prioridad dentro del mismo contexto, tales como 123, tiempo _ha_pasado.
•
Un contexto, extensión y prioridad, como entrante, 123, tiempo _ha_pasado.
Ahora que hemos cubierto la sintaxis, echemos un vistazo a un par de ejemplos. El siguiente ejemplo
correspondería de 09 a.m. a 17:59, de lunes a viernes, en cualquier día del mes, en cualquier mes del
año:
exten => s,1,NoOp()
same => n,GotoIfTime(09:00-17:59,mon-fri,*,*?abierto,s,1)
Si la persona llama durante estas horas, la llamada se envía a la primera prioridad de la extensión s en el
contexto llamado abierto. Si se realiza la llamada fuera de los tiempos especificados, se enviará a la
siguiente prioridad de la extensión actual. Esto le permite saltar fácilmente en múltiples ocasiones,
como se muestra en el ejemplo siguiente (tenga en cuenta que siempre debe poner su tiempo más
específico para que coincida antes que los menos específicos):
; Si es cualquier hora del día, en cualquier día de la semana,
; Durante el cuarto día del mes, en el mes de julio,
; Estamos cerrados
exten => s,1,NoOp()
same => n,GotoIfTime(*,*,4,jul?cerrado,s,1)
; Durante las horas de oficina, enviar llamadas al contexto abierto
same => n,GotoIfTime(09:00-17:59,mon-fri,*,*?abierto,s,1)
same => n,GotoIfTime(09:00-11:59,sat,*,*?abierto,s,1)
; De lo contrario, estamos cerrado
same => n,Goto(cerrado,s,1)
Si te encuentras con la situación en la que te haces la pregunta: "Pero yo especifique 17:58 y ahora
son 17:59. ¿Por qué sigue haciendo lo mismo?” debe tener en cuenta que la granularidad de la
aplicación GotoIfTime() es sólo para un período de dos minutos. Por lo tanto, si especifica 18:00
como la hora de finalización de un período, el sistema seguirá haciendo lo mismo hasta 18:01:59.
Macros
Los macros son constructores muy útiles diseñados para evitar repeticiones en el dialplan. También
ayudan a realizar cambios en el plan de marcado.
Aunque los Macro() parecen una subrutina del dialplan de propósito general, tiene un problema de
desbordamiento de pila esto significa que no se deben tratar los Macro() anidados a más de cinco
niveles de profundidad. Si planea utilizar una gran cantidad de macros dentro de macros (y llamar
funciones complejas dentro de ellos), es posible que encuentre problemas de estabilidad. Usted sabe
que tiene un problema con sólo una llamada de prueba. También te recomendamos que le eches un
vistazo a la aplicaciones GoSub() y Return(), ya que una gran cantidad de funcionalidad de macro se
pueden implementar sin utilizar realmente Macro().
A partir de Asterisk 11, la aplicación Macro() ha sido desaprobado en favor de la aplicación
GoSub().El estar bien informado acerca de Macro() es útil, sin embargo, como casi cualquier sistema
existente que usted le vaya a dar mantenimiento o modificar es probable que contenga por lo menos
un simple uso de Macro().
Para ilustrar este punto, echemos un vistazo a nuestro dialplan de ejemplo de nuevo. Si recuerda los
cambios que hicimos para el correo de voz, nosotros terminamos con lo siguiente para la extensión de
LIAN:
exten => 101,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail(101@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(101@default,b)
same => n,Hangup()
Ahora imagine que tiene un centenar de usuarios en su sistema Asterisk –configurar las extensiones
implicaría un montón de copiar y pegar. Ahora imagine que usted necesita hacer un cambio en la forma
en que sus extensiones trabajan. Esto implicaría una gran cantidad de edición, y que sería casi seguro
que contendrá errores.
Por el contrario, se puede definir un macro que contenga una lista de pasos a seguir y, a continuación,
tener todas las extensiones de teléfonos que hagan referencia a ese macro. Todo lo que necesita
cambiar es la macro, y todo en el plan de marcado que hace referencia a esa macro cambiará también.
Si usted está familiarizado con la programación de computadoras, usted reconocerá que las macros
son similares a subrutinas en muchos lenguajes de programación modernos. Si no está familiarizado
con la programación de computadoras, no se preocupes –nosotros iremos paso a paso a través de la
creación de un macro.
La mejor manera de apreciar un macro es viéndolo en acción, así que vamos a movernos a lo largo de
este.
Definiendo Macros
Tomemos la lógica del dialplan que utilizamos para configurar el correo de voz de LIAN y convertirla en
un macro. Luego vamos a utilizar el macro para dar a LIAN y MASSI (y el resto de sus compañeros de
trabajo) la misma funcionalidad.
Las definiciones de macros se parecen mucho a los contextos. (De hecho, se podría argumentar que
realmente son pequeños, contexto limitado.) Se define un macro colocando macro- y el nombre del
macro entre corchetes, por ejemplo:
[macro-correodevoz]
Los nombres de macros deben iniciar con macro-. Esto los distingue de los contextos regulares. Los
comandos en los macros se construyen de manera casi idéntica a cualquier otra cosa en el plan de
marcado, el único factor limitante es que los macros sólo utilizan la extensión s. Vamos a agregar
nuestra lógica de correo de voz a la macro, cambiando la extensión a s como va:
[macro-correodevoz]
exten => s,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail(101@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(101@default,b)
same => n,Hangup()
Esto es un comienzo, pero no es perfecto, ya que sigue siendo específico para LIAN y su número de
buzón. Para hacer el macro genérico para que trabaje no sólo para LIAN, sino también para todos sus
compañeros de trabajo, vamos a tomar la ventaja de otra propiedad de los macros: argumentos. Pero
primero, vamos a ver cómo llamamos un macro en nuestro plan de marcado.
Llamando un Macro desde el Dialplan
Para llamar un macro en nuestra plan de marcado, usamos la aplicación Macro(). Llama el macro
especificado y pasa a este cualquier argumento. Por ejemplo, para llamar nuestro macro correodevoz
desde nuestro dialplan, podemos hacer lo siguiente:
exten => 101,1,Macro(correodevoz)
La aplicación Macro() también defines varias variables especiales para nuestro uso. Ellos incluyen:
${MACRO_CONTEXT}
El contexto original en el que se llamó el macro.
${MACRO_EXTEN}
La extensión original en el que se llamó el macro.
${MACRO_PRIORITY}
La prioridad original en la que se llamó el macro.
${ARG n}
Los N argumentos pasado al macro. Por ejemplo, el primer argumento sería de ${ARG1}, el
segundo ${ARG2}, y así sucesivamente.
Como hemos explicado antes, la forma en que inicialmente definimos nuestro macro estaba codificado
específicamente para LIAN, en vez de ser genérico. Vamos a cambiar nuestro macro para utilizar
${MACRO_EXTEN} en lugar de 101 para el número de buzón. De esa manera, si llamamos el macro
desde la extensión 101, los mensajes de correo de voz irán al buzón 101, si llamamos el macro desde la
extensión 102, los mensajes irán al buzón 102, y así sucesivamente:
[macro-correodevoz]
exten => s,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail({MACRO_EXTEN}@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(({MACRO_EXTEN}@default,b)
same => n,Hangup()
Usando Argumentos en los Macros
Ahora estamos más cerca de tener el macro de la manera que queremos, pero todavía nos queda una
cosa por cambiar: necesitamos pasar el canal para marcar, ya que actualmente está siendo codificado
para ${LIAN} (recuerde que definido la variable LIAN como el canal para llamar cuando queremos
alcanzar a LIAN).Vamos a pasar el canal como un argumento, y luego nuestro primer macro estará
completo:
[macro-correodevoz]
exten => s,1,NoOp()
same => n,Dial(${ARG1},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail({MACRO_EXTEN}@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(({MACRO_EXTEN}@default,b)
same => n,Hangup()
Ahora que nuestro macro esta hecho, podemos usarlo en nuestro plan de marcado. Aquí esta cómo
podemos llamar nuestro macro para proporcionar correo de voz a LIAN, MASSI, y BERNARD:
exten => 101,1,Macro(correodevoz,${LIAN})
exten => 102,1,Macro(correodevoz,${MASSI})
exten => 103,1,Macro(correodevoz,${BERNARD})
Con 50 o más usuarios, este plan de marcado todavía se verá limpio y organizado, simplemente tenemos
una línea por cada usuario, haciendo referencia a un macro que puede ser tan complicado como sea
necesario. Incluso podríamos tener algunos macros diferentes para los distintos tipos de usuarios, tales
como Departamentos_ventas, teléfonos_cortesía, agentes_call_center, extensiones_análoga,
ejecutivos, y así sucesivamente.
Una versión más avanzada de este macro podría ser algo como esto:
[macro-correodevoz]
exten => s,1,NoOp()
same => n,Dial(${ARG1},20)
same => n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,VoiceMail(${MACRO_EXTEN}@default,u)
same => n,Goto(entrante,s,1)
exten => s-BUSY,1,VoiceMail(${MACRO_EXTEN}@default,b)
same => n,Goto(entrante,s,1)
exten => _s-.,1,NoOp()
same => n,Goto(s-NOANSWER,1)
Ahora que también sabemos cómo utilizar las funciones del dialplan, aquí hay otra manera de
controlar cual mensaje del sistema de correo de voz (no disponible versus ocupado) se reproduce a
las personas que llaman. En el siguiente ejemplo, vamos a utilizar la función del dialplan IF() :
[macro-correodevoz]
exten => s,1,NoOp()
same => n,Dial(${ARG1},20)
same => n,VoiceMail(${MACRO_EXTEN}@default,${IF($[${DIALSTATUS}=BUSY]?b:u)})
Este macro depende de un efecto secundario interesante de la aplicación Dial(): cuando se utiliza la
aplicación Dial(), se establece la variable DIALSTATUS para indicar si la llamada fue o no contestada. En
este caso, estamos manejando los casos no contestada y ocupado, y estamos tratando todos los demás
códigos del resultado como NOCONTESTADA.
GoSub
La aplicación del dialplan GoSub() es similar a la aplicación Macro(), en que el propósito es permitirle a
usted llamar un bloque de funcionalidades del dialplan, pasar información para este bloque y retornar
desde este (opcionalmente con un valor de retorno). GoSub() trabaja de manera diferente a Macro(),
porque no tiene los requerimientos de espacio de pila, por lo que se anida efectivamente.
Esencialmente, GoSub() actúa como Goto() con una memoria desde donde este viene.
En esta sección vamos a reimplementar lo que aprendimos en “Macros” en la página 213. Si es
necesario, es posible que desee revisar esa sección: esto explica por qué podemos usar una subrutina, y
el objetivo que estamos tratando de alcanzar.
Definiendo Subrutinas
A diferencia de los Macro(), no hay requisitos especiales de nombres cuando se utiliza GoSub() en el
plan de marcado. De hecho, puede utilizar GoSub() dentro del mismo contexto y extensión si desea. En
la mayoría de los casos, sin embargo, GoSub() se utiliza de una manera similar a Macro(), por lo que la
definición de un nuevo contexto es común. Cuando creamos el contexto, nos gusta anteponer al
nombre sub así sabemos que el contexto es típicamente llamado desde la aplicación GoSub() (por
supuesto, no hay ningún requerimiento para hacer esto, pero parece una convención sensible).
Aquí tenemos un ejemplo simple de como nosotros podríamos definir una subrutina en Asterisk:
[subCorreodevoz]
Vamos a retomar nuestro ejemplo de "Macros" en la página 213 y lo convertiremos en una subrutina.
Así es como se define para usar como un Macro():
exten => 101,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail(101@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(101@default,b)
same => n,Hangup()
Si vamos a convertir esto para ser usado como una subrutina, podría ser como el siguiente ejemplo:
[subCorreodevoz]
exten => start,1,NoOp()
same => n,Dial(${LIAN},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail(101@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(101@default,b)
same => n,Hangup()
No es un gran cambio, ¿no? Todo lo que hemos alterado en este ejemplo es el nombre del contexto, de
[macro-correodevoz] para [subCorreodevoz], y la extensión, s para start (ya que no hay ningún requisito
de que la extensión puede llamarse con cualquier cosa en particular, a diferencia de Macro(), que espera
que la extensión sea s).
Por supuesto, como en el ejemplo de la sección "Macros" en la página 213, no hemos pasado ningún
argumento a la rutina, así que cada vez que llamemos la rutina [subCorreodevoz], siempre llamará a
${LIAN}, y el buzón de correo de voz 101 siempre será usado. En las siguientes secciones, vamos a
profundizar un poco más. En primer lugar vamos a ver cómo llamar a una subrutina, y luego vamos a
aprender cómo pasar argumentos.
Llamando una subrutina desde el Dialplan
La subrutinas son llamadas desde el dialplan usando la aplicación GoSub(). Los argumentos para GoSub
difieren ligeramente de los argumentos para Macro(), porque GoSub() no tiene requerimientos para
nombrar los contexto o extensiones (o prioridad) que son usados. Adicionalmente, ninguna variable de
canal son definidas cuando se llama una subrutina, aparte de los argumentos pasados, los cuales son
guardados en ${ARGn} (donde el primer argumento es ${ARG1), el segundo argumento es ${ARG2}, y así
sucesivamente).
Ahora que hemos actualizado nuestro macro correodevoz para ser llamado como una subrutina,
echemos un vistazo a cómo podemos llamar este usando GoSub():
exten => 101,1,GoSub(subCorreodevoz,start,1())
Como usted notara que hemos colocado un conjunto de paréntesis de apertura y cierre dentro de
nuestra aplicación GoSub().Estos son los marcadores de posición para los argumentos que podríamos
pasar a la subrutina, y mientras que es opcional pero ellos existen, es un estilo de programación que
preferimos usar.
A continuación, vamos a ver cómo podemos pasar argumentos a nuestra subrutina con el fin de que sea
más genérica.
Usando Argumentos en Subrutinas
La capacidad de utilizar argumentos es una de las principales características al utilizar Macro() o
GoSub(), ya que le permite abstraer código que de otro modo se duplica a través de su plan de marcado.
Sin necesidad de duplicar el código, podemos administrar este mejor, y fácilmente podemos agregar
funcionalidades para un gran número de usuarios por modificar una sola localización. Les animamos a
mover el código a esta forma cada vez que se encuentre con la creación de código duplicado.
Antes de iniciar a utilizar nuestra subrutina, necesitamos actualizarla para que acepte argumentos para
que sea lo suficientemente genérica como para ser utilizado por múltiples usuarios:
[subCorreodevoz]
exten => start,1,NoOp()
same => n,Dial(${ARG1},10)
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]"]?ocupado:nodisponible)
same => n(nodisponible),VoiceMail(${ARG2}@default,u)
same => n,Hangup()
same => n(ocupado),VoiceMail(${ARG2}@default,b)
same => n,Hangup()
Recordemos que previamente habíamos codificado la variable de canal ${LIAN} como la localización a
marcar, y el buzón 101 como el buzón de voz que se utilizará si ${LIAN} no estaba disponible. En este
código, hemos reemplazado ${LIAN} y 101 con ${ARG1} y ${ARG2}, respectivamente. En subrutinas más
complejas incluso podríamos asignar las variables ${ARG1} y ${ARG2} a algo así como ${DESTINO} y
${VMBUZON}, para dejar claro lo que ${ARG1} y ${ARG2} representan.
Ahora que hemos actualizados nuestra subrutina, podemos usarla con varias extensiones:
[Local]
exten => 101,1,GoSub(subCorreodevoz,start,1(${LIAN},${EXTEN}))
exten => 102,1,GoSub(subCorreodevoz,start,1(${MASSI},${EXTEN}))
exten => 103,1,GoSub(subCorreodevoz,start,1(${BERNARD},${EXTEN}))
Aunque, nuestro dialplan es agradable y limpio. Incluso podríamos modificar nuestra subrutina a sólo
tres líneas:
[subCorreodevoz]
exten => start,1,NoOp()
same => n,Dial(${ARG1},10)
same => n,VoiceMail(${ARG2}@default,${IF($[${DIALSTATUS} = BUSY]?b:u)})
same => n,Hangup()
Una diferencia a notar entre GoSub() y Macro(), es que si nosotros dejamos nuestra subrutina como
esta, nunca retornaremos. En este ejemplo particular no hay problema, ya que después que se deja el
correo de voz, esperaríamos que la persona que llama cuelgue de todos modos. En situaciones en las
que queremos hacer más después que la subrutina se ha ejecutado, tenemos que implementar la
aplicación Return().
Retornando desde una Subrutina
A diferencia de Macro(), la aplicación del dialplan GoSub() no retorna automáticamente una vez que se
realiza la ejecución. Para regresar de donde vinimos, tenemos que utilizar la aplicación Return(). Ahora
que sabemos cómo llamar una subrutina y pasar argumentos, podemos ver un ejemplo en el que
podríamos necesitar retornar desde la subrutina.
Usando nuestro ejemplo anterior, podríamos dividir la porción de marcación y la parte de correo de voz
en subrutinas separadas:
[subMarcador]
exten => start,1,NoOp()
same => n,Dial(${ARG1},${ARG2})
same => n,Return()
[subCorreodevoz]
exten => start,1,NoOp()
same => n,VoiceMail(${ARG1}@${ARG2},${ARG3})
same => n,Hangup()
El contexto [subMarcador] creado aquí toma dos argumento: ${ARG1}, el cual contiene el destino a
marcar; y {ARG2}, el cual contiene el ciclo de timbrado, definido en segundos. Finalizamos el contexto
[subMarcador] con la aplicación del dialplan Return(), la cual retornara a la prioridad que sigue a la
llamada GoSub() (la siguiente línea del dialplan).
El contexto [subCorreodevoz] contiene la aplicación VoiceMail(), la cual está usando tres argumentos
que son pasados a esta: ${ARG1} contiene los números de buzón, ${ARG2} contiene el contexto de
correo de voz, y ${ARG3} contiene un valor que indica cual mensaje de correo de voz (no disponible u
ocupado) reproduce a la persona que llama.
La llamada a estas subrutinas podría tener este aspecto:
exten => 101,1,NoOp()
same => n,GoSub(subMarcador,start,1(${LIAN},30))
same => n,GoSub(subCorreodevoz,start,1(${EXTEN},default t,u))
Aquí hemos utilizado la subrutina subMarcador, que intenta llamar a ${LIAN}, timbra durante 30
segundos. Si la aplicación Dial() retorna (por ejemplo, si la línea está ocupada o no hay respuesta
durante 30 segundos), Retornamos de la subrutina y se ejecuta la siguiente línea de nuestro plan de
marcado, que llama a la subrutina subCorreodevoz. A partir de ahí, le pasamos la extensión que fue
marcada (por ejemplo, 101) como el número de buzón, y le pasamos los valores por defecto para el
contexto de buzón de voz y la letra u para reproducir el mensaje de no está disponible.
Nuestro ejemplo ha sido codificado para reproducir el mensaje de correo de voz de no está disponible,
pero podemos modificar la aplicación Return() para retornar el valor de ${DIALSTATUS} para que
podamos reproducir el mensaje de ocupado si su valor es ocupado. Para hacer esto, usaremos la
variable de canal ${GOSUB_RETREVAL}, la cual se establece cada vez que pasamos un valor a la
aplicación Return():
[subMarcador]
exten => start,1,NoOp()
same => n,Dial(${ARG1},${ARG2})
same => n,Return(${DIALSTATUS})
[subCorreodevoz]
exten => start,1,NoOp()
same => n,VoiceMail(${ARG1}@${ARG2},${ARG3})
same => n,Hangup()
En esta versión hemos hecho sólo un cambio: Return() para Return(${DIALSTATUS}).
Ahora podemos modificar la extensión 101 para que use la variable de canal ${GOSUB_RETVAL}, que
será fijada para Return():
exten => 101,1,NoOp()
same => n,GoSub(subMarcador,start,1(${LIAN},30))
same => n,Set(VoicemailMessage=${IF($[${GOSUB_RETVAL} = BUSY]?b:u)})
same => n,GoSub(subVoicemail,start,1(${EXTEN},default,${VoicemailMessage}))
Nuestro plan de marcado ahora tiene una nueva línea que le establece a la variable de canal
${VoicemailMessage} un valor de u o b, utilizando la función del dialplan IF() y el valor de
${GOSUB_RETVAL}. A continuación, pasamos el valor de ${VoicemailMessage} como el tercer argumento
a nuestra subrutina subCorreodevoz.
Antes de seguir adelante, es posible que desee volver atrás y revisar "Macros" en la página 213 y
"GoSub" en la página 217. Le hemos dado mucho para digerir aquí, pero estos conceptos le ahorraran
un montón de trabajo a medida que comience a construir sus dialplan.
Canales Locales
Los canales locales son un método de ejecución de otras áreas del plan de marcado desde la aplicación
Dial() (en lugar de enviar la llamada a un canal). Pueden parecer un concepto un poco extraño la
primera vez que empieza a usarlo, pero créanos cuando decimos que son una característica gloriosa y
muy útil que es casi seguro que desee hacer uso de ellos cuando empieces a escribir dialplan avanzados.
La mejor manera para ilustrar el uso de los canales locales es a través de un ejemplo. Supongamos que
tenemos una situación en la que tenemos que llamar a varias personas, pero tenemos que proporcionar
tiempos de retrasos de diferente duración antes de marcar cada uno de los miembros. El uso de canales
locales es la única solución para el problema.
Con la aplicación Dial(), sin duda puede llamar a múltiples dispositivos finales, pero todos los canales
timbrarían al mismo tiempo, y por la misma cantidad de tiempo. Marcar a múltiples canales al mismo
tiempo se hace de este modo:
[Local]
exten => 107,1,NoOp()
same => n,Verbose(2,Marcando múltiples localizaciones simultáneamente)
same => n,Dial(SIP/0000FFFF0001&DAHDI/g0/18294442121&SIP/MiITSP/18094442121,30)
same => n,Hangup()
Este ejemplo marca a tres destinos por un periodo de 30 segundos. Si ninguna de estas localizaciones
contestan la llamada en 30 segundos, el plan de marcado continúa en la línea siguiente y la llama es
terminada.
Sin embargo, digamos que queremos introducir algunos retrasos, y hacer que las localidades dejen de
timbrar en diferentes momentos. Usando canales locales nos da un control independiente sobre cada
uno de los canales que queremos marcar, por lo que podemos introducir retrasos y controlar el período
de tiempo durante el cual cada uno de los canales timbrara de forma independiente. Vamos a
mostrarles cómo se hace esto en el dialplan, tanto dentro de una tabla que muestra los retrasos
visualmente, y todos juntos en una caja, como lo hemos hecho para otra porción del plan de marcado.
Construiremos el plan de marcado para que coincida con el tiempo de inicio y paradas que se describen
en la Figura siguiente.
Figura: Marcación temporizada con canales locales
Primero necesitamos llamar a tres canales locales, que serán todos ejecutado desde diferentes partes
del plan de marcado. Esto lo hacemos con la aplicación Dial(), así:
[Local]
exten => 107,1,Verbose(2,Marcando múltiple localizaciones con tiempo de retraso)
; *** Todo esto tiene que estar en una sola línea
same => n,Dial(Local/canal_1@TimeDelay&Local/canal_2@TimeDelay&Local/canal_3@TimeDelay,40)
same => n,Hangup()
Ahora nuestra aplicación Dial() marcará tres canales locales. Los destinos serán las extensiones canal_1,
canal_2, y canal_3 localizada dentro del contexto del dialplan TimeDelay. Recuerde que los canales
locales son una forma de ejecutar el plan de marcado desde la aplicación Dial(). Nuestro tiempo de
espera general para todos los canales es de 40 segundos, lo que significa que cualquier canal local que
no tiene un tiempo de espera más corto configurado se colgará si no se contesta la llamada dentro de
ese período de tiempo.
Según lo prometido, la tabla a continuación ilustra las configuraciones de retardo.
PERIODO DE TIEMPO
(EN SEGUNDO)
CANAL_1
CANAL_2
CANAL_3
0
Dial(SIP/
0000FFFF0001,20)
Wait(10)
Wait(15)
5
10
Dial(DAHDI/
g0/18294442121)
15
20
25
30
35
40
Dial(SIP/MiITSP/
18094442121,15
Hangup()
Hangup()
Tabla. Retraso en la marcación usando canales locales
En esta tabla, podemos ver que canal_1 empezó a marcar la ubicación SIP/0000FFFF0001
inmediatamente y esperó por un período de 20 segundos. Después de 20 segundos, el canal local colgó.
Nuestro canal_2 esperó durante 10 segundos antes de marcar el punto final DAHDI/g0/18294442121.
No había tiempo máximo asociado a este Dial(), por lo que su período de marcación terminó cuando el
tiempo de espera general de 40 segundos (el cual nosotros establecimos cuando inicialmente llamados
los canales locales) expiro. Por último, canal_3 esperó 15 segundos antes de marcar, entonces marco
SIP/MiITSP/18094442121 y esperó por un período de 15 segundos antes de colgar.
Si ponemos todo esto junto, obtendremos el siguiente plan de marcado:
[Local]
exten => 107,1,Verbose(2, Marcando múltiples localizaciones con retardo de tiempo)
; *** Todo esto tiene que estar en una sola línea
same=>
n,Dial(Local/canal_1@TimeDelay&Local/canal_2@TimeDelay&Local/canal_3@TimeDelay,40)
same => n,Hangup()
[TimeDelay]
exten => channel_1,1,Verbose(2, Marcando el primer canal)
same => n,Dial(SIP/0000FFFF0001,20)
same => n,Hangup()
exten => channel_2,1,Verbose(2, Marcando el segundo canal con un retraso)
same => n,Wait(10)
same => n,Dial(DAHDI/g0/18294442121)
exten => channel_3,1,Verbose(2, Marcando el tercer canal con un retraso)
same => n,Wait(15)
same => n,Dial(SIP/MiITSP/18094442121,15)
same => n,Hangup()
Usted verá los canales locales usados a través de este libro, para varios propósitos. Los canales locales
permiten ejecutar lógica del dialplan desde aplicaciones que normalmente esperan para conectarse
directamente a un canal. Por ejemplo, puede asignar un canal local como miembro de una cola, y
ejecutar todo tipo de lógica del dialplan siempre que la cola intente enviar una llamada a un agente.
Vamos a discutir algunos de esto en "Uso de los canales locales".
Adicionalmente escenarios e información acerca de los canales locales y los marcadores de modificación
(/n, /j, /m, /b) están disponibles en el wiki Asterisk. Si usted va a hacer cualquier tipo de uso regular de
los canales locales, este es un documento muy importante para leer.
Usando Asterisk Database (AstDB)
¿Divirtiéndose todavía? Se pone aún mejor!
Asterisk provee un poderoso mecanismo para almacenar valores llamado Asterisk Database (AstDB). El
AstDB provee una manera simple para almacenar data para usar dentro de su dialplan.
Para los que tienen experiencia en el uso de bases de datos relacionales como PostgreSQL o MySQL,
Asterisk database no es una base de datos relacional tradicional; es una base de datos SQLitebackend usando pares clave/valor. Hay varias maneras de almacenar datos de Asterisk en una base
de datos relacional.
Inicialmente (y por muchos años), AstDB utilizo una base de datos Berkeley (que, en lo que se refiere
a los comandos del dialplan, funciones, y CLI, trabaja de la misma manera que la nueva base de datos
SQLite). En otras palabras, este cambio debe ser casi transparente para usted.
La base de datos Asterisk almacena sus datos en agrupaciones denominadas familias, con valores
identificados por claves. Dentro de una familia, una clave sólo puede utilizarse una vez. Por ejemplo, si
tuviéramos una familia llamada prueba, podríamos almacenar sólo un valor con una clave llamada
cuenta. Cada valor almacenado debe estar asociado a una familia.
Almacenando datos en AstDB
Para almacenar un nuevo valor en la base de datos de Asterisk, se utiliza la aplicación Set(), pero en vez
de usarlo para establecer una variable de canal, lo utilizamos para establecer una variable de AstDB. Por
ejemplo, para asignar la clave cuenta en la familia prueba con el valor de 1, escribiríamos lo siguiente:
exten => 456,1,NoOp()
same => n,Set(DB(prueba/cuenta)=1)
Si una clave denominada cuenta ya existe en la familia prueba, su valor se sobrescribe con el nuevo
valor. También puede almacenar los valores desde la línea de comando de Asterisk, mediante la
ejecución del comando database put <familia> <clave> <valor>. Para nuestro ejemplo, debería escribir
database put prueba cuenta 1.
Recuperando datos desde AstDB
Para recuperar un valor de la base de datos de Asterisk y asignarlo a una variable, de nuevo utilizamos la
aplicación Set().Vamos a recuperar el valor cuenta (una vez más, desde la familia prueba), asignarlo a
una variable llamada CUENTA, y luego decirle el valor a la persona que llama:
exten => 456,1,NoOp()
same => n,Set(DB(prueba/cuenta)=1)
same => n,Set(CUENTA=${DB(prueba/cuenta)})
same => n,Answer()
same => n,SayNumber(${CUENTA})
También puede comprobar el valor de una clave dada desde la línea de comando de Asterisk ejecutando
el comando database get <familia> <key>. Para ver todo el contenido de AstDB, use el comando
database show.
Borrando datos desde AstDB
Hay dos maneras para borrar datos desde la base de datos de Asterisk. Para borrar una clave, puede
usar la aplicación DB_DELETE(). Esta toma la ruta a la clave como sus argumentos, así:
; Borra la clave y devuelve su valor en un solo paso
exten => 457,1,Verbose(0, El valor era ${DB_DELETE(prueba/cuenta)})
También puede eliminar una familia entera de claves utilizando la aplicación DBdeltree(). La aplicación
DBdeltree() toma un único argumento: el nombre de la familia de clave que desea eliminar. Para borrar
la familia prueba entera, haga lo siguiente:
exten => 457,1,DBdeltree(prueba)
Las versiones anteriores de Asterisk tenían aplicaciones llamadas DBPut() y DBGet() que se utilizan
para establecer los valores y recuperar valores de AstDB. Si está utilizando una versión antigua de
Asterisk, usted querrá usar estas aplicaciones en su lugar.
Para borrar claves y familias de clave desde AstDB vía la interface de línea de comando, use los
comandos database del <clave> y database deltree <familia>, respectivamente.
Usando AstDB en el Dialplan
Hay un número infinito de maneras de utilizar la base de datos de Asterisk en un plan de marcado. Para
introducir el AstDB, vamos a ver dos ejemplos sencillos. El primero es un ejemplo simple de conteo para
mostrar que la base de datos de Asterisk es persistente (es decir, que sobrevive el reinicio del sistema).
En el segundo ejemplo, vamos a utilizar la función BLACKLIST() para evaluar si un número está o no en la
lista negra y debe ser bloqueado.
Para empezar el ejemplo de conteo, primero vamos a recuperar un número (el valor de la clave cuenta)
de la base de datos y asignarlo a una variable llamada CUENTA. Si no existe la clave, DB() devolverá NULL
(sin valor). Por lo tanto, podemos usar la función ISNULL() para verificar si un valor fue o no retornado.
Si no hay valor retornado, inicializamos AstDB con la aplicación Set(), donde establecemos el valor de la
base de datos a 1. La siguiente prioridad nos enviará de vuelta a la prioridad 1. Esto ocurrirá la primera
vez que marcamos esta extensión:
exten => 678,1,NoOp()
same => n,Set(CUENTA=${DB(prueba/cuenta)})
same => n,GotoIf($[${ISNULL(${CUENTA})}]?:continua)
same => n,Set(DB(prueba/cuenta)=1)
same => n,Goto(1)
same => n(continua),NoOp()
A continuación, decimos el valor actual de la variable CUENTA, y luego incrementamos la variable
CUENTA:
exten => 678,1,NoOp()
same => n,Set(CUENTA=${DB(prueba/cuenta)})
same => n,GotoIf($[${ISNULL(${CUENTA})}]?:continua)
same => n,Set(DB(prueba/cuenta)=1)
same => n,Goto(1)
same => n(continua),NoOp()
same => n,Playback(silence/1)
same => n,SayNumber(${CUENTA})
same => n,Set(CUENTA=$[${CUENTA} + 1])
Ahora que hemos incrementado CUENTA, vamos a poner el nuevo valor en la base de datos. Recuerde
que almacenar un valor para una clave existente se sobrescribe el valor anterior:
exten => 678,1,NoOp()
same => n,Set(COUNT=${DB(prueba/cuenta)})
same => n,GotoIf($[${ISNULL(${CUENTA})}]?:continua)
same => n,Set(DB(prueba/cuenta)=1)
same => n,Goto(1)
same => n(continua),NoOp()
same => n,Playback(silence/1)
same => n,SayNumber(${CUENTA})
same => n,Set(CUENTA=$[${CUENTA} + 1])
same => n,Set(DB(prueba/cuenta)=${CUENTA})
Por último, vamos a realizar un bucle a la primera prioridad. De esta manera, la aplicación continuará
contando:
exten => 678,1,NoOp()
same => n,Set(COUNT=${DB(prueba/cuenta)})
same => n,GotoIf($[${ISNULL(${CUENTA})}]?:continua)
same => n,Set(DB(prueba/cuenta)=1)
same => n,Goto(1)
same => n(continua),NoOp()
same => n,Playback(silence/1)
same => n,SayNumber(${CUENTA})
same => n,Set(CUENTA=$[${CUENTA} + 1])
same => n,Set(DB(prueba/cuenta)=${CUENTA})
same => n,Goto(1)
Siga adelante y pruebe este ejemplo. Escuche el conteo por un momento, y luego cuelgue. Al marcar de
nuevo esta extensión, debería seguir contando desde donde lo dejó. El valor almacenado en la base de
datos será persistente, incluso a través de un reinicio de Asterisk.
En el siguiente ejemplo, vamos a crear la lógica del dialplan alrededor de la función BLACKLIST(), que
comprueba si existe o no el número de identificación de llamada actual en la lista negra. (La lista negra
es simplemente una familia llamada lista negra en AstDB.) Si BLACKLIST() encuentra el número en la lista
negra, este devuelve el valor 1, de lo contrario, devolverá 0. Podemos usar estos valores en combinación
con GotoIf() para controlar si la llamada ejecutará la aplicación Dial():
exten => 124,1,NoOp()
same => n,GotoIf($[${BLACKLIST()}]?bloqueado,1)
same => n,Dial(${LIAN})
exten => bloqueado,1,NoOp()
same => n,Playback(silence/1)
same => n,Playback(privacy-you-are-blacklisted)
same => n,Playback(vm-goodbye)
same => n,Hangup()
Para agregar un número a la lista negra, ejecute el comando database put blacklist <número> 1 desde
la interfaz de línea de comando de Asterisk.
Crear una aplicación de Hot-Desking con AstDB
Con la base de datos de Asterisk integrada, usted puede construir todo tipo de aplicaciones sin la
necesidad de interactuar con nada externo. En el siguiente ejemplo, hemos combinado todos los
conocimientos que hemos discutido en este capítulo en un único conjunto de extensiones que usted
puede incluir en su contexto Local.
Hot-desking es una característica bastante común que está tomando una mayor tracción, a medida que
los sistemas Asterisk se implementan debido a la flexibilidad inherente que el dialplan ofrece. Los viejos,
sistemas PBX tradicionales, aplican un número de extensión ya sea una línea sobre sistema o dispositivo.
Con Asterisk, tenemos la capacidad de aplicar lógica del dialplan y almacenar la información en una base
de datos local (o base de datos externa) para determinar donde timbra una extensión. Podríamos
desarrollar fácilmente un sistema en el que un número de extensión no hace más que llamar a un
teléfono celular, o una combinación de dispositivos (como en un sistema de paginación, o un grupo de
agentes de ventas).
En el dialplan proporcionado para este ejemplo de hot-desking, hemos permitido que las personas se
conecten en cualquier dispositivo marcando 71XX donde 1XX es el número de extensión de la persona
en el rango de 100 a 199. Para desconectar una extensión de un dispositivo, el usuario simplemente
marca 7000 desde el dispositivo. Mientras que esto hace el plan de marcado y la lógica más complicado,
el dialplan también tiene en cuenta otras extensiones ya conectados en un dispositivo que alguien
quiere ingresar, y automáticamente les cierra la primera sección. Además, si nos hemos registrado a
otro dispositivo previamente y no cerraremos la sesión antes de cambiar las ubicaciones, el dialplan
cerrara la sección de la extensión del otro dispositivo antes de iniciar sesión en la nueva ubicación.
Tenga en cuenta que no hemos añadido ninguna lógica para autenticar a los usuarios que llaman.
Además, no hemos añadido ningún mensaje notificando a las personas que llaman que una
extensión existente está conectada antes de que el registro se lleve a cabo, ya que queríamos
mantener la lógica fundamental de la aplicación de hot-desking para que tenga una base para
trabajar.
Con el fin de entender la lógica dialplan que le proveemos, es útil ver la ruta del flujo de las llamadas.
Como se muestra en la figura a continuación.
Figura. Flujo de llamadas para aplicación hot-desking
Es posible que si dos personas intentan iniciar una sesión en la misma extensión, al mismo tiempo, o
si alguien más se está registrando en un dispositivo que estaba previamente en uso por una
extensión en una ubicación en movimiento (e intenta iniciar sesión al mismo tiempo que la otra
persona) la base de datos podría perder la sincronización. Ningún bloqueo se ha realizado aquí para
mantener la lógica tan limpia y simple como sea posible. Si existe una fuerte posibilidad de que la
gente cambien de lugar y entren o salgan muy a menudo, entonces es posible que desee ver como
agregar bloqueo en el dialplan, lo cual puede hacerse utilizando las funciones del dialplan LOCK() y
UNLOCK().
[HotDesking]
; Control de rango de extensión utilizando patrón de coincidencia
; Ingresar con 71XX finalizará la sección de la extensión existente en esta localización
; y registrará este dispositivo con una nueva extensión.
; finalizar sección marcando 7000 desde cualquier dispositivo.
;
exten => 7000,1,Verbose(2,Intentando cerrar sección desde el dispositivo ${CHANNEL(peername)})
same => n,Set(PeerName=${CHANNEL(peername)})
same => n,Set(CurrentExtension=${DB(HotDesk/${PeerName})})
same => n,GoSubIf($[${EXISTS(${CurrentExtension})}]?
subDeviceLogoff,1(${PeerName},${CurrentExtension}):loggedoff)
same => n,GotoIf($[${GOSUB_RETVAL} = 0]?loggedoff)
same => n,Playback(an-error-has-occurred)
same => n,Hangup()
same => n(loggedoff),Playback(silence/1&agent-loggedoff)
same => n,Hangup()
exten => _71XX,1,Verbose(2,Intentando registrar dispositivo ${CHANNEL(peername)}
para la extensión ${EXTEN:1})
same => n,Set(NewPeerName=${CHANNEL(peername)})
same => n,Set(NewExtension=${EXTEN:1})
; Verifica si la extensión existente esta registra en este dispositivo (NewPeerName)
; -- Si una extensión existente existe (ExistingExtension)
; -- Obtener el nombre del dispositivo existente
; -- Si no existe dispositivo
; -- (login) como vamos a sobrescribir la extensión existente para este dispositivo
; -- Si el nombre de dispositivo existe
; -- logoff ExistingExtension + ExistingDevice
; -- Goto verificar_dispositivo ---------------------------------------+
; -- Si no existe una extensión existente |
; -- Compruebe si el dispositivo existente está registrado en esta extensión |
; (NewExtension) <-----------------------------------------------+
; -- Si existe dispositivo existente
; -- Obtener extensión existente
; -- Si existe extensión
; -- Finalizar sección Dispositivo + Extensión
; -- Login
; -- Si no existe una extensión
; -- Remover dispositivo desde AstDB
; -- Login
; -- Si no existe un dispositivo para NewExtension
; -- Login
; Prueba:
; * Login 100 to 0000FFFF0001
; * Login 101 to 0000FFFF0001 (Result: Only 101 logged in)
; * Login 101 to 0000FFFF0002 (Result: Only 101 logged in to new location)
; * Login 100 to 0000FFFF0001 (Result: Both 100 and 101 logged in)
; * Login 100 to 0000FFFF0002 (Result: Only 100 logged into 0000FFFF0002
; -- change locations)
; * Login 100 to 0000FFFF0001 (Result: Only 100 logged in)
same => n,Set(ExistingExtension=${DB(HotDesk/${NewPeerName})})
same => n,GotoIf($[${EXISTS(${ExistingExtension})}]?get_existing_device)
same => n(check_device),NoOp()
same => n,Set(ExistingDevice=${DB(HotDesk/${NewExtension})})
same => n,GotoIf($[${EXISTS(${ExistingDevice})}]?get_existing_extension)
same => n,NoOp(Nothing to logout)
same => n,Goto(login)
same => n(get_existing_device),NoOp()
same => n,Set(ExistingDevice=${DB(HotDesk/${ExistingExtension})})
same => n,GotoIf($[${ISNULL(${ExistingDevice})}]?login)
same => n,GoSub(subDeviceLogoff,1(${ExistingDevice},${ExistingExtension}))
same => n,GotoIf($[${GOSUB_RETVAL} = 0]?check_device)
same => n,Playback(silence/1&an-error-has-occurred)
same => n,Hangup()
same => n(get_existing_extension),NoOp()
same => n,Set(ExistingExtension=${DB(HotDesk/${ExistingDevice})})
same => n,GoSubIf($[${EXISTS(${ExistingExtension})}]?
subDeviceLogoff,1(${ExistingDevice},${ExistingExtension}):remove_device)
same => n,GotoIf($[${GOSUB_RETVAL} = 0]?loggedoff)
same => n,Playback(silence/1&an-error-has-occurred)
same => n,Hangup()
same => n(remove_device),NoOp()
same => n,Set(Result=${DB_DELETE(HotDesk/${ExistingDevice})})
same => n,Goto(loggedoff)
same => n(loggedoff),Verbose(2,Existing device and extensions have
been logged off prior to login)
same => n(login),Verbose(2,Now logging in extension ${NewExtension}
to device ${NewPeerName})
same => n,GoSub(subDeviceLogin,1(${NewPeerName},${NewExtension}))
same => n,GotoIf($[${GOSUB_RETVAL} = 0]?login_ok)
same => n,Playback(silence/1&an-error-has-occurred)
same => n,Hangup()
same => n(login_ok),Playback(silence/1&agent-loginok)
same => n,Hangup()
exten => subDeviceLogoff,1,NoOp()
same => n,Set(LOCAL(PeerName)=${ARG1})
same => n,Set(LOCAL(Extension)=${ARG2})
same => n,ExecIf($[${ISNULL(${LOCAL(PeerName)})} |
${ISNULL(${LOCAL(Extension)})}]?Return(-1))
same => n,Set(PeerNameResult=${DB_DELETE(HotDesk/${LOCAL(PeerName)})})
same => n,Set(ExtensionResult=${DB_DELETE(HotDesk/${LOCAL(Extension)})})
same => n,Return(0)
exten => subDeviceLogin,1,NoOp()
same => n,Set(LOCAL(PeerName)=${ARG1})
same => n,Set(LOCAL(Extension)=${ARG2})
same => n,ExecIf($[${ISNULL(${LOCAL(PeerName)})} |
${ISNULL(${LOCAL(Extension)})}]?Return(-1))
same => n,Set(DB(HotDesk/${LOCAL(PeerName)})=${LOCAL(Extension)})
same => n,Set(DB(HotDesk/${LOCAL(Extension)})=${LOCAL(PeerName)})
same => n,Set(ReturnResult=${IF($[${DB_EXISTS(HotDesk/${LOCAL(PeerName)})}
& ${DB_EXISTS(HotDesk/${LOCAL(Extension)})}]?0:-1)})
same => n,Return(${ReturnResult})
Características útiles de Asterisk
Ahora que hemos repasado un poco más de lo básico, echemos un vistazo a algunas funciones
populares que se han incorporado en Asterisk.
Zapateller()
Zapateller() es una aplicación simple de Asterisk que reproduce un tono especial de información al inicio
de una llamada, lo que provoca que los marcadores automáticos (generalmente utilizados por los
vendedores por teléfono) piensen que la línea ha sido desconectada. No sólo van a colgar, pero su
sistema marcará su número como fuera de servicio, lo que podría ayudarle a evitar todo tipo de
llamadas de telemercadeo. Para utilizar esta funcionalidad dentro de su plan de marcado, simplemente
llame la aplicación Zapateller().
También utilizaremos la opción nocallerid opcional para que el tono se reproduzca sólo cuando no hay
ninguna información de identificación de llamada en la llamada entrante. Por ejemplo, podría utilizar
Zapateller() en la extensión de s de su contexto [entrante], así:
[entrante]
exten => s,1,NoOp()
same => n,Zapateller(nocallerid)
same => n,Playback(enter-ext-of-person)
Parqueo de llamadas
Otra característica muy útil es llamada aparcamiento de llamadas (call parking). El aparcamiento de
llamadas le permite colocar una llamada en espera en un "estacionamiento", por lo que puede tomar
otras llamadas que ha puesto en espera desde otra extensión. Los parámetros para el aparcamiento de
llamadas (como las extensiones a utilizar, el número de espacios, y así sucesivamente) se controlan en el
archivo de configuración features.conf. La sección [general] del archivo features.conf contiene cuatro
ajustes relacionados con el parqueo de llamadas:
Parkext
Esta es la extensión de estacionamiento. Transfiera una llamada a esta extensión, y el sistema le
dirá en qué posición de estacionamiento la llamada esta. Por defecto, la extensión de estacionamiento
es la 700.
Parkpos
Esta opción define el número de espacio de aparcamiento. Por ejemplo, si se establece en 701720 crea 20 espacio de estacionamiento, numerados 701 a través de 720.
context
Este es el nombre del contexto de aparcamiento. Para poder aparcar llamadas, debe incluir este
contexto.
parkingtime
Si se establece, esta opción controla el tiempo (en segundos) que una llamada puede
permanecer en el estacionamiento. Si la llamada no es recogida dentro del tiempo especificado, la
extensión que aparcó la llamada se volverá a llamar.
También tenga en cuenta que debido a que el usuario debe ser capaz de transferir las llamadas a la
extensión de estacionamiento, usted debe asegurarse de que está utilizando la opciones t y/o T en la
aplicación Dial().
Por lo tanto, vamos a crear un plan de marcado simple para mostrar el aparcamiento de llamadas:
[entrante]
include => parqueollamada
exten => 103,1,Dial(SIP/María,,tT)
exten => 104,1,Dial(SIP/Juan,,tT)
Para ilustrar cómo el aparcamiento de llamadas trabaja, digamos que Alice llama dentro del sistema y
marca la extensión 103 para alcanzar a María. Después de un momento, María transfiere la llamada a la
extensión 700, que le dice que la llamada de Alice esta estacionada en la posición 701. Entonces María
marca a Juan en la extensión 104, y le dice que Alice está en la extensión 701. Juan marca la extensión
701 y comienza a hablar con Alice. Esta es una manera simple y eficaz para permitir que las personas
que llaman sean transferidas entre usuarios.
El aparcamiento de llamadas se utiliza a menudo en combinación con las interfaces de paginación.
Una recepcionista puede atender las llamadas de los maquinistas en la parte trasera de una tienda,
donde comparten un solo teléfono. La llamada es aparcada, y la recepcionista, a continuación, utiliza
el paging de la parte trasera de la tienda, para anunciar para quien es la llamada, y que espacio de
aparcamiento tiene que marcar para recuperar la llamada.
También puede ser útil cuando usted toma una llamada y tiene que cambiar de ubicación en el
edificio. Se puede aparcar la llamada, luego recuperarla en otro lugar en la oficina sin tener que
correr de nuevo a su ubicación inicial para hablar con la persona.
Conferencia con MeetMe()
Por último, pero no menos importante, vamos a cubrir la configuración de un puente de conferencia de
audio con la aplicación MeetMe(). Esta aplicación permite a múltiples personas que llaman conversar
juntos, como si todos estuvieran en la misma ubicación física. Algunas de las características principales
incluyen:
•
La capacidad de crear conferencias protegidas por contraseña
•
Administración de conferencias (silenciar conferencia, bloqueo conferencia, o dar inicio a los
participantes)
•
La opción de silenciar todos menos uno de los participantes (útil para los anuncios de la
empresa, emisiones, etc.)
•
Creación conferencia estática o dinámica
Usted debe tener res_timing_dahdi seleccionado en menuselect para poder compilar app_meetme.
Esto significa que debe tener ya instalado DAHDI, incluso sin hardware de telefonía, como MeetMe()
utiliza componentes de DAHDI para realizar la mezcla de audio. Si usted no puede utilizar
res_timing_dahdi en su sistema, entonces usted debe buscar en ConfBridge(), que puede utilizar
diferentes fuentes de temporización.
Vamos a ir a través de la creación de una sala de conferencia básica. Las opciones de configuración para
el sistema de conferencia MeetMe se encuentran en meetme.conf. Dentro del archivo de configuración,
se definen las salas de conferencias y contraseñas numéricas opcionales. (Si se define una contraseña
aquí, será requerida para entrar en todas las conferencias usando esa sala.) Para nuestro ejemplo,
vamos a configurar una sala de conferencias con la extensión 600. En primer lugar, vamos a configurar la
sala de conferencias en meetme.conf. La llamaremos 600, y no vamos a asignar una contraseña en este
momento:
[salas]
conf => 600
Ahora que el archivo de configuración está completo, necesitamos reiniciar Asterisk para que pueda
volver a leer el archivo meetme.conf. A continuación, vamos a añadir soporte para la sala de
conferencias en nuestro plan de marcado con la aplicación MeetMe(). MeetMe() toma tres argumentos:
el nombre de la sala de conferencias (como se define en meetme.conf), un conjunto de opciones, y la
contraseña que el usuario debe ingresar al unirse a esta conferencia. Vamos a crear una conferencia
sencilla utilizando sala 600, la opción i (que anuncia cuando las personas entran y salen de la
conferencia), y una contraseña de 65432:
exten => 600,1,MeetMe(600,i,65432)
Eso es todo lo que hay que hacer! Cuando las personas entran la extensión 600, se le solicitará la
contraseña. Si bien entran 65432, serán añadidos a la conferencia. Puede ejecutar el comando core
show application MeetMe desde el Asterisk CLI para ver la lista de todas las opciones soportada por la
aplicación la MeetMe().
Otra aplicación útil es MeetMeCount(). Como su nombre indica, esta aplicación cuenta el número de
usuarios en una sala de conferencias particular. Esta toma dos argumentos: la sala de conferencia en la
cual cuenta el número de participantes, y, opcionalmente, un nombre de variable para asignarle el
conteo. Si el nombre de variable no se pasa como segundo argumento, el conteo se lee a la persona que
llama:
exten => 601,1,NoOp()
same => n,Playback(conf-thereare)
same => n,MeetMeCount(600)
same => n,Playback(conf-peopleinconf)
Si pasa una variable como el segundo argumento de MeetMeCount(), el conteo se asigna a la variable, y
la reproducción del conteo se omite. Usted puede usar esto para limitar el número de participantes, así:
; Limitar la sala de conferencias para 10 participantes
exten => 600,1,NoOp()
same => n,MeetMeCount(600,CONFCOUNT)
same => n,GotoIf($[${CONFCOUNT} <= 10]?meetme:conf_full,1)
same => n(meetme),MeetMe(600,i,54321)
exten => conf_full,1,Playback(conf-full)
Conferencias con ConfBridge()
La aplicación ConfBridge() es el nuevo picor. Se trata esencialmente de un reemplazo para la aplicación
MeetMe() para Asterisk 10 en adelante.
Asterisk 1.8 también contenía ConfBridge(), pero su conjunto de características es mucho más
reducida de la que están disponible en Asterisk 10 y posteriores.
ConfBridge() fue introducido usando los nuevo módulos de puente que permiten fuentes de
temporización alternativas para ser utilizados para mezclar en lugar de sólo limitarse a
res_timing_dahdi, como MeetMe(). Además, se han añadido varias características nuevas para
ConfBridge() que no están disponibles en MeetMe(), tales como:
•
•
•
•
Alta definición de audio que se puede mezclar con frecuencias de muestreo entre 8 kHz a 96 kHz
Las capacidades de vídeo, incluyendo la adición de cambiar dinámicamente señales de video
basado en que habla más fuerte
Sistema de menú dinámicamente controlado tanto para los administradores de conferencia y
usuarios
Opciones adicionales disponibles en el archivo de configuración confbridge.conf
Vamos a empezar con una configuración básica para obtener el puente de conferencia. ConfBridge() se
configura a través del confbridge.conf, que contiene muchas opciones, incluyendo funciones avanzadas
para los usuarios y los puentes. Vamos a comenzar con una configuración muy básica que utiliza los
valores predeterminados. En primer lugar, vamos a crear las secciones default_user y default_bridge en
confbridge.conf:
$ cat >> confbridge.conf
[general]
[default_user]
type=user
[default_bridge]
type=bridge
Ctrl+D
Después de construir el archivo confbridge.conf, necesitamos cargar el módulo app_confbridge.so. Esto
se puede hacer en la consola de Asterisk:
$ asterisk -rx "module load app_confbridge.so"
Con el módulo cargado, podemos construir un sencillo plan de marcado para acceder a nuestro puente
de conferencia:
[SalaConferencia]
exten => 602,1,NoOp()
same => n,ConfBridge(${EXTEN})
[Local]
include => SalaConferencia
También podríamos haber definido los perfiles de usuario y puentes específicamente en la aplicación
ConfBridge().Por defecto, la aplicación del dialplan ConfBridge() utilizará los perfiles default_user y
default_bridge, así que no los hemos definido en nuestro ejemplo, pero el equivalente luciría así:
same => n,ConfBridge(${EXTEN},default_bridge,default_user)
Por supuesto, ahora tenemos que recargar nuestro plan de marcado:
$ asterisk -r
*CLI> dialplan reload
Si ahora marca la extensión 602 desde su teléfono, usted debe entrar en la conferencia:
== Using SIP RTP CoS mark 5
-- Executing [602@LocalSets:1] NoOp("SIP/0000FFFF0001-00000001", "") in new
stack
-- Executing [602@LocalSets:2] ConfBridge("SIP/0000FFFF0001-00000001", "602")
in new stack
-- <SIP/0000FFFF0001-00000001> Playing 'conf-onlyperson.gsm' (language 'en')
-- <SIP/0000FFFF0001-00000001> Playing 'confbridge-join.gsm' (language 'en')
Esta es sólo la punta del iceberg. Tenemos la configuración básica hecha, pero hay mucha más
funcionalidad para ser configurada.
Capı́tulo 13
Operadora Automática (Auto Attendant)
En muchas PBXs es común tener un sistema de menú en lugar de responder las llamadas entrantes de
forma automática, y permitirles a las personas que llamen dirigirse ellos mismo a las varias extensiones y
recursos en el sistema a través de opciones de menú. Esto se conoce en la industria de las
telecomunicaciones como una operadora automática (AA por su sigla en inglés). Una operadora
automática normalmente ofrece las siguientes características:
•
Transferencia a extensión
•
Transferir al buzón de voz
•
Transferir a una cola
•
Reproducción de mensajes (por ejemplo, "nuestra dirección es ...")
•
Conectarse a un submenú (ejemplo, "para obtener un listado de nuestros departamentos...")
•
Conectarse a la recepción
•
Opciones de repetición
Para cualquier otra cosa, sobre todo si una integración externa es requerida, tal como búsqueda en una
base de datos normalmente se necesitaría de un IVR (Respuesta de Voz Interactiva.)
Una operadora automática no es un IVR
En la comunidad de telecomunicaciones de código abierto, a menudo se oye el término IVR utilizado
para describir a una operadora automática. Sin embargo, en la industria de las telecomunicaciones, un
IVR es distinto de una operadora automática. Por esta razón, cuando usted está hablando con alguien
sobre cualquier tipo de menú de telecomunicaciones, debe asegurarse de que usted está hablando de la
misma cosa. Para un profesional de las telecomunicaciones, el término IVR implica un esfuerzo de
desarrollo relativamente complejo y complicado (y los subsecuentes costos), mientras que un operador
automático es una cosa simple y de bajo costos que es común en la mayoría de la PBX.
En este capítulo, se habla de la construcción de una operadora automática. En posteriores capítulo
hablaremos de los IVR.
Diseñando su operadora automática
El error más común que cometen los principiantes en el diseño de un AA es una complejidad
innecesaria. Si bien puede haber mucha alegría y sentido de logro en la creación de un AA multinivel con
docenas de opciones ingeniosas y montones de indicaciones muy interesantes, las personas que llaman
tienen una agenda diferente. La razón, la gente hacen llamadas telefónicas principalmente porque
quieren hablar con alguien. Mientras que las personas se han acostumbrado a la realidad de los
operadoras automáticas (y en algunos casos pueden acelerar las cosas), la mayoría de la gente prefiere
hablar con alguien en vivo. Esto significa que hay dos reglas fundamentales que cada operadora
automática debe adherirse a:
1. Mantener la simplicidad.
2. Asegúrese de incluir siempre un controlador para las personas que van a presionar 0 cada vez
que oyen una operadora automática. Si no quiere tener una opción 0, sea conscientes de que
mucha gente le va a insultar por esto, y van a colgar y no volverán a llamar. En los negocios, esto
es generalmente una cosa muy mala.
Antes de empezar a codificar su Auto Attendant, es sabio diseñarlo. Usted tendrá que definir un flujo de
llamadas, y tendrá que especificar las instrucciones que se reproducirán en cada paso. Herramientas de
creación de diagramas de software pueden ser útiles para esto, pero no hay necesidad de conseguir uno
para impresionar. La tabla a continuación proporciona un buen modelo para crear una operadora
automática básica que hará lo que usted necesita.
Tabla. Una operadora automática básica
Paso u Opción
Mensaje de Ejemplo
SaludoGracias por llamar a la
horas de oficina empresa ABC
Notas
Saludo del día. Reproducido
inmediatamente después el
sistema responde la
llamada.
Archivo
daygreeting.wav
Saludohoras no hábiles
Gracias por llamar a la
empresa ABC. Nuestra
oficina está cerrada.
Saludo de Noche. Como el
anterior, pero se reproduce
fuera de horas de oficina.
nightgreeting.wav
Menú Principal
Si conoce la extensión de
la persona que desea
llamar, por favor ingréselo
ahora. Para ventas, por
favor, pulse 1; para
servicio, pulse 2; para
nuestro directorio de la
empresa, pulse #. Para
nuestra información de
dirección y fax, por favor,
pulse 3. Para repetir
estas opciones, pulse 9, o
puede permanecer en la
línea o presione 0 para
ser transferido con un
Mensaje
del
menú
principal. Se reproduce
inmediatamente después
del saludo. Para la persona
que llama, el saludo y el
menú principal se escuchan
como un único mensaje, sin
embargo, en el sistema es
de gran ayuda mantener
estos mensajes separado.
mainmenu.wav
operador.
1
Por favor espere mientras
trasferimos su llamada.
Transfiera a la cola de venta
holdwhilewecon
nect.wav
2
Por favor espere mientras
trasferimos su llamada.
Transfiera
soporte
holdwhilewecon
nect.wav
#
n/a
Corre
la
Directory()
3
Nuestra dirección es
[dirección]. Nuestro
número de fax es [número
de fax]., etc
Reproduce la grabación que
contiene la información de
dirección y fax. Retorna la
llamada al mensaje del
menú principal cuan haya
terminado.
faxandaddress.wav
0
Transfiere la llamada a la
recepcionista/operadora
transfertorecep
tion.wav
9
Transfiriendo con nuestra
operadora. Espere por
favor.
n/a
Repite. Reproduce de nuevo
el menú (pero no incluye el
saludo).
n/a
t
n/a
Timeout. Si la persona no
Hace una elección se
trata la llamada como si
la persona que llama ha
marcado 0 (o en algunos
casos, repite
un
mensaje).
i
Usted ha hecho una
selección inválida. Por
favor, inténtelo de
nuevo.
La persona que llama
presiono
un
digito
inválido. Reproduce de
nuevo el menú (pero no
el incluye el saludo).
invalid.wav
Transfiere la llamada a la
extensión marcada.
holdwhileweconnect.wav
_XXXa
a
n/a
a la cola de
Aplicación
n/a
Este patrón de marcado debe ser relevante a su rango de extensión.
Vamos a repasar los diversos componentes de esta plantilla. A continuación le mostraremos el código
del dialplan necesario para ponerlo en práctica, así como la forma de crear los mensajes.
El saludo
Lo primero que la persona que llama escucha son en realidad dos mensajes. El primer mensaje es el
saludo. Lo único que el saludo debe hacer es saludar a la persona que llama. Ejemplos de saludos
podrían ser "Gracias por llamar a SNC Soluciones", "Bienvenidos a la Escuela de Arte y Diseño Nacional",
o "Ha llegado a las oficinas de Pérez, Guzmán, y Asociados, Abogados. " Eso es todo –las opciones para
las personas que llama vendrán después. Esto le permite grabar saludos diferentes sin tener que grabar
un menú nuevo completamente. Por ejemplo, durante unas pocas semanas cada año es posible que
desee que su saludo diga el "saludos de la estación" o lo que sea, pero el menú no tendrá que cambiar.
También, si quieres reproducir una grabación diferente después de horas de oficinas de ("Gracias por
llamar. Nuestra oficina está cerrada."), Puede utilizar diferentes saludos, pero el corazón del menú
puede permanecer igual. Por último, si usted quiere ser capaz de devolver las llamadas al menú desde
una parte diferente del sistema, normalmente no querrás que ellos escuchen el saludo de nuevo.
Menú Principal
El mensaje del menú principal es donde usted informar a las personas que llaman de las opciones
disponibles para ellos. Usted debe hablar esto lo más rápido posible (sin sonar apresurado). Cuando se
graba una elección, siempre dígales a los usuarios la acción que se tomará antes de darles la opción
dígitos para tomar esa acción. Por lo tanto, no diga "pulse 1 para ventas," sino más bien diga "para
ventas, pulse 1. La razón de esto es que la mayoría de la gente no presta toda su atención al mensaje
hasta que oyen la elección que es de su interés. Una vez que oyen su elección, tendrá toda su atención y
se les puede decir qué botón presionar para llegar a donde quieren ir.
Otro punto a considerar es en qué orden poner las opciones. En un negocio típico, por ejemplo, se
quiere que las ventas sean la primera opción del menú, y la mayoría de las personas que llaman
esperaría esto también. Lo importante es pensar en las personas que llaman. Por ejemplo, la mayoría de
las personas no estarán interesadas en la información de dirección y fax, así que no haga de esta la
primera opción del menú. Piense en la meta de hacer que las personas que llaman alcance su destino lo
más rápidamente posible cuando se realiza el diseño de las opciones del menú. Corte sin piedad todo lo
que no sea absolutamente indispensable.
Selección 1
Opción 1 en nuestro ejemplo será una simple transferencia. Normalmente, esto sería a un recurso
ubicado en otro contexto, y típicamente tienen un número de extensión interna para que los usuarios
internos también puedan transferir llamadas a la misma. También podemos usar esta opción para enviar
las llamadas a una cola de llamadas, por ejemplo la cola de ventas.
Selección 2
Opción 2 será técnicamente idéntica a la opción 1. Sólo el destino será diferente. Esta selección
transferir las llamadas a la cola de soporte.
Selección #
Es bueno tener la opción del directorio lo más cerca del comienzo de la grabación como sea posible.
Muchas personas van a utilizar el directorio si saben que está ahí, pero no se tomaran la molestia de
escuchar el mensaje del menú completo para encontrar información sobre él. Personas impacientes,
pulsarán 0 y, por tanto, cuanto antes que usted les diga sobre el directorio, mayores serán la
probabilidad de que lo usen, y, por tanto, reducirá la carga de trabajo de su recepcionista.
Selección 3
Cuando usted tiene una opción que no hace nada, pero reproduce una grabación de nuevo a la persona
que llama (como la información de dirección y fax), puede dejar todo el código para que esté en el
mismo contexto como el menú, y simplemente retornar la llamada al mensaje del menú principal al final
de la grabación. En general, este tipo de opciones no son tan útiles como nos gustaría pensar que son,
así que en la mayoría de los casos lo más probable es que desee salir de esta.
Selección 9
Es muy importante darles a las personas que llaman la opción de poder escuchar otra vez las opciones
del menú. Muchas personas no prestarán atención a lo largo de todo el menú, y si no les da la opción de
escuchar las opciones una vez más, lo más probable es que pulsen 0.
Tenga en cuenta que usted no tiene que reproducir el saludo de nuevo, sólo el mensaje del menú
principal.
Selección 0
Como se ha dicho antes, te guste o no, esta es la opción que muchas (posiblemente la mayoría) de las
personas que llaman seleccionan. Si usted realmente no quiere tener a alguien manejando estas
llamadas, puede enviar esta extensión a un buzón, pero no lo recomiendo. Si usted tiene una empresa,
muchas de las personas que llaman serán tus clientes. Usted quiere asegurarse de que sea fácil para
ellos ponerse en contacto con usted. Confíe en nosotros.
Timeout
Muchas gentes llaman a un número y no prestan demasiada atención a lo que está sucediendo. Ellos
saben que si sólo esperan en la línea, eventualmente serán transferidos a la operadora. O tal vez se
encuentren en su coche, y realmente no deberían presionar botones desde su teléfono. Si no hacen
ninguna selección, no lo moleste forzándolo a hacerlo. Transfiéralo con la operadora.
Invalid
La gente comete errores. Eso está bien. El manejador de entradas inválidas les hace saber que lo que
ellos han seleccionado no es una opción válida y los devuelve a la línea de menú para que puedan volver
a intentarlo. Tenga en cuenta que no debe reproducir el saludo de nuevo, sólo el mensaje del menú
principal.
Marcado por Extensión
Si alguien llama a su sistema y conoce la extensión que quiere alcanzar, su operadora automática debe
tener el código en su lugar para manejar esto.
Aunque Asterisk puede manejar una superposición entre las opciones del menú y los números de
extensión (es decir, se puede tener una opción de menú 1 y extensiones del 100 al 199), en general
es mejor evitar esta superposición. De lo contrario, el dialplan siempre tendrá que esperar a que el
tiempo de espera entre dígitos se agote cuando alguien presiona 1, porque no va a saber si están
planeando marcar la extensión 123 o la opción 1 del menú. El tiempo de espera entre dígitos es el
retraso que el sistema permitirá entre los dígitos antes de asumir que el número completo se ha
introducido. Este temporizador asegura que el llamante tiene tiempo suficiente para marcar una
extensión de varios dígitos, pero también causa un retraso en el procesamiento de las entradas de un
solo dígito.
Construyendo su operadora automática
Después de haber diseñado su operadora automática, hay tres cosas que hay que hacer para que
funcione correctamente:
•
•
•
Grabar los prompts o mensajes.
Construir el plan de marcado para el menú.
Dirigir los canales de entrada al contexto de la operadora automática.
Vamos a iniciar hablando de las grabaciones.
Grabando los prompts o mensajes
La grabación de los mensajes de un sistema de teléfono es una tarea crítica. Esto es lo que las personas
que llaman escucharán cuando interactúan con el sistema, y la calidad y profesionalidad de estos
mensajes se reflejará en su organización. Asterisk es muy flexible en este sentido y puede trabajar con
diferentes formatos de audio. Hemos encontrado que, en general, el formato más útil para usar es WAV.
Los archivos guardados en este formato pueden ser de muchos tipos diferentes, pero sólo un tipo de
archivo WAV trabajarán con Asterisk: Los archivos deben ser codificados en 16 bits, 8000 Hz, en formato
mono.
Formato de Archivo Prompt Recomendado
El formato de archivo WAV que hemos recomendado es útil para los mensajes del sistema, ya que
fácilmente se puede convertir en cualquier otro formato que sus teléfonos pueden usar sin distorsión, y
casi cualquier equipo puede reproducirlos sin ningún software especial. Por lo tanto, no sólo puede
Asterisk manejar el archivo fácilmente, sino que también es fácil de trabajarlo en un PC (lo cual puede
ser útil). Asterisk puede manejar otros formatos de archivo también, y en algunos casos éstos pueden
ser más adecuados a sus necesidades, pero en general nosotros encontramos bien los archivos WAV 8
kHz 16 bits por ser más fácil de trabajar con ellos, y la mayoría de las veces, de la mejor calidad posible.
Básicamente hay dos formas de obtener los mensajes del sistema. Una de ellas es grabar los archivos de
sonido en un estudio o en un PC, y, luego, mover los archivos al sistema. Una segunda forma es registrar
los mensajes directamente en el sistema mediante una extensión telefónica. Nosotros preferimos el
segundo método. Nuestro consejo es el siguiente: no se obsesione con las complejidades de la
grabación de audio a través de un PC o en un estudio. Por lo general no es necesario. Un aparato
telefónico producirá grabaciones de excelentes calidad, y las razones son simples: el micrófono y la
electrónica en un teléfono son cuidadosamente diseñados para capturar la voz humana en un formato
que es ideal para la transmisión en las redes telefónicas, y por lo tanto un teléfono también es ideal para
hacer los mensajes del sistema. El teléfono captura el audio en el formato correcto, y filtrará los ruidos
de fondo y normaliza el nivel de decibeles.
Sí, los mensajes son grabados adecuadamente en un estudio serán de superior calidad a un mensaje
grabado en un teléfono, pero si usted no tiene el equipo o la experiencia, tome nuestro consejo y use
un teléfono para hacer las grabaciones, porque si el estudio produce los mensajes pobremente serán
mucho peor que un mensaje grabado a través de un teléfono.
Usando el dialplan para crear grabaciones
El método más simple para grabar sus mensajes es usando la aplicación de Record(). Por ejemplo:
[GrabarSaludo]
exten => 500,1,Playback(vm-intro)
same => n,Record(saludodia.wav)
same => n,Wait(2)
same => n,Playback(saludodia)
same => n,Hangup
exten => 501,1,Playback(vm-intro)
same => n,Record(menuprincipal.wav)
same => ... etc ... (crear código del dialplan para cada prompt que usted necesita grabar)
Para utilizar este contexto, será necesario incluirlo en el contexto en el cual las extensiones entran en
el plan de marcado. Así que en su contexto [Local], tendrá que añadir la línea include =>
GrabarSaludo. En un entorno de producción, es probable que desee una contraseña en esto para
que cualquiera no pueda grabar mensajes.
Esta extensión reproduce un mensaje, emite un pitido, hace una grabación, y reproduce la grabación
otra vez. Es de destacar que la aplicación Record() toma el nombre del archivo completo como
argumento, mientras que la aplicación Playback() excluye la extensión de tipo de archivo (.Wav, .Gsm,
etc.) Esto se debe a que la aplicación Record() necesita saber en qué formato se debe hacer la
grabación, mientras que la aplicación Playback() no lo hace. Por el contrario, Playback() selecciona
automáticamente el mejor formato de audio disponible, basado en el códec que su teléfono está
utilizando y los formatos disponibles en la carpeta sounds (por ejemplo, si tiene un archivo
saludodia.wav y un saludodia.gsm en la carpeta sounds , Playback(saludodia) seleccionará el que
requiere menor recursos del CPU para reproducir a la persona que llama).
Usted probablemente querrá una extensión separada para la grabación de cada una de los mensajes,
posiblemente escondida de su conjunto de extensiones normales, para evitar que una extensión mal
escrita acabe con cualquiera de sus mensajes del menú actual. Si el número de prompts que usted tiene
es grande, repitiendo esta extensión con ligeras modificaciones para cada uno de ellos puede ser
bastante tedioso, pero hay maneras de evitar esto. Le mostraremos cómo hacer su grabación más
inteligente en capitulo posteriores, pero por ahora el método descrito anteriormente nos servirá para
nuestras necesidades inmediatas.
Dialplan
Aquí está el código necesario para crear el operador automático que diseñamos antes. A menudo
usaremos líneas en blanco antes de las etiquetas dentro de una extensión para lograr que el dialplan sea
más fácil de leer, pero tenga en cuenta que sólo porque hay una línea en blanco no significa que haya
una extensión diferente:
[menu_principal]
exten => s,1,Verbose(1, Caller ${CALLERID(all)} ha entrado en la operadora automática)
same => n,Answer()
; esto establece el tiempo entre dígitos
same => n,Set(TIMEOUT(digit)=2)
; esperar un segundo para establecer el audio
same => n,Wait(1)
; Si Mon-Fri 9-5 ir a la etiqueta saludodia
same => n,GotoIfTime(9:00-17:00,mon-fri,*,*? saludodia:fueradehorario)
same => n(fueradehorario),Background(saludonoche) ; SALUDO DESPUÉS DE HORAS OFICINA
same => n,Goto(menuprompt)
same => n(saludodia),Background(saludodia) ; SALUDO DEL DÍA
same => n,Goto(menuprompt)
same => n(menuprompt),Background(mainmenu)
; MENSAJE DEL MENU PRINCIPAL
same => n,WaitExten(4)
; más de 4 segundos es probablemente demasiado
same => n,Goto(0,1)
; Tratar como si la persona que llama ha presionado '0'
exten => 1,1,Verbose(1, Caller ${CALLERID(all)} ha entrado en la cola de ventas)
same => n,Goto(Colas,8043,1) ; Cola de ventas
exten => 2,1,Verbose(1, Caller ${CALLERID(all)} ha entrado en la cola de soporte)
same => n,Goto(Colas,8042,1) ; Cola soporte
exten => 3,1,Verbose(1, Caller ${CALLERID(all)} has requested address and fax info)
same => n,Background(faxydireccion) ; Información de dirección y fax
same => n,Goto(s,menuprompt) ; lleva a la persona que llama de nuevo al mensaje del menú principal
exten => #,1,Verbose(1, Caller ${CALLERID(all)} está entrando en el directorio)
same => n,Directory(default) ; Envía la persona que llama en el directorio.
; Usa Internal como el contexto de marcado
exten => 0,1,Verbose(1, Caller ${CALLERID(all)} está llamando la operadora)
same => n,Dial(SIP/operator) ; Extensión de operador/cola
exten => i,1,Verbose(1, Caller ${CALLERID(all)} ha entrado una selección no válida)
same => n,Playback(invalid)
same => n,Goto(s,menuprompt)
exten => t,1,Verbose(1, Caller ${CALLERID(all)} tiempo de espera)
same => n,Goto(0,1)
; Usted va a querer tener un patrón de marcado para las diversas extensiones que usted le permitirá
; marcar las llamadas externas
; PERO NO SIMPLEMENTE INCLUYA EL CONTEXTO Local
; O LOS LLAMANTES EXTERNOS SERÁN CAPAZ DE HACER LLAMADAS DESDE FUERA DE SU SISTEMA
; HAGA LO QUE HAGA AQUÍ, PRUEBE CON CUIDADO PARA ASEGURARSE DE QUE LOS LLAMANTES
; EXTERNOS NO VAN A PODER HACER NADA MÁS QUE MARCAR LAS EXTENSIONES INTERNAS
exten => _1XX,1,Verbose(1, Llama a la extensión que inician con '1'
same => n,Goto(Internal,${EXTEN},1)
Enviando las llamadas entrantes para la operadora automática
Cualquier llamada que entra en el sistema entrará al dialplan en el contexto definido por cualquier canal
sobre el cual la llamada entra. En muchos casos este será un contexto llamado entrante, o from-pstn, o
algo similar. Las llamadas se reciben ya sea con una extensión (como sería el caso con un DID) o sin una
(lo que sería el caso con una línea analógica tradicional). Cualquiera que sea el nombre del contexto, y
cualquiera que sea el nombre de la extensión, tendrá que enviar a cada llamada entrante al menú. Aquí
hay algunos ejemplos:
[from-pstn]
; una línea análoga que tiene context=from-pstn (típicamente un canal DAHDI)
exten => s,1,Goto(menu_principal,s,1)
[entrante]
; un DID entrando en un canal con context=entrante (PRI, SIP, or IAX)
exten => 6104632323,1,Goto(menu_principal,s,1)
Dependiendo de cómo se configure sus canales de entrada, por lo general querrás utilizar la aplicación
Goto() si desea enviar la llamada a una operadora automática. Esto es mucho más ordenado que una
simple codificación de su operador automático en el contexto entrante.
Como habrás notado en el ejemplo anterior hemos direccionados todas las llamadas entrantes para ser
administradas por dos colas llamadas ventas y soporte. Nuestro siguiente paso es crear esas colas, en la
siguiente sección explicaremos como hacerlo.
Creando la cola de ventas y soporte
Distribución automática de llamadas (ACD), o colas de llamadas, ofrece una manera para que una
PBX ponga en una lista de espera las llamadas entrantes de un grupo de usuarios: se agregan varias
llamadas en un patrón de espera, se asigna cada llamada un rango, y se determina el orden en el
que esa llamada deben ser entregada a un agente disponible (por lo general, primera llamada en
entrar primera en salir). Cuando un agente está disponible, la llamada de más alto rango en la cola
se entrega a ese agente, y todas las demás se mueven hacia arriba una posición.
Si alguna vez has llamado a una organización y ha escuchado "todos nuestros representantes están
ocupados," usted ha experimentado ACD. La ventaja de ACD para las personas que llaman es que
ellos no tienen que seguir marcando de nuevo en un intento de comunicarse con alguien, y las
ventajas para las organizaciones es que son capaces de servir mejor a sus clientes y manejar
temporalmente situaciones en las que hay más personas que llaman que agentes disponible.
Hay dos tipos de centros de llamadas: entrantes y salientes. ACD se refiere a la tecnología que
se ocupa de los centros de llamadas entrantes, mientras que el término Dialer (Marcador
Predictivo) se refiere a la tecnología que se ocupa de los centros de llamadas salientes. En este
libro nos centraremos principalmente en llamadas entrantes.
En algún momento nos hemos sentidos frustrados por el mal diseño y gestión de una cola: la
persistente música de espera de una radio que no está en sintonía, que aturden la mente mientras
espera en una cola, y los mensajes sin sentido que le indican cada 20 segundos lo importante que
es su llamada, a pesar del hecho que usted ha estado esperando durante 30 minutos y ha
escuchado el mensaje tantas veces que lo puede citar de memoria. Desde la perspectiva de
servicio al cliente, el diseño de la cola puede ser uno de los aspectos más importantes de su
sistema telefónico. Al igual que con una operadora automática, lo que debe tenerse en cuenta por
encima de todo es que las personas que llaman no están interesados en permanecer en una cola.
Lo llamaron porque quieren hablar con usted. Todas sus decisiones de diseño deben tener este
hecho crucial centrado en su mente: la gente quiere hablar con otras personas, no con su sistema
telefónico.
El propósito de este capítulo es enseñarles cómo crear y diseñar colas que dirigen las personas que
llaman a sus destinos lo más rápido y sin dificultades como sea posible.
En esta sección, podemos voltear hacia atrás y adelante entre el uso de los términos miembros de
colas y agentes. Ya que no vamos a pasar mucho tiempo en el módulo llamado Asterisk chan_agent
(usando Agent Loging()), tenemos que dejar claro que en este libro, cuando utilizamos el término
"agente", nos estamos refiriendo a un punto final –a un ser humano, y no a la tecnología de canal
en Asterisk llamado chan_agent. Lea, y esto debería tomar más sentido.
Creando cola simple de ACD
Para empezar, vamos a crear una simple cola de ACD. Se aceptaran llamadas y se trataran de
entregar a un miembro de la cola.
En Asterisk, el termino miembro se refiere a un canal (típicamente un peer SIP) asignado a una cola
que se puede marcar, tal como SIP/0000FFFF0001. Un agente técnicamente se refiere al canal del
agente también se utiliza para marcar a los puntos finales. Por desgracia, el Agent channel es una
tecnología obsoleta en Asterisk, ya que es limitado en flexibilidad y puede causar problemas
inesperados que pueden ser difíciles de diagnosticar y resolver. No vamos a cubrir el uso de
chan_agent, por lo que ser conscientes de que generalmente, vamos a utilizar el término miembro
para referirnos al dispositivo de teléfono y agente para referirnos a la persona que maneja las
llamadas.
Vamos a crear la cola(s) en el archivo queues.conf, y añadiremos manualmente los miembros de la cola;
a través de la consola de Asterisk. No vamos a utilizar o editar este archivo, sin embargo, el módulo
app_queue espera encontrarlo, y no se cargará si no existe:
$ cd /etc/asterisk
$ touch agents.conf
Lo siguiente que necesita crear es el archivo queues.conf, que es donde se define la configuración de las
colas:
$ touch queues.conf
Rellene el archivo queues con la siguiente configuración, esto creará dos colas nombradas [ventas] y
[soporte]. Puede nombrar las colas con lo que quieras, pero vamos a utilizar estos nombres más
adelante en el libro, así que si usa diferentes nombres de cola de lo que hemos recomendado aquí, tome
nota de sus opciones para futuras referencias:
[general]
autofill=yes
shared_lastcall=yes
[ColaEstandar](!)
musicclass=default
strategy=rrmemory
joinempty=no
leavewhenempty=yes
ringinuse=no
[ventas](ColaEstandar)
; distribuye todas las llamadas en espera para los miembros disponibles
; Respetar el tiempo de cierre para los miembros registrados en más de una cola
; Plantillas para proporcionar funcionalidades comunes
; reproduce la música por [default]
; usa la estrategia Round Robin Memory
; no unirse a la cola cuando no hay miembros disponibles
; dejar la cola cuando no hay miembros disponibles
; no timbrar a un miembros cuando ya está en uso (previene de varias llamadas a un
; agente)
; Crea la cola ventas usando los parámetros en la plantilla ColaEstandar
[soporte](ColaEstandar) ; Crea la cola soporte usando los parámetros en la plantilla ColaEstandar
La sección [general] define el comportamiento predeterminado y opciones globales. Nosotros sólo
hemos especificado dos opciones en la sección [general], ya que los valores predeterminados integrados
son suficientes para nuestras necesidades en este momento.
La primera opción es autofill, la cual le dice a la cola para distribuir todas las personas que están
esperando a todos los miembros disponibles de inmediato. En versiones previas de Asterisk sólo se
distribuía un llamante a la vez, lo que significa que, mientras Asterisk estaba señalando un agente todas
las demás llamadas permanecían en espera (incluso aunque hubiera otros agentes disponibles) hasta
que la primera llamada en línea no haya sido conectadas a un agente (que obviamente provocaba los
cuellos de botella en las versiones anteriores de Asterisk). A menos que tenga una necesidad particular
de compatibilidad con versiones anteriores, esta opción siempre debe tener el valor yes.
La segunda opción en la sección [general] del archivo queues.conf es shared_lastcall. Cuando
permitimos shared_lastcall, la última llamada a un agente que se registra en varias colas será la llamada
que se cuenta para el tiempo de cierre con el fin de evitar el envío de una llamada a un agente de otra
cola durante el período de cierre. Si esta opción se establece a no, el temporizador de baja sólo se
aplicará a la cola de donde viene la última llamada, lo que significa que un agente que estaba
terminando una llamada de la cola de soporte aún podría recibir una llamada de la cola de ventas. Esta
opción también debe siempre tener el valor yes (por defecto).
La siguiente sección, [ColaEstandar](!) es la plantilla que aplicaremos a nuestras colas de ventas y
soporte (nosotros declaramos una plantilla mediante la adición de (!)).Hemos definido musicclass como
la música de espera por defecto, como se ha configurado en el archivo musiconhold.conf. La estrategia
que vamos a emplear es rrmemory, siglas de Round-Robin con memoria. La estrategia rrmemory
funciona girando a través de los agentes de la cola en orden secuencial, no pierde de vista cual agente
tiene la última llamada, y la presentación de la siguiente llamada al siguiente agente. Cuando consigue el
último agente, regresa al inicio (como los agentes se registran, son agregados al final de la lista). Hemos
establecido joinempty a no ya que generalmente es una mala práctica poner las llamadas en una cola
donde no hay agentes disponibles para atender sus llamadas.
La opción leavewhenempty se utiliza para controlar si las personas que llaman deben caer fuera de la
aplicación Queue() y continuar en el dialplan si no hay miembros disponibles para tomar sus llamadas.
Hemos definido esto como yes, porque usted no querrá normalmente llamadas en espera en una cola
sin agentes registrados.
Por último, hemos establecido ringinuse a no, que le dice a Asterisk para que no timbre a un miembros
cuando sus dispositivos ya están ocupado. El propósito de establecer ringinuse a no es evitar múltiples
llamadas al mismo miembro de una o más colas.
Una vez que hayas terminado de configurar su archivo queues.conf, se puede guardar y volver a cargar
el módulo app_queue.so desde Asterisk CLI:
$ asterisk -r
*CLI> module reload app_queue.so
-- Reloading module 'app_queue.so' (True Call Queueing)
Luego verifique que las colas se cargan en memoria (no se olvide de asegurarse que un archivo
agents.conf vacío existe también):
localhost*CLI> queue show
soporte
has 0 calls (max unlimited) in 'rrmemory' strategy
(0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
No Members
No Callers
ventas
has 0 calls (max unlimited) in 'rrmemory' strategy
(0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
No Members
No Callers
La salida de queue show ofrece varias piezas de información, incluyendo las partes que se detallan en la
tabla a continuación.
Campo
W:
C:
A:
SL:
Descripción
Amplitud de la cola
Número de llamadas presentadas a esta cola
Número de llamadas que han sido contestadas por un miembro
Nivel de servicio
Ahora que usted ha creado las colas, es necesario configurar el plan de marcado para permitir que las
llamadas entren en la cola.
Agregue la siguiente lógica del dialplan en el archivo extensions.conf:
[Colas]
exten => 8042,1,Verbose(2,${CALLERID(all)} entrando a la cola soporte)
same => n, Queue(soporte)
same => n,Hangup()
exten => 8043,1,Verbose(2,${CALLERID(all)} entrando a la cola ventas)
same => n,Queue(ventas)
same => n,Hangup()
[Local]
include => Colas ; permiten que los teléfonos llamar a las colas
Hemos incluido el contexto Colas en el contexto Local para que nuestros teléfonos puedan llamar a las
colas que hemos creado en el ejemplo de la página 245, donde definimos los elementos de menú que
van a estas colas.
Guarde los cambios en el archivo extensions.conf, y recargar el dialplan con el comando dialplan reload
desde el CLI.
Si marca la extensión 8042 o 8043 en este punto, como resultado final obtendrá una salida como la
siguiente:
-- Executing [8042@Local:1] Verbose("SIP/0000FFFF0003-00000001",
"2,"Lian Massiel" <100> entrando a la cola soporte") in new stack
== "Lían Massiel" <1--> entrando a la cola soporte
-- Executing [8042@Local:2] Queue("SIP/0000FFFF0003-00000001",
"soporte") in new stack
[2013-12-29 03:10:39] WARNING[13981]: app_queue.c:5738 queue_exec:
Unable to join queue 'soporte'
-- Executing [8042@Local:3]
Hangup("SIP/0000FFFF0003-00000001", "") in new stack
== Spawn extension (Local, 8042, 3) exited non-zero on
'SIP/0000FFFF0003-00000001'
Usted no se puede unir a la cola en este punto, ya que no hay agentes en la cola para contestar las
llamadas. Debido a que hemos definidos joinempty=no y leavewhenempty=sí en queues.conf, las
personas que llaman no entraran en la cola. (Esta sería una buena oportunidad para experimentar con
las opciones joinempty y leavewhenempty en queues.conf para entender mejor su impacto en las colas.)
En la siguiente sección, vamos a demostrar cómo agregar miembros a la cola (así como otras
interacciones con miembros de la cola).
Miembros de la Colas
Las colas no son muy útiles sin alguien que responda las llamadas que entran en ellas, por lo que
necesitamos un método para permitir que los agentes se registren en las colas para responder llamadas.
Hay varias maneras de abordar esto, así que voy a mostrar cómo agregar miembros a la cola tanto de
forma manual (como administrador, ya sea a través de la CLI o codificación en el archivo queues.conf) y
dinámica (como el agente, a través de una extensión definida en el plan de marcado). Vamos a
comenzar con el método Asterisk CLI, lo que permite agregar de forma sencilla los miembros de la cola
para la realización de pruebas y cambios mínimos del dialplan. A continuación vamos a mostrar cómo se
pueden definir miembros en el archivo queues.conf (que se sumarán los miembros definidos siempre
que app_queue se vuelve a cargar). Por último, le mostraremos cómo agregar lógica del dialplan que les
permite a los agentes registrados entrar y salir de las colas.
Controlando los miembros de la cola a través del CLI
Podemos agregar miembros de cola a cualquier cola disponible a través del Asterisk CLI con el comando
queue add. El formato del comando queue add es (todo en una línea):
*CLI> queue add miembro <canal> a <cola> [[[penalty <penalty>] como
<nombremiembro>] estado_interface <interface>]
El <canal> es el canal que queremos añadir a la cola, como SIP/0000FFFF0003, y el nombre <cola> será
algo así como soporte, ventas o cualquier nombre de cola que haya en /etc/asterisk/queues.conf.
<penalty> dentro de una cola, se puede penalizar a los miembros con el fin de reducir su preferencia por
la cual se llama cuando hay personas esperando en una cola determinada. Por ejemplo, podemos
penalizar a los miembros de la cola cuando queremos que sean miembro de una cola, pero que sólo
reciban llamadas cuando la cola está lo suficientemente completa y todos nuestros agentes preferidos
no están disponibles. Esto significa que podemos tener tres colas (digamos, soporte, ventas y
facturación), y cada una contener los mismos miembros.
Ahora que ya has agregado callcounter=yes en sip.conf (usaremos canales SIP en el resto de nuestros
ejemplos), vamos a ver cómo agregar miembros a nuestras colas desde el Asterisk CLI.
Agregar miembro a la cola de soporte se puede hacer con el comando queue add member :
*CLI> queue add member SIP/0000FFFF0001 para soporte
Added interface 'SIP/0000FFFF0001' to queue 'soporte'
Una consulta de la cola verificará que el nuevo miembro ha sido añadido:
*CLI> queue show support
soporte
has 0 calls (max unlimited) in 'rrmemory' strategy
(0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
SIP/0000FFFF0001 (dynamic) (Not in use) has taken no calls yet
No Callers
Para eliminar un miembro de la cola, se utiliza el comando queue remove member:
*CLI> queue remove member SIP/0000FFFF0001 from soporte
Removed interface 'SIP/0000FFFF0001' from queue 'soporte'
Por supuesto, usted puede utilizar el comando queue show de nuevo para verificar que su miembro se
ha eliminado de la cola.
Descargar