Curso Asterisk (IV): El Dialplan

En la anterior entrada vimos cómo dar de alta algunas extensiones internas, y trabajamos muy por encima con el Dialplan para poder llamar de una extensión a otra.

El Dialplan es el verdadero corazón de Asterisk y de cualquier sistema VoIP. El Dialplan, o plan de marcado, es una colección ordenada de acciones que se ejecutan cuando alguien marca un número dentro de nuestro Asterisk. El ejemplo más trivial sería que cuando alguien marca la extensión de otra persona, por ejemplo “3001”, suene el teléfono de ese usuario. Sin embargo, se pueden hacer cosas mucho más avanzadas, como por ejemplo gestionar las llamadas en función de un horario, crear una centralita automática de recepción de llamadas, grabar conversaciones, poner música en espera, etc.

Antes de entrar en lo que se puede hacer con el Dialplan, vamos a definir algunos conceptos básicos.

CONCEPTOS BÁSICOS

Extensiones

Definición: Una extensión es una marcación en el teclado de un teléfono.

Por ejemplo, un usuario podría marcar “3001” en su teléfono, y eso sería una extensión. También podría marcar un número de teléfono nacional, como por ejemplo “915881000”, y también sería una extensión.

Aunque lo normal es que las extensiones sean numéricas, no debemos pensar sólo en números, ya que en Asterisk también se pueden definir extensiones como texto. Por ejemplo, “pizza” sería una extensión válida.

Un plan de marcado empieza con una colección de extensiones a las que se puede llamar. Esta definición de extensiones puede ser literal, o puede ser una expresión. Por ejemplo, si hemos definido las extensiones desde la 3001 hasta la 3009, podemos definirlas en nuestro dialplan enumerándolas una detrás de otra, de forma literal:

  • 3001
  • 3002
  • 3003
  • 3004
  • 3005
  • 3006
  • 3007
  • 3008
  • 3009

Sin embargo, si todas ellas van a tener la misma colección de acciones (en general, pasar la llamada a la extensión marcada), sería mucho más cómodo definirlas todas a la vez con una expresión:

  • _300X

Las expresiones van precedidas de guión bajo “_”, que indica que lo que viene a continuación es una expresión que puede cuadrar con más de una extensión. Para definir expresiones en Asterisk disponemos del siguiente lenguaje:

Símbolo Significado
X Cualquier cifra de 0 a 9
Z Cualquier cifra de 1 a 9
N Cualquier cifra de 2 a 9
[x-y] Cualquier cifra de "x" a "y"
[xyz] Las cifras "x", "y" o "z"
. Una o más repeticiones del símbolo anterior
! Cero o más repeticiones del símbolo anterior

En general necesitaremos hacer uso de expresiones para definir las extensiones de nuestro sistema, ya que hay cosas que no se pueden hacer de forma literal. Por ejemplo, no podemos definir uno a uno todos los números de teléfono posibles de España. Lo lógico es decir “los teléfonos móviles en España empiezan por “6” y tienen 9 dígitos en total”, y no empezar a enumerar las 1.000.000.000 (mil millones) de posibilidades existentes. Veamos algunos ejemplos:

Significado Expresión
Todas las extensiones de 4 cifras _XXXX
Todas las extensiones de 4 cifras que empiecen por 3 _3XXX
Móviles de España que empiecen por 6 _6XXXXXXXX
Móviles de España que empiecen por 7 _7[1-4]XXXXXXX
Fijos de España que empiezan por 9 _9[1-8]XXXXXXX
Todos los fijos de España _[8-9][1-8]XXXXXXX

A continuación veremos cómo se relacionan las extensiones con las acciones, llamadas “aplicaciones” en Asterisk.

 

Aplicaciones (acciones)

Definición: Las aplicaciones son el conjunto de acciones a ejecutar cuando un usuario inicia una llamada.

Por ejemplo, supongamos que cuando alguien marque “3001”, queremos que suene el teléfono de esa persona. Sería algo así:

También podríamos querer darle un mensaje a la persona que llama antes de pasar la llamada a destino. Por ejemplo:

O pasar la llamada sólo entre las 10h de la mañana y las 20h de la tarde:

Las aplicaciones más utilizadas son las siguientes:

Aplicación Ficha Descripción
Answer URL Descuelga la llamada entrante
Dial URL Realiza una llamada saliente
Hangup URL Termina la llamada en curso
Wait URL Espera X segundos antes de continuar con la siguiente acción
Festival URL Utiliza el sintetizador Festival para emitir mensajes de voz
Playback URL Reproduce un archivo de sonido o vídeo
SayUnixTime URL Dice la fecha y hora actual a la persona llamante
Background URL Reproduce música en espera
NoOp URL No realiza ninguna operación, pero imprime el mensaje indicado en la consola de Asterisk
ExecIf URL Ejecutar la aplicación indicada si se cumple la condición dada
ExecIfTime URL Ejecutar la aplicación indicada si se cumple el requisito de fecha y hora indicados

En esta página web se puede ver un listado completo de aplicaciones de Asterisk junto con la descripción y sintaxis de cada una de ellas:

Asterisk Applications

 

Prioridades

En un lenguaje de scripting, las acciones se van ejecutando de arriba a abajo, en orden. En cambio, en Asterisk, el orden en el que se ejecutan las acciones debe ser explícitamente indicado mediante números. Así, primero se ejecutará la acción 1, después la acción 2, y así sucesivamente.

