Probando WebRTC en Elastix 4 (paso a paso)

elastixwebrtc

El término WebRTC se ha vuelto tendencia recientemente en el ámbito VoIP. Muchos no entienden realmente de qué se trata y otros piensan que sólo es un softphone en el navegador.

El presente artículo tampoco busca resolver los misterios de WebRTC, sino dar con una solución efectiva para aquellos que deseen experimentar con esta tecnología; y sí, la idea de el presente artículo es hacer funcionar un softphone en el navegador, pero las posibilidades a partir de allí son mucho más interesantes.

Para ir directamente a la masa y sin más preámbulos, empecemos con los pasos.

1) INSTALAR Elastix

1.1) Descargar e instalar Elastix 4 RC3 de este link

1.2) Actualizamos Asterisk porque la versión que viene en Elastix 4 RC3 no tiene soporte ICE

# rpm -Uvh http://repo.elastix.org/elastix/4/updates/x86_64/RPMS/asterisk-11.20.0-1.el7.centos.x86_64.rpm

2) INSTALAR EL WEBPHONE

2.1) Descargar sipml5-master.zip de https://github.com/DoubangoTelecom/sipml5 y colocar el archivo en el servidor Elastix bajo la ruta /var/www/html

2.2) En el servidor ejecutamos los siguientes comandos.

# cd /var/www/html
# unzip sipml5-master.zip
# mv sipml5-master phone

3) CREAR EXTENSIONES

Ingresar a Elastix y crear 2 extensiones en el menú “PBX -> PBX Configuration -> Extensions”.

Yo he creado la 2001 y 2002, teniendo cuidado de establecer las siguientes 4 opciones.

opciones {focus_keyword} Probando WebRTC en Elastix 4 (paso a paso) opciones

La cuenta 2001 la usaré para el teléfono WebRTC y la 2002 la configuraré en un softphone de escritorio. En este caso el BRIA.

Aplicamos los cambios.

Aquí viene algo truculento y es que aparte de estos parámetros es necesario configurar otros que FreePBX no trae por omisión, por lo que nos veremos obligados a ponerlos a mano en el archivo de configuración /etc/asterisk/sip_additional.conf

En la sección correspondiente a la extensión WebRTC (es decir, la 2001 en nuestro caso) añadimos las siguientes líneas:

dtlsenable=yes ; Tell Asterisk to enable DTLS for this peer
dtlsverify=no ; Tell Asterisk to not verify your DTLS certs
dtlscertfile=/etc/asterisk/keys/asterisk.pem ; Tell Asterisk where your DTLS cert file is
dtlsprivatekey=/etc/asterisk/keys/asterisk.pem ; Tell Asterisk where your DTLS private key is
dtlssetup=actpass ; Tell Asterisk to use actpass SDP parameter when setting up DTLS

También modificamos la línea que configura el transporte, incluyendo WSS entre los transportes disponibles. La línea debería quedar así:

transport=wss,ws,udp,tcp,tls
Hay que notar aquí que estos cambios SE SOBREESCRIBIRÁN cada vez que apliquemos la configuración de FreePBX. En Elastix 4 estable planeamos solucionar este inconveniente, así como también incluir el RPM de Asterisk con soporte ICE.

4) CREO CERTIFICADOS PARA SRTP

4.1) Creo la carpeta donde irán los keys

# mkdir /etc/asterisk/keys

4.2) Creo los certificados

# /usr/share/doc/asterisk-11.20.0/contrib/scripts/ast_tls_cert -C pbx.mycompany.com -O "My Super Company" -d /etc/asterisk/keys
# /usr/share/doc/asterisk-11.20.0/contrib/scripts/ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C phone1.mycompany.com -O "My Super Company" -d /etc/asterisk/keys -o malcolm

4.3) Permisos

# chown -R asterisk.asterisk /etc/asterisk/keys

5) CAMBIOS EN ASTERISK

5.1) Creo los certificados para el servidor Web embebido q trae Asterisk

