Asterisk intro

 

Introducción rápida a Asterisk Introduccion al documento

Este documento es un breve resumen para comenzar a entender asterisk. La idea era armar algo para que los integrantes del LANUX (Grupo de usuarios de GNU/Linux de LANUS, www.lanux.org.ar) estemos en tema para armar entre todos una demo de Voz sobre IP. Que es Voz sobre IP (Voice over IP, VoIP)?

Es el mecanismo por el cual se provee la misma funcionalidad que tenemos con la telefonía tradicional pero usando como transporte redes que usen el Internet Protocol (IP). VoIP (abreviación de Voice over IP) abarca desde softphones (programas para establecer comunicaciones de voz usando una simple placa de sonido, como puede ser gnomemetting, skype, etc) hasta hardware mucho mas complejo, el cual realiza la función de interface entre una red de datos y los equipos de telefonía tradicionales (teléfonos, centrales telefónicas, red de telefonía pública). Que es el asterisk?

Es un software que corre bajo Linux (y creo que en otros sistemas operativos), cuya función es hacer de PBX principalmente para servicios de Voz sobre IP. PBX es la denominación técnica que se les da a las centrales telefónicas. Asterisk se encarga de interconectar distintos dispositivos para que puedan tener comunicaciones de VoIP entre sí. Al igual que cualquier PBX de oficina, cada dispositivo recibe una número de interno para identificarlo. Ejemplos de cosas que se pueden hacer

* Hay placas que tienen conectores para enchufar teléfonos comunes, asterisk se encarga de asignarle un interno a cada teléfono, pudiendo realizar llamadas entre los mismos (simulando una central telefónica común). * Teniendo dos computadoras instaladas con asterisk y con una placa de sonido común y corriente se puede establecer una comunicación de voz entre las mismas. En cada PC a la máquina remota se le asigna un nro. de interno, para que a travez de la consola de control de asterisk se pueda establecer la comunicación. * Del ejemplo anterior podemos sacar que es “ilimitada” la cantidad de equipos que podemos conectar con este procedimiento. En cada PC tendríamos un interno por cada uno de las PC remotas. * Asi como tenemos dos PC conectadas con placas de sonido, podemos tener placas de VoIP, las cuales nos permiten conectar aparatos telefónicos comunes para hablar con sitios remotos. * Hay placas que permiten conectar a una PC a la red de telefonía pública (me refiero a la línea de Telefonica o Telecom comun y corriente que usan en sus casas) o a centrales telefónicas analógicas, de forma que discando el teléfono al cual conectamos la placa entremos al asterisk para discar nuevamente y acceder a un sitio remoto. Esto nos permite hacer llamadas telefónicas de larga distancia a travez de internet, de forma que un usuario se crea que esta utilizando un teléfono común y corriente.

Sobre las placas

En los dos últimos ejemplos hable de algunas placas. En el primero hable de placas que son para conectar aparatos telefónicos comunes (si, los mismos que enchufan en sus casas para hablar por la línea que Telefonica o Telecom provee) y en la segunda hable de placas que son para conectar a la red de telefonía pública o a centrales telefonica analógicas. De aquí salen dos conceptos: FXS y FXO. Las placas pueden ser FXS o FXO.

* FXS: son las placas que generan señal telefónica. Por ejemplo, una central telefónica común analógica es un dispositivo FXS, por que genera el tono y los rings para que todos los teléfonos conectados puedan funcionar. Las placas FXS cumplen la misma función, permiten que podamos conectar directamente teléfonos y tengamos tono para marcar o para recibir una llamada. * FXO: son placas que en principio funcionan como un teléfono o un modem. Las podemos conectar contra un dispositivo FXS que nos de señal para llamar y recibir llamadas.

Con esto podríamos tener esquemas como los siguientes:

teléfono—pbx—“pc con placa FXO y asterisk”—-[INTERNET]—–“pc con placa FXO y asterisk”—pbx—-teléfono

En este esquema, podríamos tener interconectadas dos centrales telefónicas (PBX) de sitios remotos y hacer comunicaciones entre los teléfonos de cada interno de la central usando el asterisk y la placa FXO para mandar las comunicaciones por internet. Otro esquema:

teléfono—“pc con placa FXS y asterisk”—[INTERNET]—“pc con placa FXS”—teléfono

