# Introducción

Desde el punto de vista técnico, la red telefónica tradicional (PSTN) no ha tenido una gran evolución desde su invención a fines del siglo XIX. A la vez, existe una tendencia cada vez mayor a enviar la señal de voz en forma digital, en paquetes a través de la red de datos, en lugar de utilizar la red telefónica convencional (PSTN). Esto muestra que la convergencia de la voz y los datos hacia una misma red, es y será una realidad del siglo XXI.
El grupo de recursos que hacen posible que la señal de voz viaje a través de Internet empleando el protocolo IP, es llamado Voz sobre IP (VoIP). Es una tecnología con un crecimiento muy alto, en la cual apostaron muchas empresas. La principal ventaja de este tipo de servicios es que evita los cargos altos de telefonía (principalmente de larga distancia) usuales de la red PSTN. La reducción en los costos se debe principalmente a la utilización de una misma red para transportar voz y datos; en especial cuando los usuarios no utilizan la totalidad de la capacidad de su red, la cual puede ser usada para VoIP sin un gran costo adicional.
Otro beneficio a destacar, es la amplia gama de soluciones comerciales, que permiten construir redes de telefonía con servicios adicionales, tales como buzón de voz, Voice-mail, multiconferencia, servidor vocal interactivo (IVR), distribución automática de llamadas, entre otras.
Al mismo tiempo, se crearon comunidades de programadores con el fin de desarrollar soluciones Open Source de VoIP.
Los programas Open Source tuvieron un gran éxito en los ámbitos empresariales y universitarios debido a su eficiencia, lo que los volvió competitivos, en muchas áreas, en relación a las soluciones propietarias existentes. Dichos programas Open Source buscaron evitar los problemas inherentes a los sistemas propietarios tradicionales con lo que lograron; minimizar los costos, mejorar la flexibilidad, el mantenimiento y soporte de equipos, así como también permitir que cada usuario pueda tener el control de su propio sistema.
El desarrollo de aplicaciones open source, hace posible el fácil acceso y en forma económica, a sistemas de comunicación VoIP y a información asociada (manuales, tutoriales, HowTo, URL oficiales, foros, etc) lo que facilita la implementación de estos sistemas.

## Ejemplo

Es posible tener acceso a una central telefónica PBX (Asterisk), a la cual se le conecten usuarios VoIP mediante softphones ambos disponibles en Open Source. Con esto se puede realizar una implementación donde se les asigna extensiones telefónicas y buzones de voz a estos usuarios, con lo cual se pueden comunicar entre sí o dejarse mensajes de voz en caso que el destinatario no esté disponible. Además es posible agregar una funcionalidad más avanzada que permita que el mensaje de voz sea enviado al correo electrónico de su destinatario con un cierto formato. Para ello se requiere el uso de un servidor de correo, también disponible en Open Source.

# Sistemas requeridos para el ejemplo citado
## Asterisk

Asterisk es un software Open Source que proporciona funcionalidades de central telefónica (PBX).
Originalmente fue creado para sistemas Linux, actualmente existen versiones para sistemas OpenBSD, FreeBSD, Mac OS X, Solaris y Windows. Igualmente Linux sigue siendo la que más soporte presenta.
Permite la conexión de teléfonos analógicos (para los cuales es necesario utilizar tarjetas electrónicas telefónicas FXO o FXS), teléfonos digitales, terminales IP y softphones ya que soporta muchos protocolos de VoIP como ser SIP, IAX, H.323 y MGCP
Cuenta con servicios de buzón de voz, creación de extensiones, mailserver, envío de mensajes de voz a e-mail, llamadas en conferencia, IVR, distribución automática de llamadas, entre otras. A su vez, cada usuario puede crear su propias funcionalidades a través de la creación de un dialplan o añadiendo módulos en lenguajes de programación soportados por Linux.

### Dialplan

Es el corazón del sistema Asterisk, en él se define como se van a manejar las llamadas. Consiste en un conjunto de instrucciones o pasos que Asterisk debe seguir y es completamente adaptable y personalizable. El dialplan se configura en el archivo extensión.conf. Dentro de él se manejan los siguientes conceptos: contextos, extensiones, prioridad y aplicaciones.