# openssl req -new -x509 -days 365 -nodes -out /tmp/foo.pem -keyout /tmp/foo.pem

5.2) Editar el archivo vim /etc/asterisk/http_additionals.conf

[general]
enabled=yes
enablestatic=no
bindaddr=0.0.0.0
bindport=8088
prefix=asterisk
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/tmp/foo.pem
tlsprivateket=/tmp/foo.pem

5.3) Edito el archivo /etc/asterisk/sip_general_custom.conf y agrego las sgtes líneas

tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscipher=ALL
tlsclientmethod=tlsv1

5.4) reiniciar asterisk

# service asterisk restart

6) CONFIGURO TELEFONOS

6.1) WEBPHONE

Apuntar el browser al cliente WebRTC http://192.168.88.106/phone/call.htm y configurar

Nota: En mi caso este (192.168.88.106) es el IP de mi servidor Elastix.

Captura de pantalla 2015-12-15 a las 23.42.34 {focus_keyword} Probando WebRTC en Elastix 4 (paso a paso) Captura de pantalla 2015 12 15 a las 23

Presionamos el botón que dice “Expert mode?” y configuramos los siguientes parámetros.

Captura de pantalla 2015-12-15 a las 23.42.52 {focus_keyword} Probando WebRTC en Elastix 4 (paso a paso) Captura de pantalla 2015 12 15 a las 23

En la pantalla anterior hay que notar que estamos usando WSS como transporte, en lugar de WS.

6.2) BRIA

Configuro otro cliente SIP para la extensión 2002. En mi caso el BRIA

Captura de pantalla 2015-12-15 a las 23.49.15 {focus_keyword} Probando WebRTC en Elastix 4 (paso a paso) Captura de pantalla 2015 12 15 a las 23


Tip importante: En caso de usar certificados no válidos (auto firmados) como en nuestro ejemplo, es necesario que el navegador acepte previamente dicho certificado. Para lograr esto, antes de usar el teléfono Web, debemos apuntar nuestro navegador al URL del websocket, aquí es https://192.168.88.106:8089/asterisk/ws. Luego de aceptar el certificado, obtendremos un mensaje de “Upgrade Required” que es lo esperado. A continuación, ya podremos usar el teléfono WebRTC.

Por qué elegir un appliance Elastix?

appliances_elastix_son_mejores {focus_keyword} Por qué elegir un appliance Elastix? appliances elastix son mejores

Un amigo cercano y colaborador de Elastix me hizo notar que publicitamos poco ciertos hechos interesantes acerca de los appliances Elastix. La verdad ponemos mucho esfuerzo en tener un producto de la más alta calidad desde el punto de vista de ingeniería, pero hacemos poco marketing de esto. Así que quise compartirles algunas cosas que sabemos los que trabajamos en el equipo Elastix pero se hablan muy poco fuera. En el presente artículo enlisto y explico 10 buenas razones –aparte del espectacular color naranja por cierto ;) {focus_keyword} Por qué elegir un appliance Elastix? icon wink — por las que es mejor comprar un appliance Elastix en lugar de un servidor cualquiera.

1) Se puede estar seguro de que Elastix funciona sobre este equipo y viene pre-cargado

Cuando alguien compra un computador cualquiera e instala Elastix, hay muchas variables que pueden salir de control. Es muy difícil que podamos probar Elastix para todos las marcas de computadores que existen en el mundo, así que no es imposible que el mainboard o algún dispositivo no sea reconocido correctamente por el sistema operativo o que existan problemas de estabilidad; que en telefonía es inaceptable. Por eso existen los appliances Elastix, y es allí donde nos aseguramos que Elastix funcione de manera óptima. En muchos casos inclusive hemos optimizado la distro para que funcione bien sobre nuestros equipos.

2) Construido sobre la filosofía de chasís totalmente metálico

Así es. ESTAMOS EN CONTRA de usar una carcaza plástica para una IPPBX y existen razones de sobra. Muchos dirán que el plástico está de moda y ayuda a reducir costos, pero en este sentido somos inflexibles y explicaré las razones.