Aca podríamos conectar directamente uno o varios teléfonos a cada PC, para que pueden establecer comunicación entre los teléfonos del mismo sitio o del sitio remoto a travez de internet, siempre con el asterisk en el medio.

Ademas de estos dos esquemas, podríamos tener una combinación de los dos, teniendo una placa FXS de un lado y una FXO en el otro sitio. Tambien podriamos tener de un lado una PC con una placa de sonido y del otro una FXO o una FXS, etc ,etc. Hay muchas cosas que se pueden hacer. Otro hardware, el ATA

El ATA es un aparatito del tamaño de un modem de ADSL, que tiene dos conexiones: por una lado una conexión para un teléfono y del otro una conexión de red ethernet. No requieren de una PC para funcionar, son independientes, aunque obviamente necesitan de otro equipo de VoIP remoto para hablar :). Cumple la misma funcion que una PC con una placa FXS.

Esquema de ejemplo:

teléfono—ATA—[INTERNET]—“pc con placa FXO”—PBX—teléfono

ATA tienen los marca Cisco y tambien tienen los ATA de Digium. En realidad, ATA es el modelo de Cisco, no es el nombre real técnico. Los de Digium no se llaman ATA realmente. Digium es la empresa que sponsorea a Asterisk, por lo tanto su “ATA” tiene soporte para comunicarse con Asterisk usando el protocolo IAX. Otros conceptos

* IAX: Es el protocolo que usan los asterisk para comunicarse entre si, con el fin de establecer una comunicación de voz. * SIP: Es otro protocolo de comunicación de VoIP, pero es standard, soportado por varios dispositivos y programas. Por ejemplo, el ATA de Cisco se comunica con Asterisk usando este protocolo ya que el IAX es algo propio de Asterisk. * Codec: es la forma en que se representa el sonido para transmitirlo por una red o internet. La gracia es usar un codec que tenga calidad respetable usando el menor ancho de banda posible. El codec y el IAX trabajan juntos para

transmitir el sonido entre los asterisk. Configurando Asterisk

La instalación de asterisk es sencilla, apt-get install asterisk o emerge asterisk :), por eso vamos derecho a la configuración. Asterisk es un programa que por un lado corre como demonio y por otro tiene una interface de control (o mejor llamado “la consola del asterisk” o CLI).

La interface de control es para comunicarse con el demonio, nos sirve para hacer cosas varias como recargar la configuración o ejecutar comandos de asterisk. Por ejemplo, podemos llamar a un interno (que nos puede a su vez servir para comunicarse con otro asterisk o usar algo como el servicio de voicemail).

El demonio no tiene un único archivo de configuración, dado que el asterisk es modular cada módulo tiene su configuración. Por ejemplo, el módulo de asterisk que habla con las placas de sonido tiene el alsa.conf o el oss.conf, el modulo de IAX tiene su iax.conf y asi para cada cosa. Los archivos que nos importan para empezar son:

* extensions.conf: Es el archivo de configuración principal, que es donde se declaran todos los internos (o extensiones). * modules.conf: Asterisk está dividivo en módulos, desde aca podemos controlar que módulos cargar, que se carguen todos automáticos o que módulos no se deben cargar. * alsa.conf: tiene la configuración del módulo de alsa para asterisk. * iax.conf: configuración del IAX, desde acá se controlan que equipos remotos pueden conectarse a nuestro asterisk.

Pasos para configurar dos asterisk y hacer la prueba con placas de sonido:

NOTA: esta basado en la configuración por defecto que viene en DEBIAN SARGE, y/o UBUNTU HOARY. También lo probé en GENTOO y anduvo. En ambas maquinas:

* Editar el archivo modules.conf y comentar la linea que dice “noload ? chan_alsa.so”. * Editar el alsa.conf y poner “context=default”. * Dejar solamente esto en el extensions.conf:

[default] exten ? s,1,Wait,1 ; esperar un segundo exten ? s,2,Answer ; contestar llamada exten ? s,3,Dial,Console/1 ; llamar por la consola (usando la placa de sonido) exten ? 2,1,Plackback(demo-moreinfo) ; mensaje en ingles de prueba exten ? 2,2,Wait,4 ; espera 4 segundos exten ? 2,3,HangUp ; corta la comunicacion

