Ver Indice Tutorial

Instalación de Asterisk

Antes de instalar cualquier servicio, siempre se recomienda por motivos de seguridad actualizar la máquina en la que vayamos a realizar dicha instalación. En este caso, se ha decidido instalar Asterisk en un SO Debian 7 y para ello vamos a seguir los siguientes pasos:

  1. Actualizar la máquina y reiniciarla:

    sudo apt-get update
    sudo apt-get upgrade
    reboot

  2. Instalar las librerías que sean necesarias:

    sudo apt-get install build-essential
    sudo apt-get install libncurses5-dev libnewt-dev libmysqlclient-dev libmyodbc libssl-dev libxml2-dev unixodbc-dev libsqlite3-dev uuid-dev libbison-dev

NOTA - Para no tener que estar escribiendo continuamente ' sudo ', se puede cambiar el usuario a ' root ' y trabajar durante todo el proceso de instalación como ' root '.

  1. Se descargan y descomprimen los ficheros de Asterisk:

    wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/certified-asterisk-11.6-current.tar.gz
    tar zxvf certified-asterisk-11.6-current.tar.gz
    cd certified-asterisk-11.6-current

  2. Instalación del servicio de Asterisk:

    ./configure
    make menuselect
    make
    make install
    make samples
    make config

NOTA - Para cambiar algo en los ficheros de configuración tendremos que utilizar un editor como nano, vim o cualquier otro que se ajuste más a las preferencias del administrador del sistema.

  1. Para lanzar Asterisk, o si se realiza algún cambio en la configuración y es necesario reiniciar el servicio, existen varias alternativas desde la terminal. La más recomendada es parar y volver a arrancar el servicio:

    /etc/init.d/asterisk stop
    /etc/init.d/asterisk start

    O bien...

    service asterisk stop
    service asterisk start


Configurando Asterisk - sip.conf

Los dos ficheros de configuración más importantes de Asterisk posiblemente son el sip.conf que es el fichero que permite definir los canales SIP, tanto para llamadas entrantes como salientes, y el fichero extensions.conf que es el que define el comportamiento que va a tener una llamada en nuestra centralita (qué reglas rigen su enrutamiento o qué aplicaciones van a ejecutar). Si en vez de utilizar el protocolo SIP se prefiere trabajar con IAX2, será necesario configurar el fichero iax2.conf de forma muy parecida a como se hace con el sip.conf .

Lo primero es que, al igual que ocurre con otros ficheros de configuración de Asterisk, el fichero sip.conf se encuentra dividido en secciones cuyos nombres, a su vez, se encuentran definidos entre corchetes. La primera de ellas, [general] , permite definir las opciones generales de cada canal y, en consecuencia, los parámetros generales de cada cliente.

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

Ya que los clientes SIP deben ser declarados previamente para poder lanzar o recibir llamadas, lo siguiente que se puede hacer es definir uno o varios contextos para los posibles clientes del servicio que proporciona Asterisk. Algunos de los parámetros de configuración más importantes en este caso serán:

  • type - Tipo de cliente SIP. Existen 3 tipos: peer , user y friend en función de cómo se manejan las llamadas entrantes/salientes y cómo se identifica el usuario.
  • secret - Contraseña que utiliza el cliente para autenticarse en el sistema.
  • host - Dirección IP o nombre del host que utiliza el cliente. Si está asignada de manera dinámica por DHCP, ' dynamic '.
  • context - Contexto al que pertenece el cliente.
  • qualify - Si está puesto a ' yes ', se monitoriza el estado de la extensión.
  • mailbox - Indica el buzón de voz correspondiente a esa extensión.

Para definir dos extensiones, la 102 y la 103 utilizando estos y algunos parámetros más...

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

[102]
type=friend
secret=1ezkR
host=dynamic
context=ext_internas
callerid="Jose Luis" <102>
dtmfmode=rfc2833
qualify=yes
mailbox=1002@default
...

[103]
type=friend
secret=e7uKz
host=dynamic
context=ext_internas
callerid="Beatriz" <103>
dtmfmode=rfc2833
qualify=yes
mailbox=1003@default
...

Si fuera necesario configurar cientos de extensiones, quizás sea más cómodo de cara a la programación definir una máscara y aplicarla a cada una de las extensiones que se quiera crear. En este caso, a la máscara se le ha llamado extensiones-internas y se han definido las extensiones 102 y 103 cambiando únicamente los parámetros necesarios.

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

[extensiones-internas](!)
type=friend
host=dynamic
context=ext_internas
dtmfmode=rfc2833
qualify=yes
...

[102](extensiones-internas)
secret=1ezkR
callerid="Jose Luis" <102>
mailbox=1002@default

[103](extensiones-internas)
secret=e7uKz
callerid="Beatriz" <103>
mailbox=1003@default