Menos interferencia

Esto es crítico en un equipo de telecomunicaciones donde la interferencia puede afectar la calidad de voz. El chassis metálico desempeña el rol de un escudo contra las interferencias; este principio se conoce científicamente como Jaula de Faraday y existe mucha documentación en Internet (http://es.wikipedia.org/wiki/Jaula_de_Faraday)

Mejor disipación de calor

Es indiscutible que el metal disipa MUCHO mejor el calor que el plástico y un equipo bien refrigerado siempre desempeñará mejor que uno recalentado. Esto sin contar con el alargamiento de la vida útil del equipo.

Mejor resistencia a golpes 

Desde la escuela nos enseñan que los metales son maleables. Esto les permite doblarse en lugar de romperse, lo cual es útil durante el transporte. Basta con ver el siguiente video donde pasamos un auto sobre un appliance Elastix para darse cuenta que es improbable que un appliance plástico soporte este peso encima https://vimeo.com/104447883

 3) Apoyas al proyecto Elastix, un proyecto libre

El equipo Elastix hace un esfuerzo gigantesco para el proyecto siga siendo libre. Invierte miles de horas de desarrollo al año, investigación y desarrollo, alojamiento Web, etc. Son miles de dólares que necesitan financiarse de algún modo. Una manera de contribuir con tal iniciativa es adquiriendo un appliance oficial.

4) Tu appliance es monitoreado 24/7/365 y eres alertado de posibles fallos.

Al momento de adquirir un appliance Elastix uno puede obtener monitoreo desde la nube. De esta manera uno puede ser alertado cuando los recursos del servidor comienzan a utilizarse de manera inusual como por ejemplo si las grabaciones comienzan a llenar el disco duro. Es una manera de estar un paso adelante de los problemas. Con un appliance oficial esto viene incluido, sólo es necesario activarlo.

5) Tienes un 15% de descuento en training y suscripciones de soporte

Así es, creemos que la mejor manera de maximizar la inversión al adquirir un appliance oficial es entrenándote. Aparte, puedes obtener soporte de ingenieros certificados y con mucha experiencia a un precio descontado. Con esta combinación tiene sin duda la mejor opción del mercado.

6) Si requieres soporte, todos nuestros agentes conocen el hardware y te pueden brindar un soporte óptimo

Nuestros agentes de soporte in-house se encuentran familiarizados con todos los modelos de appliances Elastix. Lo que sin duda es una ventaja.

7) Diseñados en latinoamérica

Los appliances Elastix son fabricados en distintas partes del mundo, pero la concepción y el diseño se hacen en latinoamérica. Poco a poco el proyecto Elastix se ha convertido en un símbolo de que sí se puede hacer tecnología de alta calidad en nuestra región y nos sentimos orgullosos de ello.

8) Las características de llamadas concurrentes se hace sobre el 30% de la capacidad de CPU

Esto es una diferencia importantísima si comparamos contra la competencia. Existen otras marcas que publicitan un número de llamadas concurrentes de más de tres veces a las de appliances Elastix usando hardware similar. La diferencia radica en que en Elastix somos MUY conservadores a la hora de publicar el número de llamadas concurrentes de un appliance Elastix. Esto también quiere decir que si un cliente adquiere un appliance Elastix con capacidad para 30 llamadas concurrentes, lo más probable es que soporte muchísimo más llamadas. Lo que queremos es clientes contentos.

9) La solución de bugs reportados sobre instalaciones en appliances Elastix tienen máxima prioridad

Cuando un cliente reporta un problema en la distribución Elastix a través de los canales oficiales, este tiene la prioridad más alta si se trata de un usuario de un appliance oficial. Es lo más justo y es lo más conveniente para un comprador de un appliance Elastix.