Es decir, en los ejemplos anteriores no basta con poner las aplicaciones (acciones) una debajo de la otra. Hay que indicar numéricamente el orden, de forma explícita.

Definición: La prioridad representa el orden en el que se ejecutarán las acciones del dialplan.

La sintaxis para indicar el orden la veremos a continuación.

 

PONIENDO TODO JUNTO

Hemos visto cómo se definen las extensiones mediante expresiones, qué aplicaciones (acciones) podemos utilizar, y también que es necesario especificar de forma explícita el orden de éstas. ¿Cuál es la sintaxis de Asterisk para poner todo esto junto?

Por ejemplo, supongamos que cuando alguien marque la extensión 3001, se pase la llamada sólo entre las 10h de la mañana y las 20h de la tarde:

Generalizando el ejemplo anterior, supongamos que queremos el mismo comportamiento cuando alguien marque cualquier extensión desde la 3001 hasta la 3009. Para esto, lo más cómodo es utilizar expresiones:

Fijaos que en este caso hemos utilizado la variable ${EXTEN} dentro de la llamada a Dial() para que se lance la llamada a quien corresponda. La variable ${EXTEN} es una de las variables básicas que utilizaremos, y que contiene la extensión marcada por la persona llamante.

 

PONIENDO TODO JUNTO: VARIANTES

En “Poniendo todo junto” hemos visto la sintaxis básica del dialplan de Asterisk. Sin embargo, a la larga es una sintaxis muy engorrosa de mantener. El problema es que hay que repetir la expresión en cada línea, y hay que indicar la prioridad de ejecución cuando lo normal es que las acciones se ejecuten de arriba a abajo.

Supongamos este dialplan de ejemplo, donde la expresión cuadra con todos los fijos nacionales de España en formato internacional:

Si quisiéramos introducir una nueva aplicación entre Wait() y Dial(), nos obligaría a actualizar los números de prioridad de todas las aplicaciones que vienen debajo. Si el dialplan fuese mucho más largo, digamos 50 acciones en lugar de 5, imaginaos el engorro que puede suponer esto.

Una solución mejor es indicar que las aplicaciones se ejecuten de forma consecutiva, de arriba a abajo. Para esto, podemos utilizar la prioridad “n”, que indica “next”. De esta forma, podemos introducir nuevas aplicaciones en mitad de un dialplan sin tener que actualizar los números de prioridad. Sólo tenemos que indicar cuál es la prioridad “1”, y utilizar prioridad “n” para el resto:

Por otro lado, cambiar la expresión de las extensiones a las que se hacen referencia también resulta un engorro, ya que la expresión aparece en cada una de las líneas del dialplan. Si quisieramos que el segundo dígito admitiera “cero” para poder llamar a números “902 XXX XXX”, tendríamos que modificar cada una de las líneas de este dialplan. Sin embargo, hay otra sintaxis que permite definir la expresión sólo una vez, e indicar en las siguientes líneas que se trata de la misma extensión:

Esta última sintaxis es la que utilizaremos en el presente curso a partir de ahora, ya que es la más cómoda y compacta de todas las posibles.

 

CONTEXTOS

Ya hemos visto cómo se definen las extensiones de marcación y las acciones asociadas a ellas. Según lo estudiado hasta ahora, todos los usuarios tienen las mismas libertades. Ya que no todos los usuarios son iguales, necesitamos algún mecanismo que nos permita variar el comportamiento del sistema en función del mismo. Eso son los contextos.

Cuando definimos un usuario en sip.conf le asignamos un contexto. Cuando ese usuario inicia una llamada, se utiliza ese contexto del dialplan para ver qué extensiones tiene accesibles y qué acciones debe realizar el sistema.

Definición: Los contextos representan la unidad de organización más básica del dialplan de Asterisk. Un contexto engloba extensiones y acciones. Se utiliza para aumentar la seguridad del sistema, y para ofrecer servicios diferenciados en función del usuario.

Un contexto se define de la siguiente manera:

 

EJEMPLO COMPLETO

Supongamos un hotel con una recepción y tres habitaciones que cumple lo siguiente:

  • Para llamar a la recepción hay que marcar “0”
  • Para llamar a las habitaciones hay que marcar el número de habitación: “101”, “102” o “103”
  • La recepcionista puede llamar a cualquier habitación
  • Los huéspedes sólo pueden llamar a recepción (no pueden llamar a otras habitaciones)

Índice del Curso Asterisk:

Crónica de una migración a Pepephone ADSL desde Jazztel

Llevo año y medio contento con mi conexión VDSL2 de Jazztel, con 30 Mbps de bajada y 3,5 Mbps de subida. La conexión es fabulosa, y más con la distancia que tengo hasta la central (unos 100 metros), que me proporciona velocidades reales rozando lo teórico. Pero el precio, si bien está en la media, no me convencía del todo.

Cuando Pepephone lanzó su ADSL Naked sin línea fija de teléfono, llamó mucho mi atención. Que alguien se atreviera a lanzar al mercado un ADSL sin teléfono con unas características decentes me pareció fabuloso, a la par que alineado con mi reciente interés por la VoIP como sustituta definitiva de la telefonía fija tradicional. Cada vez que lo pensaba, el binomio Pepephone + Netelip me parecía más atractivo. Cuando Pepephone bajó el precio de su ADSL de los 23€ / mes iniciales a los 19,50€ / mes actuales, me terminó de convencer.