Para profundizar en este tema lo mejor es coger el fichero de configuración por defecto, o de ejemplo, que trae Asterisk y leerse uno a uno cada uno de los parámetros que incluye. Con algo de experiencia, y muchas ganas de aprender, se depura cualquier fallo en las comunicaciones que se produzca por una mala configuración de los clientes SIP.

Configurando Asterisk - extensions.conf

El fichero de configuración extensions.conf es el que controla el plan de marcado ( dialplan ) de la centralita. Se puede decir que es el corazón de Asterisk ya que define cómo se comportarán las llamadas entrantes y salientes en el sistema.

Este fichero está compuesto por contextos, extensiones y prioridades. Se comenta brevemente en qué consiste cada una de ellas:

  • Contextos - Los contextos son cada una de las secciones en las que está dividido el dialplan y es lo que permite separar o incluir fragmentos de código en éste. Existen 3 contextos reservados: general , global y default . Si una extensión, de las que hay definidas en el fichero sip.conf , tiene como parámetro context un contexto de los que hay definidos en el dialplan, cuando dicha extensión efectúe una llamada, empezarán a ejecutarse las líneas de código asociadas a dicha extensión en ese contexto.

  • Extensiones - Una extensión es cada una de las llamadas que permiten ejecutar un fragmento de código de un contexto. Cuando una extensión llama a un número u otra extensión, lo normal es tener líneas de código dentro del dialplan que le indiquen al sistema cómo tiene que tratar esa llamada. Por ejemplo: Primero que se descuelgue la llamada, luego que salte una locución y que se llame a dos destinos de manera simultánea. Una extensión se define como un conjunto de valores: (número de extensión,prioridad,aplicación a ejecutar) . El primero de ellos, el " número de extensión ", es el patrón que hay que marcar dentro de dicho contexto para llamar al destino objetivo. La " prioridad " indica el orden en el que se van a ejecutar las sucesivas instrucciones asociadas a un mismo " número de extensión " y la " aplicación a ejecutar " es la orden que se va a ejecutar en la línea dada por el " número de extensión " y la prioridad " prioridad ".

Con una presentación de un caso práctico, todos estos conceptos quedarán más claros.

[llamadas-entrantes]
exten => 958993803,1,NoOp(Tenemos una llamada entrante...)
exten => 958993803,2,Answer()
exten => 958993803,3,Playback(bienvenida)
exten => 958993803,4,Dial(SIP/958)
exten => 958993803,5,Hangup()

[llamadas-salientes]
exten => 20001,1,Dial(SIP/102&SIP/103)
exten => 20001,2,Hangup()

exten => 20002,1,Dial(SIP/104&SIP/105)
exten => 20002,2,Dial(SIP/106)
exten => 20002,3,Hangup()

Se puede ignorar el número de la prioridad si ésta se edita como same => n, (' n ' de ' next ). Con esta opción no sólo se gana en rapidez a la hora de programar la centralita sino que también se evita tener que cambiar todas las líneas posteriores para esa misma extensión en caso de añadir nuevas líneas en el futuro.

[casa]                             ; Nombre del contexto
exten => 30001,1,NoOp(IVR de casa) ; NoOp es una aplicación que no hace nada más que mostrar por el CLI de Asterisk el mensaje que se le indique como parámetro.
same => n,Answer()                 ; Para responder la llamada
same => n,Wait(1)                  ; Esperar un segundo antes de seguir ejecutando el dialplan
same => n,Playback(mensaje-de-bienvenida) ; Reproducir un mensaje de nombre 'mensaje-de-bienvenida'
same => n,Dial(IAX2/2014)          ; Llamar a través del protocolo IAX2 a la extensión 2014 definida en el fichero iax.conf
same => n,Hangup()                 ; Terminar la llamada

También se pueden definir patrones de marcado para ejecutar el mismo fragmento de código para múltiples y distintas extensiones. Por poner un ejemplo de una oficina con 5 extensiones, podemos escribir un fragmento de código que se ocupe extensión a extensión de que los usuarios puedan llamarse entre sí o podemos generar un único fragmento de código con un patrón de marcado ( pattern ) que permita llamar a distintos destinos en tan sólo 3 líneas de código:

[empresa]
exten => _400X,1,NoOp(Llamando a la extensión ${EXTEN})
same => n,Dial(SIP/${EXTEN})
same => n,Hangup()

Con estas 3 líneas la centralita interpreta que si se llama a cualquiera de las extensiones definidas por el patrón de marcado 400X (en el rango: 4000, 4001, 4002,... 4009 ), estaremos llamando al cliente SIP con número de cliente igual al valor almacenado en la variable reservada EXTEN y que coincide con el número que se acaba de marcar. Como se puede observar, el juego que da un patrón de marcado es muy amplio.