Como configurar WebSocket en Asterisk

WebSocket es un protocolo que permite la comunicación bidireccional entre clientes y servidores sobre TCP (opcionalmente podemos usarla sobre TLS para conexiones seguras). Aunque esta tecnología fue implementada inicialmente para la web, puede llegar a servir funcionalmente en cualquier topología cliente/servidor.  Por ello, nace una nueva vertiente que es la utilización de WebSocket como un elemento más en la familia de transportes de SIP ( aun esta por estandarizar, pero aquí podemos ver el draft). Este conjunto de elementos da forma a WebRTC o lo que es la mismo, añadir capacidades multimedia de voz y video a los navegadores web.

Todos los servidores que entienden SIP, hay día de hoy, se esfuerzan en añadir las suficientes capacidades para integrar WebSocket en sus sistemas. A raíz de esto, Asterisk en su versión 11 añade soporte WebSocket como protocolo de transporte.

Configuración WebSocket en Asterisk 11

Con Asterisk 11 compilado e instalado correctamente, debemos cerciorarnos que tenemos cargado el modulo res_http_websocket.so. En caso contrario, debemos recompilar asterisk con este recurso seleccionado desde el make menuselect.

Configuramos el servidor http integrado en Asterisk. Para ello debemos editar en el el fichero de configuración /etc/asterisk/httpd.conf con los siguientes parámetros.

[general]
;
; Whether HTTP/HTTPS interface is enabled or not.  Default is no.
; This also affects manager/rawman/mxml access (see manager.conf)
;
enabled=yes
;
; Address to bind to, both for HTTP and HTTPS. You MUST specify
; a bindaddr in order for the HTTP server to run. There is no
; default value.
;
bindaddr=0.0.0.0
;
; Port to bind to for HTTP sessions (default is 8088)
;
bindport=8088
;
; Prefix allows you to specify a prefix for all requests
; to the server.  The default is blank.  If uncommented
; all requests must begin with /asterisk
;
prefix=asterisk

A nivel de SIP, debemos permitir el transporte WebSocket en las entidades user, peer o friend. A continuación un ejemplo de parametrización en el fichero de configuración /etc/asterisk/sip.conf

[iUDh17uQ]
type=friend
host=dynamic
secret=7ldd5v4g9oMha
context=ctx-general
disallow=all
allow=ulaw
allow=alaw
allow=gsm
language=es
transport=ws,wss
avpf=yes
encryption=yes

Ejemplo de conexión WebSocket  través de la web con JsSIP

JsSIP es una librería JavaScript para el desarrollo de aplicaciones web que quieran trabajar con SIP sobre WebSockets.

Por sintetizar el articulo, únicamente vamos a ver el procedimiento para instanciar un objeto UA con una parametrización adecuada para este propósito.

De esta forma, probaremos que Asterisk esta entendido SIP sobre WebSockets.

Los parámetros obligatorios son:

  • uri: Dirección SIP asociada a nuestro User Agent.

sip:usuario:[password]@host:[puerto]

  • ws_servers: WebSocket URI.

En nuestro caso, la SIP URI asociado a nuestro usuario siguiendo el patrón:

sip:iUDh17uQ@192.168.1.19

Donde iUDh17uQ es el usuario creado en nuestro fichero de configuración sip.conf y 192.168.1.19 es la IP local de nuestro servidor Asterisk.

Respecto a la URI WebSocket:

ws://192.168.1.19:8088/asterisk/ws

El directorio configurado en el /etc/asterisk/httpd.conf, además de la IP:Puerto, lleva el prefijo /asterisk configurado con la variable prefix=asterisk. A todo esto, debemos añadir el subdirectorio /ws para que el servidor httpd no nos responda con un: 404 Not Found.

Para poder ver la funcionalidad del resto parámetros del UA, podéis dirigiros directamente a la ayuda que trae JsSIP.

function init(){
    var configuration = {
        uri: «sip:iUDh17uQ@192.168.1.19»,
        password: «7ldd5v4g9oMha»,
        ws_servers: «ws://192.168.1.19:8088/asterisk/ws»,
        display_name: null,
        authorization_user: null,
        register: null,
        register_expires: null,
        no_answer_timeout: null,
        trace_sip: true,
        stun_servers: null,
        turn_servers: null,
        use_preloaded_route: null,
        connection_recovery_min_interval: null,
        connection_recovery_max_interval: null,
        hack_via_tcp: null,
        hack_ip_in_contact: null
    };

    var phone = new JsSIP.UA(configuration);

    phone.start();               
}

Después de llamar a nuestra función js desde nuestra web, comprobamos en el full log de Asterisk que la comunicación se realizo correctamente.