exten ? 3,1,Dial,IAX2/usuario@direccion/s ;llamar a otro asterisk con IAX exten ? 3,2,Wait,4 ; esperar 4 segundos exten ? 3,3,HangUp ; cortar

* Poner esto al final del archivo iax.conf

[usuario_remoto] type=user host=direccion_remota context=default

El iax.conf y el extensions.conf tienen que tener dos modificaciones para que todo funcione entre los equipos. El fragmento que se agrego en el iax.conf indica el nombre de usuario que yo dejo entrar a mi asterisk y desde que ip. En el extensions, la linea “exten ? 3,1,Dial,IAX2/...” indica el usuario y la direccion del otro asterisk al que hay que llamar cuando se disca el interno 3. Para dar un ejemplo, esta es la configuracion de una de las pruebas que hicimos:

Usuario1 = chr (direccion IP 2.2.2.2) Usuario2 = diegows (direccion IP 1.1.1.1)

—-maquina de chr—- iax.conf: [diegows] type=user host=1.1.1.1 ;dirección ip pública de diegows context=default

extensions.conf: exten ?\ 3,1,Dial,IAX2/chr@1.1.1.1/s

Esta configuración crea el usuario diegows en la máquina de CHR (iax.conf) y crea la extension 3, cuya función es comunicarse a la máquina de diegows usando el usuario en CHR (miren mi configuración y veran que yo estoy creando ese usuario en mi máquina).

—-maquina de diegows—- iax.conf: [chr] type=user host=2.2.2.2 ;dirección pública de CHR context=default

extensions.conf: exten ? 3,1,Dial,IAX2/diegows@2.2.2.2/s ————————– Aca la configuración es igual, pero al reves, creo el usuario para chr y luego uso el usuario que chr me creo para conectarme a su máquina. A probarlo!!!

Primero, arrancamos el asterisk en ambos lados ejecuando “asterisk” a secas, o “asterisk -vvv” si queremos ver información por pantalla de que es lo que esta pasando.

Segundo, iniciamos la consola de asterisk con “asterisk -c -r”.

Tercero, probamos si funciona la placa de sonido utilizando el comando dial desde la consola. Si todo es correcto, tipeando dial 2, deberíamos escuchar un mensaje en ingles.

Ahora, en desde la consola podemos poner “dial 3” para llamar a ese interno, que en definitiva nos va a comunicar con el asterisk remoto usando IAX. Ahora agreguemos la configuración para hacer conferencia

El viernes 26 de agosto con CHR, SKA y el que escribe ahora (DIEGOWS) armamos una conferencia entre los 3. Andubo bastante bien, solamente había un poquito de eco. La configuración fue sencilla, el único problema es que Debian no trae el módulo para esto (app_conference), por lo que usamos una máquina con Gentoo para armar la sala de conferencia. Los pasos de configuración fueronÑ

* emerge asterisk-app_conference * Agregue esto en el extensions.conf:

exten ? 9999,1,Wait,1 exten ? 9999,2,Conference(lanux/S/1); exten ? 9999,3,HangUp Hasta aca es la configuración de la máquina que arma la sala de conferencia, mas abajo va el ejemplo de la configuración de los Asterisk que quieran entrar a la sala:

* CHR y SKA agregaron esto en sus extensions.conf:

exten ? 100,1,Wait,1 exten ? 100,2,Dial,IAX2/chr@1.1.1.1/9999 ; SKA puso ska@1.1.1.1, por que es otro usuario desde otra IP exten ? 100,3,Hangup

Fijense que la configuración de SKA y CHR es la misma que usamos con CHR para hacer una comunicación común y corriente entre los dos, la única diferencia es el “/9999”. Despues explico sobre esto en la seccion que le voy a dedicar al extensions.conf. Recuerden que el el 100 y el 9999 son números de interno y no puede repetirse en un mismo extensions.conf. Si alguien mas quiere engancharse en la conferencia, solamente tienen que pedirme que les cree el usuario en el iax.conf y luego agregar en su extensions.conf lo mismo que agregaron SKA y CHR (siempre usando SU usuario). Otra aclaración, el módulo app_conference solamente tiene que estar instalado en la máquina que arma la sala de conferencias, las máquinas que se unen a la misma solo tienen que tener la configuración de la extensión con el IAX para llamar al otro asterisk. Sobre el extensions.conf

