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.