Tras hacer unas pruebas de viabilidad de la VoIP en escenario real, me decidí a cambiar al ADSL de Pepephone:

  • Protocolo ADSL2+
  • 20 Mbps de bajada
  • 1 Mbps de subida
  • Sin línea de teléfono
  • Soporte y atención telefónica nacional
  • 19,50€ / mes + IVA, precio final

Lo único que echo de menos en Pepephone es tener un poco más de velocidad de subida. En lugar de 20/1 Mbps, no me importaría que fuera 10/2 Mbps, especialmente para tener más margen con la VoIP cuando estoy descargando torrents. No obstante, no es nada que no pueda arreglar con un poco de QoS en el router.

La migración a Pepephone ha sido bastante rápida. Ha tardado exactamente 7 días,  lo que no está mal teniendo en cuenta que la inicié un martes por la tarde, y que el viernes era festivo. Si la hubiese iniciado el lunes a primera hora, probablemente el jueves me hubiesen hecho el cambio en la central. Aquí está la crónica:

  • Martes, 22 de octubre, 16:30h: Inicio la portabilidad desde la página web de Pepephone.
  • Miércoles, 23 de octubre, 18:00h: Me llaman desde Jazztel para tratar de retenerme. A pesar de que me hacen una oferta tentadora, estoy decidido a continuar con la portabilidad y así se lo hago saber.
  • Jueves, 24 de octubre, 8:30h: Recibo confirmación por parte de Pepephone de que la portabilidad sigue su curso, y me proporcionan los datos de configuración del router.
  • Viernes, 25 de octubre: Festivo en mi comunidad. No habrá nadie en mi central local de telefonía para cambiar cables.
  • Martes, 29 de octubre, 13:00h: Se corta mi conexión con Jazztel, y al de 5 minutos la luz de ADSL del router se vuelve a encender. Compruebo que ha sincronizado en modo ADSL2+ a 20/1 Mbps, por lo que ya estoy conectado al DSLAM de Pepephone (en realidad de Vodafone). Reconfiguro mis routers y ya tengo conexión con Pepephone.

De momento no he tenido ningún problema, aunque aun es pronto para poder afirmar esto. En cuanto a la velocidad, tras hacer algunas pruebas estoy más que satisfecho. La velocidad efectiva de bajada se aleja bastante de la teórica, pero la velocidad de subida se ajusta muy bien a lo esperado:

pepephone_adsl2plus_velocidad

Por comparar, aquí está una prueba realizada con la conexión de Jazztel 30 / 3,5 Mbps. Como se puede ver, con VDSL2 y poca distancia a la central, las velocidades reales se acercan más a las teóricas que con ADSL2+. Sin embargo, la latencia es mayor:

jazztel_vdsl2_velocidad

Conclusiones: El tiempo dirá si la conexión de Pepephone es suficiente para mis usos, pero si no es así, siempre hay tiempo de cambiar a otro operador. De momento estoy satisfecho con los resultados obtenidos, y el ahorro económico es considerable: con Jazztel pagaba 42€/mes con impuestos a pesar de tener un par de promociones aplicadas, y con Pepephone + Netelip + FreeVoIPDeal vengo a pagar unos 28€/mes incluyendo bastantes llamadas al extranjero. Ahora tengo 168€ extras al año para irme de cañas 😉

Configuración regional Cisco SPA112 para España

Lo más cómodo para hablar por telefonía IP es utilizar un teléfono inalámbrico normal, de los de toda la vida. Primero por calidad de audio, segundo por movilidad, y tercero porque es lo que estamos acostumbrados a manejar. El ser humano es un animal de costumbres, y si queremos utilizar telefonía IP como alternativa a la telefonía tradicional, tiene que parecerse lo máximo posible.

En el mercado también existen teléfonos con soporte SIP nativo, pero suelen ser muy caros. Aprovechando que seguro que tenemos un teléfono convencional en casa que podemos usar para este fin, o que podemos comprar a bajo precio, lo más habitual es recurrir al uso de adaptadores VoIP.

El Cisco SPA112 es un dispositivo adaptador que permite utilizar un teléfono convencional para hacer llamadas VoIP vía SIP. Permite la conexión de hasta dos teléfonos convencionales, cada uno con su línea SIP independiente, proporcionando una gran calidad de audio con unos retardos mínimos, sin ruidos ni efectos extraños, y que ofrece las mismas sensaciones que la telefonía analógica tradicional. Es un fabuloso dispositivo con un fabuloso precio, unos 39€ en Amazon España. Sólo hay que conectarlo al router, enchufarlo a la corriente, y tendremos dos rosetas de teléfono normales y corrientes.

spa112

Una de las tareas más complicadas es conseguir que el Cisco SPA112 se comporte como una línea de teléfono española. Como ya habréis notado si sois viajeros, los tonos telefónicos varían de unos países a otros. En concreto el Cisco SPA112 viene de fábrica con los tonos americanos, que no tienen nada que ver con los que estamos acostumbrados a escuchar aquí. De nuevo, para que nos sintamos cómodos con la telefonía IP, debe parecerse lo máximo posible a una línea de teléfono convencional.

Configurar los tonos correctamente para que se asemejen a los españoles no es fácil, ya que apenas se encuentra información en la red. Al final, me he basado en el siguiente documento oficial de Telefónica de España, donde en su página 31 se describen los tonos de señalización de sus líneas de teléfono:

ITE-CA-001 Versión 5, Características Técnicas de las Interfaces de TELEFÓNICA DE ESPAÑA, S.A.U., 18 de octubre de 2004