WebSocket es un protocolo que permite la comunicación bidireccional entre clientes y servidores sobre TCP (opcionalmente podemos usarla sobre TLS para conexiones seguras). Aunque esta tecnología fue implementada inicialmente para la web, puede llegar a servir funcionalmente en cualquier topología cliente/servidor.  Por ello, nace una nueva vertiente que es la utilización de WebSocket como un elemento más en la familia de transportes de SIP ( aun esta por estandarizar, pero aquí podemos ver el draft). Este conjunto de elementos da forma a WebRTC o lo que es la mismo, añadir capacidades multimedia de voz y video a los navegadores web.

Todos los servidores que entienden SIP, hay día de hoy, se esfuerzan en añadir las suficientes capacidades para integrar WebSocket en sus sistemas. A raíz de esto, Asterisk en su versión 11 añade soporte WebSocket como protocolo de transporte.

Configuración WebSocket en Asterisk 11

Con Asterisk 11 compilado e instalado correctamente, debemos cerciorarnos que tenemos cargado el modulo res_http_websocket.so. En caso contrario, debemos recompilar asterisk con este recurso seleccionado desde el make menuselect.

Configuramos el servidor http integrado en Asterisk. Para ello debemos editar en el el fichero de configuración /etc/asterisk/httpd.conf con los siguientes parámetros.

[general]
;
; Whether HTTP/HTTPS interface is enabled or not.  Default is no.
; This also affects manager/rawman/mxml access (see manager.conf)
;
enabled=yes
;
; Address to bind to, both for HTTP and HTTPS. You MUST specify
; a bindaddr in order for the HTTP server to run. There is no
; default value.
;
bindaddr=0.0.0.0
;
; Port to bind to for HTTP sessions (default is 8088)
;
bindport=8088
;
; Prefix allows you to specify a prefix for all requests
; to the server.  The default is blank.  If uncommented
; all requests must begin with /asterisk
;
prefix=asterisk

A nivel de SIP, debemos permitir el transporte WebSocket en las entidades user, peer o friend. A continuación un ejemplo de parametrización en el fichero de configuración /etc/asterisk/sip.conf

[iUDh17uQ]
type=friend
host=dynamic
secret=7ldd5v4g9oMha
context=ctx-general
disallow=all
allow=ulaw
allow=alaw
allow=gsm
language=es
transport=ws,wss
avpf=yes
encryption=yes

Ejemplo de conexión WebSocket  través de la web con JsSIP

JsSIP es una librería JavaScript para el desarrollo de aplicaciones web que quieran trabajar con SIP sobre WebSockets.

Por sintetizar el articulo, únicamente vamos a ver el procedimiento para instanciar un objeto UA con una parametrización adecuada para este propósito.

De esta forma, probaremos que Asterisk esta entendido SIP sobre WebSockets.

Los parámetros obligatorios son:

  • uri: Dirección SIP asociada a nuestro User Agent.

sip:usuario:[password]@host:[puerto]

  • ws_servers: WebSocket URI.

En nuestro caso, la SIP URI asociado a nuestro usuario siguiendo el patrón:

sip:iUDh17uQ@192.168.1.19

Donde iUDh17uQ es el usuario creado en nuestro fichero de configuración sip.conf y 192.168.1.19 es la IP local de nuestro servidor Asterisk.

Respecto a la URI WebSocket:

ws://192.168.1.19:8088/asterisk/ws

El directorio configurado en el /etc/asterisk/httpd.conf, además de la IP:Puerto, lleva el prefijo /asterisk configurado con la variable prefix=asterisk. A todo esto, debemos añadir el subdirectorio /ws para que el servidor httpd no nos responda con un: 404 Not Found.

Para poder ver la funcionalidad del resto parámetros del UA, podéis dirigiros directamente a la ayuda que trae JsSIP.

function init(){

var configuration = {
uri: "sip:iUDh17uQ@192.168.1.19",
password: "7ldd5v4g9oMha",
ws_servers: "ws://192.168.1.19:8088/asterisk/ws",
display_name: null,
authorization_user: null,
register: null,
register_expires: null,
no_answer_timeout: null,
trace_sip: true,
stun_servers: null,
turn_servers: null,
use_preloaded_route: null,
connection_recovery_min_interval: null,
connection_recovery_max_interval: null,
hack_via_tcp: null,
hack_ip_in_contact: null
};


var phone = new JsSIP.UA(configuration);


phone.start();

}

Después de llamar a nuestra función js desde nuestra web, comprobamos en el full log de Asterisk que la comunicación se realizo correctamente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.