#### Contextos

Los dialplan están separados en secciones llamadas contextos. El contexto es uno de los parámetros que se especifica al definir un canal, por lo que es el punto de partida para que el dialplan pueda realizar la conexión al mismo. Uno de los usos más importantes del contexto es la seguridad. Permite establecer una comunicación (por ejemplo de larga distancia) sin que quede disponible para otros usuarios. Las extensiones que se encuentran definidas dentro de un contexto, no puede interactuar (a no ser que se le permita) con una extensión de otro contexto.
Se determina con su nombre entre [ ] y tiene una extensión máxima de 79 caracteres. Todas las instrucciones situadas debajo de su nombre, son parte del mismo (hasta el comienzo de uno nuevo).

#### Extensions

En el mundo de las comunicaciones, una extensión se refiere al número que identifica el ring de cierto teléfono. En Asterisk es mucho más que eso. La extensión es la que le indica a Asterisk que pasos debe seguir cuando esa extensión es requerida.
La sintaxis de una extensión es la palabra exten seguida del signo de igual y el de mayor, como se muestra a continuación:
    exten =>
Esta expresión es seguida por el número de la extensión (el cual puede ser una combinación de números y letras), la prioridad (cada extensión esta compuesta por varios pasos, los cuales se ejecutan en el orden establecido por la prioridad), y por la aplicación (o comando) que es la que realiza la acción. Por lo cual una extensión tiene la siguiente sintaxis:
    exten => número, prioridad, aplicación

#### Prioridad

La prioridad es un número que indica el orden en el que se ejecutan los pasos de la extensión.
Generalmente se suele poner la prioridad 1 (en el primer paso a ejecutarse) y luego una n que significa “next”, la prioridad anterior +1. Esto es así para poder agregar pasos intermedios, en un plan de numeración ya existente, sin tener que renumerar las prioridades manualmente, lo cual puede tornarse engorroso.
A continuación se muestra un ejemplo:
    exten => 123,1,Answer
    exten => 123,n,hacer algo
    exten => 123,n,hacer algo más
    exten => 123,n,Hangup
Se pueden colocar etiquetas a la prioridad de manera de poder referirse a ella no solo por su número. Para ello se coloca la etiqueta entre paréntesis curvos a continuación del número de prioridad.
    exten => 123,n(etiqueta),aplicación

#### Aplicaciones

Las aplicaciones son aquellas que especifican una acción concreta en el canal, por ejemplo, reproducir un cierto sonido, aceptar un tono de entrada, terminar una llamada, etc. Hay algunas aplicaciones que no requieren de información adicional (argumentos) como ser Answer y Handup. Hay otras a las que se les debe o puede pasar argumentos. Estos se deben colocan entre paréntesis a continuación del nombre de la aplicación. Si son varios argumentos se separan con comas “,” .

## Softphones

Un softphone es un software que provee funcionalidades de un teléfono convencional. Generalmente opera en un entorno Voz sobre IP. Está basado en un protocolo de señalización, el cual puede ser estandarizado (SIP, H.323, IAX) o privativo. Existen diversos softphones disponibles, algunos de estos son: sjphone, X-Lite, Ekiga, kphone y kiax.

## Servidores de correo

Un servidor de correo está conformado por varios agentes que pueden estar presentes o no en el mismo servidor.
Uno de ellos es el agente de transporte de mail o MTA (Mail Transport Agente), encargado de enviar y recibir mensajes desde y hacia otros MTA. El MTA toma el mensaje enviado por el cliente MUA (Mail User Agent) y determina a donde enviarlo, sabiendo además como actuar ante un error. También recibe los mensajes dirigidos a los clientes MUA y los coloca en sus respectivas casillas de correo. Existen diversos MTA en Unix/Linux, entre ellos cabe mencionar a sendmail y postfix.
Otro agente es el cliente de correo electrónico (MUA). Éste es un programa ejecutado por los usuarios para poder leer y escribir los mensajes.

# Configuraciones