10) Todas las pruebas de certificación de hardware se realizan sobre appliances Elastix

 El programa de certificación de hardware Elastix es una iniciativa exitosa de Elastix a la que se han adherido la mayoría de  marcas del mercado de la VoIP (http://www.elastix.org/index.php/en/product-information/certified-hardware.html). Pues entérense: las pruebas de hardware de terceros se realizan sobre appliances Elastix! Esto quiere decir que si adquirimos una tarjeta de telefonía de otra marca, es mucho más probable que funcione bien sobre un appliance Elastix que sobre otro equipo.

Elastix se bifurca en 2 productos

Con el lanzamiento de Elastix 3 el pasado mes de Octubre, comenzó a resultar obvio que existen dos tipos de usuarios. A los que les sirve muchísimo una solución Multi-Tenant como Elastix 3 y los que sólo necesitan una solución para una sola compañía. Este último grupo resulta ser la gran mayoría.

Elastix 3 comenzó su desarrollo como una idea revolucionaria (aquí presentación), pensada con características vanguardistas, que lo hacen interesante para proveedores de centralitas VoIP en la nube. Sin embargo, no todos necesitan todas estas características.

En todo caso, nos dimos cuenta que, si bien estos dos grupos de usuarios tienen necesidades en su mayoría similares, hay algunas que no lo son.

Luego de algunos días de debate se decidimos separar el proyecto en 2 productos:

  • Elastix Single-Tenant
  • Elastix Multi-Tenant

El primer producto se llamará simplemente Elastix y será la continuación de la rama 2, mientras que el segundo producto se llamará Elastix MT.

Elastix MT será básicamente el actual Elastix 3.

Confundido?

Para ilustrar mejor, una imagen.

ramas Elastix se bifurca en 2 productos Elastix se bifurca en 2 productos ramas

Como resulta obvio, para evitar confusión, la evolución de Elastix 2 será Elastix 4. De este modo la versión 3 quedará en la historia como una versión que cambió de nombre a Elastix MT.

Estos cambios se comenzarán a ejecutar la primera semana de Diciembre (2014).

Cambiando las “voces” del motor TTS que viene por omisión en Elastix

Text to Speech Elastix Cambiando las "voces" del motor TTS que viene por omisión en Elastix Cambiando las "voces" del motor TTS que viene por omisión en Elastix tts elastix text to speech

Quienes han usado el motor TTS (text-to-speech) que viene por omisión en Elastix (llamado Festival) habrán notado que las “voces” en español suenan un tanto robotizadas.

Un conjunto de “voces” de mejor calidad se encuentra disponible de manera gratuita gracias al proyecto Guadalinex. Sin embargo, muchos usuarios tienen problemas para instalarlas, así que decidí publicar esta guía muy breve y sencilla.

Lo primero que debemos hacer es instalar los archivos que conforman las voces. Para facilitar este paso, construi unos instaladores RPMs que nos facilitan enormemente el trabajo. Estos instaladores pueden ser descargados de aquí:

http://www.neomano.com/downloads/voces/

El archivo festvox-palpc16k-1.0-2.noarch.rpm instala la voz masculina, llamada Pedro, y el archivo festvox-sflpc16k-1.0-2.noarch.rpm instala la voz femenina, llamada Silvia.

La instalación de estos archivos en nuestro servidor Elastix la podemos realizar con el siguiente comando.

rpm -ivh festvox-palpc16k-1.0-2.noarch.rpm festvox-sflpc16k-1.0-2.noarch.rpm

Luego de esto editamos el archivo /usr/share/festival/languages.scm y modificamos las líneas 93 y 94 de la siguiente forma.

ANTES:

(voice_el_diphone)
(set! male1 voice_el_diphone)

DESPUES:

(voice_JuntaDeAndalucia_es_pa_diphone)
(set! male1 voice_JuntaDeAndalucia_es_pa_diphone)

TEXT2WAVE

Si adicionalmente queremos que el comando text2wave por omisión utilice nuestras voces, tendremos que también modificar el archivo /usr/bin/text2wave y en la línea 46 añadir una que diga:

(voice_JuntaDeAndalucia_es_pa_diphone)

Esto es útil debido a que algunos scripts AGI utilizan el comando text2wave para sintetizar voz.

Sistema de riego controlado por teléfono

Elastix Sprinkler Sistema de riego controlado por teléfono Sistema de riego controlado por teléfono elastix sprinkler

Quién no ha soñado alguna vez con llamar al sistema de riego de su jardín para encenderlo?… Bueno, probablemente casi nadie :) Sistema de riego controlado por teléfono Sistema de riego controlado por teléfono icon smile

