asterisk mal aterrizaje

Asterisk 13 ya esta apunto de aterrizar

asterisk 13 mal aterrizajeComo viene siendo ya costumbre en este blog en los últimos años, quiero anunciar que ya queda muy poco para que desembarque la nueva versión LTS, Asterisk 13 y esta vez, no viene excesivamente cargada de novedades. Quizá las mas esperadas por muchos van a seguir sin cubrirse. Aquí voy a hacer un breve resumen de que podemos atenernos en los próximos meses:

(Toda la información esta disponible en la wiki oficial)

En primer lugar, como no podía ser menos, vamos a hablar de la novedad estrella: ARI (Asterisk REST Interface)

Por fin podemos realizar llamadas a Asterisk 13 de manera externa, desde un servidor sin necesidad de tener que monitorizar resultados de la antigua Asterisk Manager Interface (que curiosamente también ha sido BASTANTE mejorada, añadiendo nuevos métodos y acciones a la larga lista de ya existentes).

Hay que tener en cuenta que eventualmente se puede hacer el 90% de la funcionalidad alcanzada a través de un dialplan corriente, aplicando este tipo de interfaces (como la AMI), pero todavía falta para poder llegar a cubrir el 100%. Afortunadamente poder cubrir con una interfaz REST dota de muchísima versatilidad al sistema, especialmente considerando que hoy en día, estamos hablando que estos sistemas son más un framework que un sistema standalone (o los famosos Servidores de Aplicaciones IMS). La verdad es que tengo muy descuidado el blog y lo reconozco, pero me apunto para hacer lo antes posible, un breve tutorial sobre el uso del ARI con un ejemplo práctico

Alguna funcionalidad destacable de Asterisk 13

Entre la nueva funcionalidad de Asterisk 13 más de campo tenemos:

  • Se ha mejorado el soporte de chan_dahdi al SS7
  • Se ha mejorado el soporte al nuevo stack SIP pjsip
  • Ahora necesitamos libxml2-dev para el menuselect
  • Voicemail ahora soporta el japones
  • Confbridge sigue evolucionando en detrimento del antiguo Meetme, y Directory sigue vivo
  • Varias aplicaciones como Chanspy ya se benefician del UniqueID
  • Atención también a la nueva especificación de CDR y CEL heredada de la versión estandar Asterisk 12

Finalmente como punto negativo, quiero destacar que no se ha prestado demasiada atención a la compatibilidad de Asterisk con las nuevas tecnologías WebRTC y los últimos cambios presentados por el estandar. Tampoco hay ninguna novedad sobre el soporte de OPUS que habían anunciado que para Asterisk 13 estaría resuelto lo que me resulta un disgusto bastante grande, más considerando que ya tendremos que esperar posiblemente a la próxima LTS Asterisk 15 para poder ver todo esto integrado en condiciones… si es que llega. Sinceramente, creo que se esta dando muchisimas vueltas con respecto al codec OPUS y la violación de las licencias como ellos justifican, realmente no es del todo cierta y habido bastante polémica en las listas al respecto. Veremos como evoluciona en el 2015 este asunto, bajo mi punto de vista, no haber tratado esto con prioridad da la sensación que la llegada de Asterisk 13 con un sistema WebRTC totalmente disfuncional es más bien un aterrizaje forzoso

Si estais interesados en que haga alguna review de algún aspecto en concreto de Asterisk, comentadme y lo voy viendo!

Asterisk con Websockets para WebRTC y probando SIPML5

ATENCIÓN: Este artículo ya no es útil puesto que Chrome en su versión 35 en adelante ha pasado su sistema de encriptación para WebRTC de SDES a SRTP/DTLS como estaba planificado desde principios de Enero 2014. Este articulo definía el metodo para montar un sistema Asterisk basado en este sistema. Cuando salga la resolución definitiva en Asterisk creare otro articulo para explicar como configurar con Asterisk este sistema

Volviendo a la carga con Artículos sobre Asterisk, voy a explicar algo que aunque ya está algo visto, ha sido parte de mi experiencia y como viendo haciendo hasta ahora intento explicarlo con el mayor número de detalles

Hay que considerar que en este momento estoy trabajando con la versión CERT de Asterisk concretamente la versión 11.6-cert1

webrtc asterisk

Preparando la instalación del Sistema Asterisk para WebRTC

En primer lugar, sería conveniente tener soporte para el códec OPUS que es una de las claves que WebRTC utilizan de forma nativa y quizá sea de las principales ventajas de su uso.

Si no tenemos autoconf necesitamos instalarlo y también hará falta libtool y pkg-config

# apt-get install autoconf libtool pkg-config