Tomando el ejemplo citado en la introducción, a continuación se van a detallar las configuraciones necesarias en cada uno de los sistemas para lograr su realización.

## Asterisk

Los archivos de configuración de Asterisk, en sistemas Debian o Ubuntu por ejemplo, se ubican en /etc/asterisk. De todos estos, sólo es necesario configurar tres de ellos para la creación de nuevos usuarios SIP cada uno con su extensión, su buzón de voz y el voicemail activado. Por lo que los archivos a configurar en este caso son: sip.conf (en el caso de haber elegido SIP como protocolo de señalización), extensions.conf y voicemail.conf.

### sip.conf

En el archivo sip.conf se configura todo lo relacionado a la creación de nuevos usuarios SIP, las conexiones con proveedores SIP y al propio protocolo SIP.
Este archivo se divide en secciones. Una de ellas es la sección [general] donde se encuentra la configuración por defecto de todos los usuarios y "peers" (proveedores). Los distintos parámetros de dicha configuración se pueden sobrescribir en las secciones de cada usuario, donde también se configuran los perfiles de los usuarios SIP, que van a ser identificados por Asterisk. Un usuario puede ser un peer (autentica llamadas salientes), un user (autentica llamadas entrantes) o un friend (autentica llamadas en ambos sentidos). Su perfil se define a partir del nombre entre corchetes.
A continuación se presentan algunos parámetros de interés a configurar con sus valores asociados. Cabe destacar en la sección general los siguientes:
    [general]
    context=default ;Define el contexto por defecto para llamadas entrantes
    port=5060 ;Puerto UDP donde responderá Asterisk
    bindaddr=0.0.0.0 ;En el caso de especificar una IP donde esté Asterisk (si un equipo tiene más de una IP por ejemplo) 0.0.0.0 vale para cualquiera
    srvlookup=yes ;Habilita servidor DNS (se permite llamadas SIP basadas en nombre de dominios)
Para el caso en estudio, se crean dos nuevos usuarios SIP. Dentro de la configuración de estos es importante notar que ambos se asocian a un mismo contexto, denominado comunicaciontel, para que puedan comunicarse entre sí sin necesidad de realizar configuraciones adicionales.
Los parámetros username y secret permiten identificar al nuevo usuario SIP. Esta información es empleada para que el usuario se pueda autenticar en el softphone.
Un último parámetro a destacar es mailbox. En él se define el número de identificación del buzón de voz, que generalmente corresponde al número de extensión asociada y el dominio al cual pertenece.
    [UsuarioA]
    type=friend
    host=dynamic
    username=UsuarioA
    secret=1234
    nat=no
    canreinvite=no
    context=comunicaciontel
    mailbox=20000@local
    [UsuarioB]
    type=friend
    host=dynamic
    username=UsuarioB
    secret=4321
    nat=no
    canreinvite=no
    context=comunicaciontel
    mailbox=20100@local

### extensions.conf

El archivo extensions.conf es el de mayor importancia de Asterisk. Su principal misión es definir el plan de numeración (dialplan) que seguirá la central para cada contexto y en consecuencia para cada usuario.
Al igual que el archivo sip.conf, extensions.conf se compone de secciones o contextos identificados por su nombre entre corchetes. Dentro de estos cabe mencionar dos que siempre se encuentran presentes: [general] y [globals]. El primero de ellos configura unas pocas opciones generales cuyos valores por defecto se pueden mantener. El otro define variables globales que se van a poder emplear en los demás contextos. Los restantes contextos presentan los planes de numeración personalizados.
La sintaxis de las líneas de un contexto para el plan de numeración es:
    exten => extension, prioridad, aplicación(argumentos)