Por otro lado, hay que recurrir al manual del SPA112, donde a partir de su página 73 describe el lenguaje de scripting que permite definir la frecuencia y cadencia de los tonos del dispositivo:

Cisco SPA100 Series Phone Adapters Administration Guide

A partir de ambos documentos, pude definir la siguiente configuración regional para que el Cisco SPA112 suene exactamente como una línea de teléfono convencional española. Los ajustes deben hacerse en “Voice / Regional / Call Progress Tones”, y son los siguientes:

  • Dial Tone: 425@-10;10(*/0/1)
  • Second Dial Tone: 425@-10;10(*/0/1)
  • Outside Dial Tone: 425@-10;10(*/0/1)
  • Busy Tone: 425@-10;60(0.2/0.2/1)
  • Reorder Tone: 425@-10;60(.2/.2/1,.2/.2/1,.2/.6/1)
  • Ring Back Tone: 425@-10;60(1.5/3/1)
  • Ring Back 2 Tone: 425@-10;60(1.5/3/1)

El resto de opciones las dejamos como están. A partir de entonces, el descolgado, el marcado, el tono de ocupado, etc, serán los de siempre.

CiscoRegional

Asterisk Honeypot

Aprovechando la facilidad con la que puedo crear máquinas virtuales en Proxmox, estos días he montado un segundo Asterisk para capturar ataques. Esto es lo que se llama Honeypot, un servicio o máquina montada como si fuera real, pero que tiene como objetivo obtener información de vectores de ataque y atacantes potenciales.

Los requisitos planteados son los siguientes:

  • Asterisk con configuración SIP segura (allowguest=no y alwaysauthreject=yes)
  • Puerto SIP por defecto para maximizar el número de escaneos (5060/UDP)
  • Un usuario/extensión con contraseña
  • Por supuesto sin proveedores configurados ni posibilidad de hacer llamadas reales
  • Fail2ban para monitorizar los ataques y crujir atacantes

De momento lleva 24h funcionando, y en este tiempo sólo he recibido 25 ataques de 2 atacantes diferentes:

 Lo cierto es que esperaba mucho mayor volumen de atacantes, ya que un servidor SIP vulnerable con posibilidad de enrutar llamadas reales es un objetivo muy goloso. Por ejemplo, por SSH, la cantidad de gente realizando escaneos es inmensa.

Estoy incluso planteándome dejar esta máquina activa de forma permanente, ya que al estar en el puerto SIP por defecto distrae la atención frente al verdadero servidor SIP.

Seguiremos informando de los resultados en esta misma entrada.

OVH suspende completamente los servicios VoIP

Soy cliente de la línea SIP de OVH desde primeros del presente año 2013. El 14 de junio eliminaron los servicios VoIP para nuevas contrataciones, pero prometieron a sus clientes que seguirían ofreciendo el servicio a quienes ya lo tuvieran contratado.

Hoy, he recibido el siguiente email de OVH:

Nos ponemos en contacto con usted para informarle que vamos a dejar de ofrecer el servicio de VoIP el 31 de diciembre de 2013.
Nuestras ofertas de telefonía, lanzadas en 2010 con una gran inversión para brindarle el mejor servicio, no han tenido la acogida esperada. Por ese motivo, hemos tomado la decisión de retirar este producto para centrarnos en el núcleo de nuestra actividad: el alojamiento web.

Los servicios que van a dejar de prestarse son los siguientes :

– 0034*********

En los casos que sea técnicamente posible, puede, si así lo desea, portar su número geográfico a otro operador. Para ello, solo tiene que contactar con nuestro servicio de atención al cliente, que le guiará sobre el procedimiento que debe seguir (más abajo encontrará la información de contacto).

[…]

Por un lado está el amargo sabor de boca que supone que te dejen tirado con un servicio que te gusta. Es tiempo de empezar a buscar alternativas. Pero lo que no tiene sentido es que argumenten falta de acogida cuando, de la noche a la mañana, OVH se hizo realmente famoso en multitud de foros tras el lanzamiento de su servicio de telefonía IP en España, y más aun con la aparición del ADSL Naked de Pepephone.

Sencillamente no les salía rentable. Lanzaron una campaña de marketing agresiva mediante un producto que no se podía sostener. Era imposible que tuvieras un DID nacional y llamadas gratuitas a fijos de 40 países por solo 1€ / mes. Pero se hicieron famosos, muy famosos.

Al estilo de la jugada de la telefonía fue la de los servidores dedicados Kemsirve por 3€ / mes. Publicaron el producto y rápidamente la información se extendió como la pólvora. Pero después cancelaron sin previo aviso la mitad de los pedidos, colgaron el cartel de “sold out”, y nunca más se ha vuelto a saber nada más del tema.

Lo que parecía una mala planificación empieza a parecer intencionado. Productos rompedores a precios imposibles que duran días, se extienden como la pólvora en los foros de Internet, y luego es imposible contratar. Es una gran falta de seriedad.

Curso Asterisk (III): Extensiones Internas

Ya es hora de empezar a hacer algo con nuestro flamante y recién instalado Asterisk. Los objetivos para el capítulo de hoy son:

  • Ver algunos parámetros de configuración de SIP
  • Crear un par de extensiones SIP
  • Crear un dialplan que permita hacer llamadas entre extensiones
  • Hacer una llamada de prueba desde un softphone

A partir de ahora el término dialplan empezará a aparecer mucho. El dialplan es el corazón de Asterisk, y es donde reside buena parte de su potencial. Más adelante lo veremos en profundidad, pero de momento es suficiente con saber que es donde se define la lógica a seguir cuando entra una llamada en el sistema.