El extensions.conf es el archivo de configuración de Asterisk mas importante, por eso le dedicamos una sección por separado. Este archivo es el que coordina todas las acciones dentro de Asterisk, ya que se encarga de todo el ruteo de llamados. Los otros archivos de configuración, son para definir parámetros a ciertos módulos en particular, como por ejemplo, crear usuario de iax en iax.conf o definir parámetros de sonido en alsa.conf. El mas importante y tal vez complicado es el extensions.conf asi que comencemos a contar como es.

Recuerden que el Asterisk es una PBX, una central telefónica, y como tal tiene internos o extensiones. Las extensiones se configuran en el extensions.conf y cada una tiene asignado un número y una serie de acciones a ejecutar cuando es discada (se puede discar desde la consola de Asterisk, desde un teléfono conectado a travez de una placa FXS, desde un ATA, etc, etc). Por ejemplo:

exten ? 2,1,PlackBack(demo-moreinfo) exten ? 2,2,Wait,4 exten ? 2,3,HangUp

Aca estamos creando la extension 2, cuyas acciones son:

1. Reproducir el archivo demo-moreinfo (viene con el asterisk). 2. Esperar 4 segundos 3. Cortar la comunicación.

Contextos

El extensions.conf está dividido en contextos, cada contexto nos permite agrupar extensiones. Este agrupamiento sirve para que los que ingresen a nuestro Asterisk por IAX, por SIP o directamente desde la consola con la placa de sonido vean un grupo distinto de internos.

Una de las cosas importantes de los contextos, es que cada uno tiene una extensión por defecto. Si observaron en las configuraciones anteriores, hay una extensión que no tiene número sino que está definida con la letra “s”, esta extensión es la que se invoca cuando no se indique un número de interno. Ejemplos

* Teniendo en cuenta la configuración que se mostró para la comunicación entre CHR y DIEGOWS, cuando DIEGOWS se comunique con CHR usando el interno definido en su extensions.conf (3) ingresará al Asterisk de CHR y se ejecutará la extensión “s”. Esta extensión ejecutará la acción que lo comunicará con la consola para hablar a travez de la placa de sonido de CHR (Dial,Console/1). * Ahora, miren el parámetro context del iax.conf de CHR. Este parámetro define en que contexto cae DIEGOWS cuando llame usando IAX. Hagamos un cambio en los archivos de configuración de CHR:

—extensions.conf— [contexto_para_diegows] exten ? s,1,PlayBack(demo-congrats) exten ? s,2, Hangup ——————— —–iax.conf——– [diegows] type=user host=1.1.1.1 context=contexto_para_diegows ——————— Este cambio hace que cuando DIEGOWS llame a CHR usando IAX, se reproduzca el archivo “demo-congrats” y luego se corte la comunicación. El parámetro context del iax.conf define que contexto del extensions.conf se aplica a un usuario determinado.

El contexto indicado en el archivo de configuracion de iax.conf determina tambien los numeros de internos que un usuario esta autorizado a utilizar. Si ustedes revisan los archivo de configuracion de cada tipo de canal (phone.conf, zapata.conf, sip.conf, alsa.conf, etc), van a ver que en cada uno tiene definido el parametro context, para determinar en que contexto caen los llamados que ingresen por un canal u otro. Esto nos permite ejecutar distintas acciones segun el canal por el cual ingrese un llamado. Despues veremos mas ejemplos de uso de contexto cuando definamos el escenario de demostracion final. Configuracion especificas Codecs

Durante las pruebas tuvimos algunos problemas con los codecs, principalmente con el codecs speex, que muchas veces era usado para las comunicaciones con IAX. El principal problema de este codec es que aparentemente no es compatible con la placa Quicknet Linejack y las comunicaciones con otro asterisk usando placa de sonida eran desastrosas. Para evitar problemas de codecs y definir que siempre se use el GSM (el mejor de los que soporta Asterisk en forma gratuita) se debe usar la siguiente confiracion en el archivo iax.conf:

disallow=lpc10 disallow=speex allow=gsm

Si se preguntan donde van estas lineas, miren el archivo de configuracion por defecto de asterisk, van a ver que hay una lineas similares con lo disallow y allow haciendo referencia a codecs. Agreguen esto al final de esas lineas, pero eviten las lineas repetidas. ATA de Cisco