ATENCIÓN (Con Asterisk  >11.6) si compilamos con soporte OPUS habrá un problema de AUDIO (Issue en Git de Meetecho: https://github.com/meetecho/asterisk-opus/issues/6). Por eso este paso de instalación de Opus en este tipo de versiones, seria conveniente saltárselo de momento a partir de aquí:

Para ello lo podemos descargar desde el repositorio GIT de este proyecto. Tenemos que descargar este fichero en el directorio raíz donde esta el código de Asterisk listo para ser compilado.

#wget https://raw.github.com/meetecho/asterisk-opus/master/asterisk_opus+vp8.diff

Desde ahí lanzamos el parche

# patch -p1 -u < asterisk_opus+vp8.diff

Y a continuación preparamos el sistema para que pueda instalarse el códec OPUS:

# ./bootstrap.sh

En mi caso, trabajando con Ubuntu Server 12.04, me hace falta instalar la librería Opus en el sistema, que no viene en los repositorios de Ubuntu por defecto:

# apt-get install python-software-properties
# add-apt-repository ppa:ubuntu-sdk-team/ppa
# apt-get update
# apt-get install libopus-dev

Después de instalar el códec OPUS pasamos a instalar el resto de las dependencias para su funcionamiento

También nos hará falta la librería libsrtp0-dev para gestionar la encriptación de las conexiones WebRTC y las librerias de Universally Unique Identifier, uuid-dev (este último es específico la versión 11 de Asterisk y su no instalación provocaría problemas en la comunicación con ICE, y aunque la llamada entraría en el sistema, no se escucharía nada por una cuestión de RTP) . Podemos instalarlas directamente desde los repositorios del sistema:

# apt-get install libsrtp0-dev libsrtp0 uuid-dev

Con todo preparado realizamos la instalación de Asterisk

# ./configure --with-crypto --with-ssl --with-srtp=/usr/lib

Finalmente seleccionamos el códec Opus y Formato VP8 con make menuselect (Codec Translators -> códec_opus y Format Interpreters -> format_vp8)

Por otro lado, para instalar nuestro sistema websockets en Asterisk primero deberemos instalar el Recurso HTTP Websocket. Esto se realiza durante la instalación de Asterisk (make menuselect) en la sección Resource Modules, y cuyo nombre es res_http_websocket

También se recomienda por cuestiones de calidad, seleccionar los paquetes musicales tanto los mensajes de Asterisk como los de Music On Hold en formato SLN16 (CORE-SOUNDS-ES-SLN16, MOH-OPSOUND-SLN16 y EXTRA-SOUNDS-EN-SLN16)

Y ya podemos compilar Asterisk con todo el soporte necesario

# make && make install

Configurando Asterisk y Websockets

A partir de aquí ya tenemos el sistema preparado para ser configurado simplemente. En primer lugar configurador el servidor HTTP de Asterisk desde el fichero http.conf

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088

A continuación pasamos a configurar el soporte ICE y STUN en el fichero RTP.conf para ello añadimos las líneas dentro de la etiqueta [general]

icesupport=true
stunaddr=stun.l.google.com:19302

Finalmente pasamos a configurar un peer SIP para que soporte la comunicación con WebSockets. En el fichero sip.conf dentro de la etiqueta [general]:

allowguest=no
udpbindaddr=0.0.0.0:5060

Y creamos una extensión con los siguientes parámetros

[extension1]
secret=miclavesecreta
transport=udp,wss,ws
encryption=yes
avpf=yes
icesupport=yes
directmedia=no
host=dynamic
nat=force_rport,comedia
qualify=yes // opcional
type=friend
context=phones

Con todo esto solo necesitaremos configurar en nuestro servidor Web un softphone basado en WebRTC y que soporte WebSockets (esto es opcional, si tenemos publicado el servidor SIP el webphone RTC se conectaría directamente, los websockets serían utiles en caso que definieramos en el sip.conf un nombre al dominio (con la propiedad realm) y conectáramos a este realm a traves de una conexión con Websockets (otra de las claves principales de WebRTC junto al Codec OPUS). Por ejemplo,supongamos la dirección pública de nuestro servidor es 123.123.123.123 y hemos abierto el puerto 8088 (del servidor HTTP de Asterisk para habilitar los Websockets). Configuramos en el fichero sip.conf,

[general]
realm=10000horas.com

Ahora en el softphone configuramos (por ejemplo SIPML5, aunque pongo otras opciones más adelante):

Private Entity: la extensión usada, en este caso extension1
Publc Entity: sip:extension1@10000horas.com
Password: la_password_de_la_extension
Realm: 10000horas.com

Y en el apartado “Expert” debemos configurar la dirección a la que apunta el Websocket. Usando comunicación Websockets sin encriptar:

Websocket Server URL: ws://123.123.123.123:8088/ws

Así estableceríamos la conexión en vez de directamente al servidor SIP, lo haríamos gracias al servidor WebSocket, lo que es bastante provechoso y podríamos llegar a incrementar la seguridad del sistema (considerando que tener el Puerto 5060 a libre albedrío es peligroso, aunque no todos opinan lo mismo)

Disponemos de varias opciones entre las más populares SIPML5 y JsSIP. De todas formas si tenemos el servidor delante de un firewall o hemos gestionado los puertos correspondientes podríamos hacer una prueba desde cada uno de los sistemas:

SIPML5: http://sipml5.org/call.htm
JsSIP: http://tryit.jssip.net/

Espero que os haya servido, os recomiendo el cliente de escritorio Phoner Lite (http://phonerlite.de/index_en.htm) si queréis hacer pruebas ya que es de los pocos Softphones que dispone del códec OPUS por defecto.