Crear extensiones SIP

Vamos a editar el archivo /etc/asterisk/sip.conf para que quede de esta manera:

Los parámetros de la sección [general] son los siguientes:

  • udpbindaddr: Define la interfaz de red y puerto donde Asterisk escuchará las peticiones entrantes. Podemos especificar la IP de la interfaz de red que nos interese, o “0.0.0.0” para que escuche en todas. El puerto por defecto es 5060.
  • context: Un contexto es un punto de entrada del dialplan. Aquí definimos el contexto por defecto para todas las conexiones SIP, y lo hacemos principalmente por seguridad. Los contextos los veremos más adelante cuando hablemos del dialplan.
  • srvlookup: Esto es un símil al registro MX existente en los DNS para el envío de emails. De la misma forma que el dominio “gmail.com” puede tener un registro MX que indique el el servidor de email está en “smtp.gmail.com”, SIP puede tener un registro SRV que indique que el servidor VoIP de “ejemplo.com” está en “sip.ejemplo.com”. Es conveniente tenerlo activado cuando utilizamos proveedores externos.
  • allowguest: Parámetro de seguridad. Curiosamente, la configuración por defecto de Asterisk permite que usuarios sin autenticar realicen llamadas. Lógicamente no nos interesa que ocurra esto.
  • alwaysauthreject: Parámetro de seguridad. Por defecto, cuando un usuario se intenta autenticar con credenciales erroneas, Asterisk responde de forma diferente en función de si el usuario existe o no. Con este parámetro activado, la respuesta es siempre la misma sin distinguir entre usuario inexistente y contraseña equivocada.

(Veremos estas y muchas otras cuestiones de seguridad en capítulos posteriores. De momento, como estamos preparando una instalación de pruebas con extensiones internas, el riesgo es inexistente ya que no es posible realizar llamadas al exterior). 

Las secciones [3001] y [3002] definen los usuarios de nuestras dos extensiones. Los parámetros de estas secciones son las siguientes:

  • type: Especifica qué tipo de interacción permitiremos al usuario con nuestro sistema. Los valores permitidos son “user”, “peer” y “friend”. Normalmente se utiliza “peer” para interconectar con proveedores VoIP, y “friend” para definir extensiones internas.
  • host: Especifica el host o IP desde la que esperamos que el usuario se comunique con nosotros. Si  el usuario se puede conectar desde diversas IPs se utiliza “dynamic”, como suele ser el caso habitual de las extensiones internas.
  • username: Nombre de usuario de la cuenta.
  • secret: Contraseña de la cuenta.
  • callerid: Parámetro opcional que permite definir el nombre del CallerID. Es decir, cuando llamemos a otras extensiones internas, además de nuestro número de extensión, en pantalla figurará nuestro nombre aunque la otra persona no nos tenga en la agenda.
  • context: Contexto del dialplan asociado con este usuario.
  • canreinvite: Deshabilitando este parámetro forzamos a que el streaming de audio de la llamada pase por Asterisk, en lugar de ir directo de terminal a terminal. Esto, aunque sea más ineficiente, evita problemas de tener sonido sólo en una dirección (one way audio) o que no tengamos sonido alguno.

Muchos de los parámetros de las extensiones son comunes a todas ellas. Para evitar repetir, podemos recurrir al uso de plantillas donde definir todos los parámetros comunes de las extensiones, y definir en cada extensión sólo aquello que es propio, como el nombre de usuario o la contraseña.

El esquema básico para el uso de plantillas sería:

Esta configuración SIP es exactamente igual que la propuesta inicialmente, pero utilizando plantillas:

Esta forma de organizar la configuración SIP es más fácil de mantener, ya que la configuración crece menos a medida que añadimos extensiones, y si necesitamos cambiar algún parámetro común, se hace en un único sitio.

El Dialplan

Vamos a empezar a hablar del dialplan. El dialplan define qué puede hacer un usuario de nuestra centralita cuando envía a Asterisk una invitación para participar en una conversación. Una invitación de conversación puede ser:

  • Una llamada saliente: Una llamada iniciada desde una de nuestras extensiones internas. Puede ser a otra extensión interna y/o hacia la red de telefonía a través de una interconexión con un proveedor externo.
  • Una llamada entrante: Una llamada recibida desde una interconexión con un proveedor externo, cuando alguien marca uno de nuestros DIDs en un teléfono convencional.

El dialplan se define en /etc/asterisk/extensions.conf, y en el ejemplo que estamos desarrollando tendría este aspecto:

En este dialplan vemos tres secciones principales, [general], [default] y [extensiones-internas]. La sección [general] es una sección especial que define algunos parámetros de comportamiento del dialplan, y donde de momento no vamos a profundizar. El resto de secciones son contextos de entrada, y son lo que nos interesa.

Los contextos se definen con un nombre arbitrario entre corchetes [ ], y contienen una colección de acciones por extensión marcada. Los contextos se asocian con los usuarios SIP en el archivo de configuración sip.conf, tal y como hemos visto al principio de este capítulo.

Vamos a analizar los dos contextos que tenemos. Por un lado, está el contexto utilizado con las extensiones internas:

Sin haber dicho nada del formato del dialplan, ya podemos intuir qué hace este contexto al leer “Dial” y “Hangup”. Analicemos el formato:

  •  exten: Palabra reservada. Todas las líneas de un dialplan empiezan por “exten” o por “same”, que veremos después.
  • patrón: Es una expresión que especifica a qué extensiones se aplica la acción. Pueden ser simples números como “1234”, o patrones complejos que cuadren con varias extensiones a la vez.
    • Los patrones comienzan con guión bajo “_” y pueden contener:
      • X representa cualquier cifra de 0 a 9
      • Z representa cualquier cifra de 1 a 9
      • N representa cualquier cifra de 2 a 9
      • [x-y] representa cualquier cifra de “x” a “y”
      • [xyz] representa las cifras “x”, “y” o “z”
      • . representa una o más repeticiones
      • ! representa cero o más repeticiones
    • Algunos ejemplos:
      • Extensión 3001: 3001
      • Todas las extensiones de 4 cifras: _XXXX
      • Todas las extensiones de al menos 4 cifras: _XXXX.
      • Todas las extensiones de 4 cifras que empiecen por 3: _3XXX
      • Móviles españoles que empiezan por 6: _6XXXXXXXX
      • Móviles españoles que empiezan por 7: _7[1-4]XXXXXXX
      • Fijos españoles que empiezan por 9: _9[1-8]XXXXXXX
      • Todos los fijos españoles: [8-9][1-8]XXXXXXX
  • índice: Orden de ejecución de las acciones de la extensión.
  • acción(parámetros): Acción a ejecutar. Ver Asterisk Application Commands para un listado completo.

Hay tres formatos para encadenar acciones para una extensión. Primero, con orden explícito en cada acción:

Segundo, con orden implícito, donde en la primera acción se indica orden “1”, y para el resto se especifica orden “n”. Esto hace que las acciones se ejecuten de arriba a abajo, en orden de definición:

El tercero es con orden implícito, y sin tener que especificar constantemente el patrón de la extensión. En ese caso, en lugar de “exten” se utiliza “same”, y se omite el patrón.

Este último formato es el menos documentado, pero es el más breve y cómodo, por lo que será el que usaremos en el resto del curso.

Volvamos a la línea clave del dialplan para las extensiones internas, y desglosemos su significado:

  • _3XXX: Capturar las extensiones de 4 dígitos que comiencen por 3.
  • 1: Primera acción del dialplan.
  • Dial(SIP/${EXTEN}): Llamar a la extensión indicada. El parámetro de la acción Dial() especifica a dónde enviar la llamada. En este caso “SIP” indica el protocolo, y “${EXTEN}” contiene el número de extensión marcado por el usuario.
    • Por ejemplo, si el usuario marcó la extensión “3002”, se ejecutará Dial(SIP/3002).

La segunda línea es esta:

  • Hangup(16): Terminar la llamada con código 16: normal call clearing. Hay que tener en cuenta que, cuando se ejecuta la función Dial() y se establece la comunicación entre ambos usuarios (el usuario acepta la llamada), no se ejecuta ninguna instrucción más del dialplan. Sólo se ejecuta la acción Hangup() cuando la llamada no consigue establecer la comunicación, bien porque el usuario no está disponible, no descuelga, o rechaza la llamada. En ese caso, Hangup() cuelga la llamada al usuario llamante. Es una buena práctica terminar la definición de cada extensión del dialplan con Hangup().

Por último, el contexto [default] se utiliza sólo cuando el usuario no tiene definido un contexto propio. Como lo normal es especificar un contexto a todos los usuarios de Asterisk, el contexto por defecto sólo será utilizado por un posible usuario anónimo. Esto se hace por seguridad: el contexto por defecto simplemente colgará la llamada bajo todos los patrones de extensión posibles, evitando que un usuario sin autentificar pueda realizar llamadas con coste a través de nuestro sistema:

Probando el conjunto

Vamos a probar el sistema con un par de teléfonos Android y la aplicación CSipSimple que podéis encontrar en el Play Store. Como alternativa, podéis probar el softphone 3CXPhone para Windows. La configuración es muy parecida.

Lo primero es reiniciar Asterisk para reflejar los cambios en la configuración:

Iniciamos CSipSimple en nuestros teléfonos Android (previamente conectados por WiFi a la misma red que el servidor Asterisk) y realizamos los siguientes pasos en ambos teléfonos:

  • Cuentas / Añadir una cuenta / Basic (abajo del todo)
  • Nombre de cuenta: lo que queráis
  • Usuario: una de las extensiones definidas en sip.conf. Ejemplo: “3001”.
  • Servidor: IP local de nuestro Asterisk.
  • Contraseña: la contraseña correspondiente a la cuenta utilizada. Ejemplo: “password3001”.

Una vez configurados ambos teléfonos, deberíamos poder llamar entre ellos marcando la extensión del otro, “3001” y “3002” según corresponda. Podemos probar a llamar y no descolgar, rechazar, o aceptar la llamada. También deberemos comprobar que tenemos audio en ambas direcciones. Todo debería funcionar bien.

En el siguiente capítulo: Todo sobre el dialplan: patrones, acciones básicas, etc.

Índice del Curso Asterisk:

Curso Asterisk (II): Instalación

En el capítulo de hoy vamos a instalar Asterisk en una Debian 7 Wheezy. Para ello tenemos dos formas, en función de si queremos utilizar los repositorios de Debian o preferimos compilar la última versión de Asterisk a partir de su código fuente. Yo os recomiendo esta última.

Instalar Asterisk: The Easy Way

En los repositorios de Debian tenemos la versión Asterisk 1.8 disponible. Instalarla es tan fácil como hacer lo siguiente:

La versión 1.8 es suficiente para empezar a cacharrear, pero es bastante antigua. Para un uso real recomiendo instalar la última versión disponible, normalmente con más funcionalidades y menos bugs, a partir del código fuente. También necesitaremos compilar si queremos hacerlo funcionar en plataforma ARM (RaspBerry Pi, PandaBoard, etc). La versión estable más reciente en este momento es Asterisk 11.5.

Instalar Asterisk: The Hard Way

Como no nos dejamos asustar tan fácilmente, vamos a instalar Asterisk a partir de sus fuentes para poder trabajar con la última versión. Para aquellos que estén acostumbrados a hacer instalaciones por esta vía sólo habrá un par de puntos a los que deban prestar atención.

Primero vamos a instalar las herramientas de desarrollo para poder compilar:

También necesitaremos instalar algunos requisitos de Asterisk:

Bajamos y descomprimimos el código fuente de Asterisk 11 en su versión más reciente:

Configuramos y revisamos que todos los módulos necesarios para SIP estén preparados:

En el menú de configuración deberemos comprobar que los siguientes módulos aparezcan seleccionados (marcados con un asterisco [*]):

  • Channel Drivers / chan_sip
  • Resource Modules / res_crypto
  • Resource Modules / res_rtp_asterisk

Si alguno no está seleccionado es porque no hemos cumplido con los requisitos necesarios. En ese caso, en la parte inferior se indica cuál es el componente que requiere, y deberemos instalarlo mediante APT. Normalmente se necesitan los paquetes de desarrollo, es decir, si el componente nos dice que necesita de “uuid”, tendremos que instalar el paquete “uuid-dev”. Una vez instaladas las dependencias, deberemos volver a hacer ./configure.

Además de lo anterior, vamos a seleccionar también la colección de sonidos en español:

  • Core Sound Packages / CORE-SOUNDS-ES-GSM

Una vez que todo esté bien, compilamos, instalamos, añadimos los scripts de arranque para /etc/init.d, y la configuración de logrotate:

Y por último, podemos instalar una configuración completa de Asterisk que nos servirá como ejemplo para ir viendo la sintaxis:

La configuración de Asterisk se instala en /etc/asterisk/, y los dos archivos sobre los que vamos a trabajar en futuras entregas son:

  • sip.conf
  • extensions.conf

Ya podemos arrancar Asterisk:

En el siguiente capítulo: creación de dos extensiones internas para hacer llamadas entre ellas por SIP. ¡No te lo pierdas!

 

Índice del Curso Asterisk:

Curso Asterisk (I): Introducción

Digium Asterisk

Varias personas, tanto en persona como en foros, me han preguntado cómo funciona esto de la telefonía VoIP y cómo se le puede sacar provecho. Esto me ha motivado para tratar de plasmar en el blog algo de información sobre el tema. En los próximos artículos hablaremos de telefonía VoIP, protocolo SIP, y Asterisk. Pero primero… la introducción.

¿Por qué montar una centralita PBX en tu casa?

Existen multitud de proveedores de telefonía VoIP en el mercado con tarifas de lo más variadas. Podríamos pensar en contratar una línea VoIP con un proveedor y no complicarnos más la vida, pero, ¿podríamos sacar mejor provecho de la VoIP?

Con una centralita de VoIP propia podríamos hacer lo siguiente:

  • Disponer de extensiones internas para llamar a otros teléfonos conectados a la misma centralita, gratis. Puedes dar un número de extensión a cada uno de tus amigos y llamar entre vosotros sin coste.
  • Crear salas de audioconferencia con varios participantes.
  • Tener cuantos proveedores quieras para llamadas salientes, y elegir automáticamente el mejor proveedor en función del número de destino.
  • Tener varios DIDs (números de teléfono) de diferentes países asociados a la misma cuenta.
  • Gestión compleja de llamadas entrantes: hacer sonar varios teléfonos a la vez (móviles, inalámbricos DECT, etc), o primero en unos y si no se atiende en cierto tiempo ir saltando a otros (ej: primero en casa, y si no se atiende, al móvil, a otra persona, etc).
  • Grabación de conversaciones.
  • Cola de llamadas.
  • Crear buzones de voz, menús de opciones (“pulse 1 si quiere hablar con fulanito…”), y en general, cualquier servicio hombre-máquina mediante telefonía.

Y todo esto sin olvidarnos de otras ventajas que obtenemos por el uso del VoIP frente a la telefonía tradicional:

  • Mejores tarifas que con la telefonía clásica.
  • Disponer de un número de teléfono fijo en tu móvil, y llevártelo fuera de casa sin coste extra.
  • Llamar y recibir llamadas estando en el extranjero como si estuvieras en casa.
  • Tener servicio de telefonía donde no haya cobertura GSM pero sí haya WiFi (bares, salas de congresos, etc).

¿Por qué Asterisk?

Asterisk es el software de PBX gratuito más extendido en el mundo de la telefonía IP. Es software libre, dispone de una gran capacidad para interconectar redes de telefonía de diferente naturaleza (IAX, SIP, SS7, RDSI, etc), y es extremadamente potente.

Sin embargo, Asterisk es complicado, la documentación es mala, y está plagado de bugs. Pero una vez configurado y en marcha da muy buen servicio y es muy gratificante. Y con el presente curso, esperemos que a todos os resulte más llevadera su instalación.

En el siguiente capítulo: Instalar Asterisk de cero en Debian Wheezy. ¡No te lo pierdas!

 

Índice del Curso Asterisk:

Soluciona los ruidos parásitos en los altavoces de PC