La cosa es que me entró esa idea en la cabeza. No se si sea algo práctico realmente, pero aquí va un artículo que relata con cierto detalle el experimento que hice.

Es importante explicar, antes de continuar, que existen algunas cosas que voy a asumir a partir de ahora, y es que el lector está familiarizado con Elastix, Asterisk, AGI, PHP y Arduino. Además asumiré que también tiene conocimientos básicos de electrónica.

Para aclarar mejor cómo funcionará el sistema dibujé la siguiente figura donde se ilustran los componentes que lo conforman.

Sistema de riego controlado por teléfono Sistema de riego controlado por teléfono elastix automat

Como ilustra la figura anterior hay dos componentes principales que necesitaremos, y son:

  • el servidor Elastix, y
  • la interfaz con la válvula de riego (o interfaz de riego)

El servidor Elastix

Para el servidor Elastix instalé la versión 2.2 RC1. Este servidor es el que me servirá de PBX pues lo conectaré con el mundo exterior mediante una línea telefónica. De este modo puedo llamar por teléfono al servidor Elastix y activar el riego.

Como se puede observar en la figura aterior, en este servidor residirán dos programitas que desarrollé: Un script AGI y un driver de alto nivel (para que se comunique con la interfaz de riego vía USB). Ambos los escribiré en PHP debido a que es un lenguaje muy popular y existe bastante documentación que se puede consultar vía Web; de este modo la explicación es más entendible.

Alguno se puede preguntar por qué no controlo al Arduino directamente desde el script AGI. La respuesta es que preferí tener el driver por separado porque también me servirá para controlar el Arduino desde la interfaz Web que desarrollaré en un futuro próximo. Eso es lo que significa el rectángulo que dice “Interfaz Web” en la figura anterior.

Interfaz de riego

La interfaz de riego es un circuito que por un lado se conecta al servidor Elastix a través de un puerto USB y por el otro se conecta a la válvula de riego. Hay muchas maneras maneras de realizar esta circuitería. En mi caso me decidí por usar una placa Arduino conectada a un relé. Básicamente porque tenía una placa Arduino ociosa y decidí darle algún uso interesante. Esta placa se encuentra conectada a un relé a través de una circuitería sencilla.

En la siguiente figura se muestra la interfaz de riego cuando la planifiqué por primera vez en protoboard (breadboard).


Sistema de riego controlado por teléfono Sistema de riego controlado por teléfono interfaz de riego bb

En la práctica terminé reemplazando el circuito de relé con uno pre-construido que compré para Arduino (con entrada opto-aislada y doble relé) y que en Internet hay un montón a precios razonables.

Lo único que no me gustó mucho del circuito que compré es que tiene lógica negada. Es decir, que cuando la entrada es un HIGH el relé se encuentra apagado, mientras que cuando es un LOW se encuentra encendido. Por eso verán más adelante que el código para el Arduino toma en consideración esta lógica.

La válvula de riego

En mi caso se trata de una válvula marca Rainbird controlada con 24 voltios AC. Nada del otro mundo; tiene dos cables y si los energizamos con 24 VAC la válvula se enciende y el agua pasa a los aspersores.

El protocolo de comunicaciones entre Elastix y la interfaz de riego

El protocolo que utilizaré será lo más sencillo posible. De esta manera le será más fácil al lector entender el código. El protocolo consiste de un solo comando compuesto por un byte. Este byte será interpretado como un número entero por el Arduino y representará el número de minutos que se desea activar el riego. Si deseo interrumpir el riego envío el número 128.

Modificación del plan de marcado de Asterisk

En mi caso particular he configurado el siguiente contexto en el archivo /etc/asterisk/extensions_custom.conf