Como mencionamos anteriormente, el ATA es un aparato que tiene dos conexiones FXS y una conexión de red. A este equipo se le configura una dirección IP, a travez de DHCP o en forma estática y luego se le debe indicar cual es la dirección del asterisk para que el mismo se registre y pueda llamar y recibir llamados. Para comunicarse con Asterisk, este aparatito usa el protocolo SIP (ver la introducción del rfc 3261 para entender un poco como es o la página del wiki de VoIP).

Los pasos de configuración fueron, basados en este documento http://www.loligo.com/asterisk/Cisco/ATA-186-guide.v20030628.txt:

1. Se reseteo el aparato, levantando el tubo, apretando el boton rojo y marcando 322873738#. 2. Reseteada la configuración, se ingresó vía Web para configurarlo: http://x.x.x.x/dev. x.x.x.x es la IP que el aparato tomo por DHCP. Fíjense en los logs de su DHCP para ver cual es (usando la MAC address). Acá tienen un pantallazo de la configuración utilizada PONER EL PANTALLAZO. 3. Luego se puso lo siguiente en el sip.conf de Asterisk. 4. Y esto en el extensions.conf para poder llamar al aparato.

Una vez configurado todo, el aparato puede llamar a cualquier nro, siempre que corresponda el contexto. Para recibir llamadas hay que marcar la extensión asignada en el último paso.

COMPLETAR ESTO, DIEGOWS Quicknet Linejack

Dentro del hardware también usamos la placa Quicknet Linejack http://www.ip123.net/images/linejack.jpg. Es una placa ISA, muy parecida a un modem de los viejos, pero que esta preparada para VoIP. Puede funcionar como FXO o FXS, según como se la configure. Para las pruebas se la usó como FXS, con un teléfono común y corriente conectado.

La configuración está dividida en dos partes, por un lado hay que cargar el módulo del kernel y por otro configurar el módulo de asterisk que se encarga de trabajar con este tipo de placas.

El driver se obtiene desde http://www.openh323.org/driver/code.html. Para las pruebas se usó la version 3.1.0 usando la versión de kernel 2.4.31. Este driver no tiene mantenimiento desde hace un tiempo y no funciona con kernel 2.6. Para compilar el driver hay que tener el código fuente del kernel que se esta usando o los headers que se usaron para compilarlo (si usan debian o ubuntu, fíjense el paquete kernel-headers que coincida con la versión de su kernel). Su poniendo que el código fuente estaba en /usr/src/linux, los pasos de instalación fueron:

1. tar xfz ixj-3.1.0-src.tar.gz 2. cd ixj-3.1.0 3. ./configure –with-kernel-src=/usr/src/linux && make 4. Luego se copió el archivo phonedev.o y el ixj.o al directorio /lib/modules/VERSION-KERNEL/kernel/drivers/telephony. Una vez copiado ejecutar depmod -a. 5. modprobe ixj para ver si el driver se carga correctamente.

Una vez que funciona el modulo del kernel hay que configurar el asterisk. El módulo de asterisk que se encarga de trabajar con este tipo de placas (conocidas como Linux Telephony Interface) es chan_phone y su archivo de configuración es phone.conf. Se modificaron y/o agregaron los siguientes parámetros:

* context = default, para usar el mismo contexto de las pruebas anteriores. * device = /dev/phone0, el dev file usado por la placa. * txgain = 80%, volumen de lo que se envia. * rxgain = 150%, volumen de lo que se recibe. * mode = dialtone, device que hacer cuando se levanta el tubo del teléfono conectado a la placa. dialtone indica que hay que darle tono al teléfono y esperar para que se marque algún número. Si ponen inmediate hace que se ejecute la extension “s” del contexto indicado arriba. * echocancel = medium, nivel de cancelación de eco.

Una vez que se termina de modificar la configuración, iniciar el asterisk. Cuando arranca las luces que estan en la placa se tienen que prender y cuando levanten el tubo tienen que escuchar tono. A partir de ahi ya pueden marcar cualquier extensión, al igual que como hacían con la placa de sonido, pueden marcar la extensión que quieran y hablar con quien quieran, usando IAX, el ATA o la placa de sonido misma. Escenario de la demostracion de Asterisk