Cada uno de estos conceptos fueron explicados anteriormente en la sección referente a Dialplan.
Para el caso particular del ejemplo con el que se está trabajando, se definen dos extensiones (20000 y 20100) cada una correspondiente a uno de los usuarios creados en el archivo sip.conf. Ambas presentan el mismo comportamiento y se encuentran bajo el mismo contexto, definido anteriormente en sip.conf.
Al discar el número de una de las extensiones en el softphone, se llamará al usuario SIP correspondiente haciendo timbrar su softphone por un período de tiempo de 20 segundos. Si el usuario llamado no contesta durante ese período, se activará el buzón de voz, permitiendo escuchar el mensaje de bienvenida, las instrucciones y para posteriormente dar el espacio para la grabación del mensaje.
Las tres aplicaciones empleadas para lograr el funcionamiento descrito anteriormente son Dial, Voicemail y Hangup.
Los parámetros de Dial para este ejemplo, especifican a que usuario SIP llamar y el período de tiempo en el cual se escucha el timbrado.
Los de Voicemail, determinan el número de buzón de voz con el dominio correspondiente (local) al cual se debe acceder y bajo que circunstancias (por ejemplo: ausencia del destinatario (u) o línea ocupada (b)).
Se definieron además otras dos extensiones (3200 y 3201) para poder acceder directamente, mediante el marcado del número, a cada una de las casillas de voz de los usuarios. Esto se logra a través de la aplicación VoiceMailMain.
    [comunicaciontel]
    exten => 20000,1,Dial(SIP/UsuarioA,20)
    exten => 20000,2,Voicemail(20000@local,u)
    exten => 20000,3,Hangup
    exten => 20100,1,Dial(SIP/UsuarioB,20)
    exten => 20100,2,Voicemail(20100@local,u)
    exten => 20100,3,Hangup
    exten => 3200,1,VoiceMailMain(20000@local)
    exten => 3201,1,VoiceMailMain(20100@local)

### Voicemail.conf

En el archivo voicemail.conf se crean y gestiona los buzones de voz de los usuarios.
Este fichero, al igual que los dos archivos de configuración anteriores, se compone de secciones o contextos. Dos contextos a destacar aquí, siempre presentes son: [general] relativo a las configuraciones generales del buzón de voz y [zonemessages] donde se definen las zonas horarias, necesarias para informar la hora en que recibió el mensaje. Los demás contextos están relacionados a la personalización de los buzones de voz, y se encuentran identificados por el nombre del dominio del buzón de voz. En estos contextos se define la clave secreta necesaria para autenticarse y escuchar los correos de voz y la dirección de correo a la cual se le enviará el mensaje de voz, en formato .wav según como fue configurado en la sección general.
    [general]
    format=wav|wav49|gsm
    attach=yes ;Adjunta el mensaje de voz al enviar el correo
    maxmessage=180
    minmessage=3
    saycid=yes
    maxlogins=3
    cidinternalcontexts=house_local,house_toll,house_admin
    mailcmd=/usr/sbin/sendmail –t
    [local]
    20000 => 5678,Federica,federica@localhost.org
    20100 => 8765,Claudia,claudia@localhost.org

## Softphone

Para la configuración de un softphone se requiere crear los perfiles de usuarios. En ellos se define:
* el SIP Proxy (IP del servidor Asterisk)
* el puerto (generalmente 5060, como se especificó en el archivo sip.conf)
* nombre del usuario (para ser identificado al realizar una llamada)
* cuenta y contraseña (aquella asignada en el archivo sip.conf)
Para obtener más detalles relativos a la configuración (HowTo) es recomendable el siguiente link: configuración softphone

## Postfix

Para enviar por correo electrónico los mensajes del buzón de voz, es necesario instalar por lo menos un MTA.
Por facilidad en la administración, instalación y configuración es recomendable postfix.
La comunicación entre Asterisk y postfix se logra mediante la sentencia: sendmail –t presente en el archivo de configuración voicemail.conf dentro del parámetro mailcmd (mailcmd=/usr/sbin/sendmail –t)

# Conclusión

Se pudo experimentar que es posible realizar soluciones telefónicas utilizando únicamente herramientas Open Source las cuales se encuentran disponibles en forma gratuita y cuentan con abundante información accesible a cualquier usuario.

## Véase también

* Configuración sip.conf
* Configuración extensión.conf
* Configuración voicemail.conf
* configuración sjphone
* Manual Asterisk
* softphone
* servidor de correo
* VoIP
* Implementación de una solución de VoIP en Linux