[sprinkler]
exten => *2222,1,Answer
exten => *2222,n,AGI(sprinkler.agi)
exten => *2222,n,Hangup()

Esto quiere decir que cuando alguien marque el número *2222 le contestará mi script AGI, que por cierto se llama sprinkler.agi.

El script AGI

Aquí también los dejo con el código de mi script AGI. No se olviden de darle los permisos correctos.

#!/usr/bin/php -q
<?php
require_once "phpagi.php";
$agi = new AGI();
$arr_minutos_riego = $agi->get_data('custom/minutosactivos', 20000, 3);
$minutos_riego = $arr_minutos_riego['result'];
$comm = "sudo /opt/sprinkler/driver " . $minutos_riego;
exec($comm, $sal);
$agi->stream_file('custom/riegoconfigurado');
?>

El script anterior lo podemos dividir en dos partes:

  1. Primero le pregunta al llamante por el número de minutos que desea que el sistema de riego permanezca encendido. Esto lo hace mediante la función get_data
  2. Luego invoca al driver y le pasa como parámetro el número de minutos antes obtenido. Esto lo logra /opt/sprinkler/driver

Cabe resaltar que el script anterior utiliza dos archivos de audio que el lector puede grabar a su gusto. Estos archivos los he llamado minutosactivos.wav y riegoconfigurado.wav. En el primer archivo grabé un mensaje parecido al siguiente:

“Por favor, ingrese el número de minutos que desea regar”

Y en el segundo grabé un sencillo mensaje de agradecimiento:

“Gracias por usar el sistema de riego Elastix”

Cabe mencionar que he preferido mantener el script AGI lo más sencillo posible para propósitos didácticos, pero el lector lo puede añadir complejidad y por ejemplo, validar la entrada del usuario, o pedirle que confirme el número de minutos, entre otras cosas.

Driver para comunicación con la interfaz de riego

Bueno, ahora sí veamos de qué está hecho el driver de alto nivel que controla el Arduino vía USB.


#!/usr/bin/php -q
<?php
$arg_segundos = trim($_SERVER['argv'][1]);
$data = chr((int)$arg_segundos);
$fp=fopen("/dev/ttyUSB0", "r+");
$r = fwrite($fp, $data);
fclose($fp);
?>

Nuevamente, he preferido mantener el código anterior al mínimo. Dejo al lector la tarea de añadir validaciones. Por ejemplo, estoy asumiento que el dispositivo ha sido asociado con /dev/ttyUSB0, pero eso puede variar de sistema en sistema.

Código para el Arduino

Ahora sí, el código para el Arduino. Este código se debe cargar en el Arduino para que haga lo que necesitamos.


#include <Time.h>  

int relPin = 2;
int usbnumber = 0;
int active = 0;
time_t timeend = 0;

void setup() {
    pinMode(relPin, OUTPUT);
    digitalWrite(relPin, HIGH);
    Serial.begin(9600);
}

void loop() {
    // Aquí se lee del puerto USB
    if (Serial.available() > 0) {
        usbnumber = Serial.read();
    }

    // 128 es el comando para apagar (interrumpir) la salida del relé
    if(usbnumber==128) {
        active=0;
        digitalWrite(relPin, HIGH);
    }

    if(active==0) {
        // Si el riego estaba inactivo y se recibió un número mayor a cero
        if (usbnumber > 0) {
            active = 1;
            digitalWrite(relPin, LOW);
            timeend = now() + usbnumber*60;
        }
        usbnumber = -128;
    } else {
        // Si se alcanzo el tiempo previsto apago el relé
        if(now()>=timeend) {
            active = 0;
            digitalWrite(relPin, HIGH);
        }
    }
}

Conclusión

Muy aparte de la utilidad para regar un jardín, espero que este proyecto encuentre muchas otras aplicaciones. A final de cuentas se trata de un relé que se activa por un tiempo determinado. Si alguien lo construye o le encuentra alguna otra aplicación práctica, será gratificante ver su comentario por aquí.