De todo lo que hablamos hasta aca terminamos en el siguiente escenario de demostracion:

La maquinas fueron denominadas como NORTE y SUR, las caracteristicas en comun de cada maquina son:

* Debian Sarge 3.1 * Asterisk, el paquete que trae la version de Debian utilizada. * Postfix, uw-imapd y squirrelmail para poder mostrar la funcionalidad de VoiceMail en ambas maquinas.

A continuacion adjuntamos los archivos de configuracion usados en cada maquina: Configuracion de NORTE extensions.conf

[default] exten => s,1,Wait,1 exten => s,2,Answer exten => s,3,Dial,Phone/phone0

exten => 1086,1,Playback(demo-echotest) exten => 1086,2,Echo exten => 1086,3,Playback(demo-echodone)

exten => 1000,1,BackGround(demo-moreinfo) exten => 1000,2,Wait,4 exten => 1000,3,HangUp

exten => 1001,1,Dial(Phone/phone0)

exten => 2001,1,Dial(IAX2/norte@10.10.10.124/2001)

exten => 2086,1,Dial(IAX2/norte@10.10.10.124/2086) phone.conf

[interfaces] mode=dialtone format=slinear echocancel=medium context=pstn txgain=80% rxgain=150% device => /dev/phone0

Esta es la configuracion de la placa de VoIP Linejack, la parte que le toca a Asterisk. La instalacion del driver se explico en una seccion anterior. iax.conf

[general] bandwidth=low disallow=lpc10 disallow=speex allow=gsm jitterbuffer=no

tos=lowdelay [sur] type=user host=10.10.10.124 context=default

Las ultimas cuatro lineas son las mas importantes de este archivo, que permiten la conexion de la maquina SUR. Las primeras lineas son parametros generales, se destaca aca que estamos forzando el codec GSM que es el que mejor ancha con Asterisk (en cuanto a calidad y ancho de banda, sumado a que este codec es libre). Configuracion de SUR extensions.conf

[default] exten => s,1,Wait,1 ; Wait a second, just for fun exten => s,2,Answer ; Answer the line exten => s,3,Dial,Console/1

exten => 2086,1,Playback(demo-echotest) exten => 2086,2,Echo exten => 2086,3,Playback(demo-echodone)

exten => 2000,1,BackGround(demo-moreinfo) ; Give some more information. exten => 2000,2,Wait,4 exten => 2000,3,HangUp

exten => 2001,1,Dial,SIP/2299,10,r

exten => 1086,1,Dial(IAX2/sur@10.10.10.123/1086@default)

exten => 1001,1,Dial(IAX2/sur@10.10.10.123/1001@default) sip.conf

[general] context=default port=5060 bindaddr=0.0.0.0 srvlookup=yes

[2299] type=friend username=2299 secret=lanux canreinvite=no host=dynamic dtmfmode=rfc2833 mailbox=2299 nat=1

Esta es la configuracion para que el Asterisk pueda comunicarse con el ATA. Esto esta descripto en el documento que se hace referencia en un seccion anterior del ATA. iax.conf

[general] bandwidth=low disallow=lpc10 disallow=speex allow=gsm

jitterbuffer=no

[norte] type=user host=10.10.10.123 context=default

Lo mismo que hicimos en el otro equipo, nada mas que ahora cambiamos los parametros y aca dejamos entrar a NORTE. Links

Asterisk Digium - La empresa que banca a Asterisk OpenH323 Quicknet, la que fabrica placa linejack (FXO/FXS) El mejor link que hay sobre VoIP TODO

hablar un poco de los contextos y explicar un poco mas el extensions.conf comentar algo de la estructura modular del asterisk. mejorar la definicion de Voz sobre IP. hablar de la seccion de codecs del iax.conf, encontre como hacer que siempre las llamadas sean con GSM. BIENVENIDO SEA CUALQUIER APORTE AL DOCUMENTO!!!

diegows@linux.org.ar y pidanme el usuario y password para hacer alguna modificacion.

Meta

Published: Nov. 24, 2007

Author: admin

Comments:  

Word Count: 3797

Next: Estamos de Vuelta

Previous: Estamos de Vuelta

Bookmark and Share

Tags

general hardware linux modem software