A más de uno le pasará que, al conectar unos altavoces amplificados a la salida de audio del PC, tenga problemas de ruidos parásitos que no consiga eliminar.

En mi caso, los monitores de estudio que utilizo son muy sensibles a las perturbaciones eléctricas, y reproducen constantemente unos molestos zumbidos que varían en frecuencia e intensidad en función de lo que se vea en la pantalla.

Después de mucho investigar he encontrado la solución. Lo que necesitamos para acabar con el problema de una vez por todas es un pequeño filtro que se coloca entre la fuente de sonido (el PC) y los altavoces amplificados, y que eliminará los ruidos por completo. Este filtro recibe el nombre de ground loop isolator filter, y tiene este aspecto:

Ground Loop Isolator

Este tipo de filtros se pueden encontrar en tiendas de electrónica, en establecimientos de Car Audio, y por Internet (eBay, Amazon UK, etc). Su precio no es alto, oscilando entre los 10€ y los 20€.

A continuación os dejo un video de mis propios altavoces, con y sin filtro. Como se puede ver, sin el filtro emiten un sonido constante y muy molesto que interfiere con la música. Con el filtro obtenemos silencio absoluto.


 

Soluciona los problemas de conectividad WiFi/3G en HTC Desire

A estas alturas pocas HTC Desire seguirán en uso, ya que es un modelo de segunda generación que lleva tiempo en el mercado, y que ha sido ampliamente superado por la avalancha de dispositivos Android que ha venido después.

Si como yo aun conservas una HTC Desire, es muy probable que hayas probado ROMs cocinadas para tratar de estirarla en el tiempo. Si has instalado alguna ROM basada en Ice Cream Sandwich o Jelly Bean, o te has decantado por una ROM estable y limpia como CyanogenMod 7, es posible que estés sufriendo problemas de conectividad 3G después de estar mucho tiempo conectado por WiFi.

Los foros están llenos de gente comentando el mismo problema. Estás en tu casa conectado por WiFi y todo va bien, pero cuando sales a la calle, a la Desire le cuesta varios minutos darse cuenta de que ya no tiene la WiFi a su alcance, y no conmuta a 3G. En el indicador de cobertura se indica que tienes señal, pero en pantalla no aparece el símbolo de conexión G, E o H, y al abrir un navegador se comprueba que efectivamente no hay conectividad.

En algunas ocasiones es suficiente con desactivar y reactivar los datos, o con entrar y salir  del modo avión. Pero la mayor parte de las veces es necesario reiniciar el teléfono.

Si has instalado Chromium, ICS for Desire, o simplemente la CyanogenMod 7.2.0.1, habrás notado este molesto problema. ¿Qué es lo que ocurre? Ocurre que el RIL es incorrecto.

El RIL es el Radio Interface Layer. Es decir, es un componente software que hace de intermediario entre Android y el hardware de radio del teléfono, encargado de controlar todas las comunicaciones de radio: GSM, WCDMA, WiFi, Bluetooth, GPS.

Si el RIL es incorrecto, la gestión del hardware de radio no funcionará bien y nos provocará problemas. ¿Cómo lo solucionamos? Instalando un RIL correcto en nuestra ROM.

Enlace: Listado de RILs para HTC Desire en XDA

En el enlace indicado tenemos el listado completo de RILs para nuestra Desire. La CyanogenMod 7.1 viene con el HTC-RIL 1.6.1062G (Apr 23 2010,17:35:06) y funciona bastante bien, aunque de vez en cuando sufre algún corte. La CyanogenMod 7.2.0.1 en cambio incluye el HTC-RIL 2.2.0028HM (Sep 20 2010,22:33:44) y sufre muchísimos problemas de conectividad.

¿Cómo puedo saber qué versión de RIL tengo en mi ROM? Lanza Terminal en el teléfono y ejecuta lo siguiente:

$ su
# getprop “gsm.version.ril-impl”

El RIL recomendado para no tener problemas con CyanogenMod 7.2.0.1 es el HTC-RIL 2.2.1003G (Nov 2 2010,17:17:45). Varios usuarios en diversos foros han declarado haber solucionado el problema al flashear el teléfono con este RIL.

El procedimiento para flashear el RIL es el siguiente:

  1. Copiar el RIL sin descomprimir (formato ZIP) en la raíz de la tarjeta SD
  2. Reiniciar en modo Recovery
  3. Si queremos poder volver atrás, este es el momento de hacer un Nandroid Backup
  4. Montar “/system”
  5. Elegir “Flash from SD” y elegir el archivo del RIL
  6. Esperar a que termine y reiniciar

(Se asume que se tiene el teléfono rooteado y con un custom recovery. Si no es así, aconsejamos leer otras guías para conocer el procedimiento. Aprender a rootear el teléfono queda fuera del alcance de esta guía.)

El RIL forma parte de la ROM, por lo que si flasheamos otra ROM deberemos repetir el proceso. El flasheo del RIL no es un procedimiento crítico como sí lo es flashear el firmware de la radio, que puede dañar el teléfono. Si ocurre algún problema con el flasheo del RIL, podemos volver a probar de nuevo con el mismo archivo, probar con otro RIL, o flashear directamente otra ROM.

Con este nuevo RIL, mi HTC Desire conecta en modo HDPA nada más encender, y conmuta entre WiFi y 3G al instante. No he vuelto a sufrir problemas de conectividad 3G desde que hice el cambio. Si lo probáis, espero que os funcione tan bien como a mí.