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.

asterisk_webrtc_websocket

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.

modulo_websocket_asterisk

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_log_asterisk

5 comentarios en Como configurar WebSocket en Asterisk

  1. tengo este problema :

    Connected to Asterisk 11.5.0 currently running on laboratorio (pid = 4836)
    == WebSocket connection from ‘192.168.1.5:59240’ for protocol ‘sip’ accepted using version ’13’
    — Registered SIP ‘1000’ at 192.168.1.5:59240
    == WebSocket connection from ‘192.168.1.5:59237’ closed
    == Using SIP RTP CoS mark 5
    [Aug 1 22:21:32] ERROR[5343][C-00000004]: chan_sip.c:33043 setup_srtp: No SRTP module loaded, can’t setup SRTP session.
    [Aug 1 22:21:32] ERROR[5343][C-00000004]: chan_sip.c:33043 setup_srtp: No SRTP module loaded, can’t setup SRTP session.
    [Aug 1 22:21:32] WARNING[5343][C-00000004]: chan_sip.c:10454 process_sdp: Rejecting secure audio stream without encryption details: audio 27703 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126

    alguna idea ??

      1. Hola alejandro , si ya resolví el tema de compilar el modulo srtp …. estoy creando una aplicación con jssip el cual me ringea el x-lite pero …. tengo configurado un anexo con los parametros
        transport=udp,ws,wss
        avpf=no
        encryption=no

        al cual yo contesto y no logro escuchar nada y a los pocos segundos se desconecta.

        si cambio los parametros
        avpf=yes
        encryption=yes

        nisiquira ringea … tienes algun sugerencia ?? necesito alguna ilumincacion para esto.

        de ante mano gracias.

        1. Te dejo mi configuracion para que le heches un vistaso haber si encuentras el detalle.

          /sip.conf
          [general]
          context=default
          language=es
          nat=yes,force_rport
          localnet=0.0.0.0/255.255.255.0

          [1111]
          context=LABORATORIO_WEB
          callerid=”1111″
          secret=1111
          mailbox=1111@laboratorio_web
          type=friend
          host=dynamic
          canreinvite=no
          call-limit=4
          callgroup=1
          pickupgroup=1
          disallow=all
          allow=gsm
          allow=g729
          allow=ulaw
          allow=alaw
          transport=udp,ws,wss
          avpf=no
          encryption=no
          ;icesupport=yes

          [ld6rqvq1]
          context=LABORATORIO_WEB
          callerid=”NAVEGADOR WEB”
          secret=ld6rqvq1
          mailbox=ld6rqvq1@laboratorio_web
          type=friend
          host=dynamic
          nat=yes,force_rport
          canreinvite=no
          call-limit=4
          callgroup=1
          pickupgroup=1
          disallow=all
          allow=gsm
          allow=g729
          allow=ulaw
          allow=alaw
          language=es
          transport=udp,ws,wss
          avpf=yes
          encryption=yes
          ;srtpcapable=yes

          #########################

          /rtp.conf
          [general]
          rtpstart=10000
          rtpend=20000

          #########################

          /http.conf
          [general]
          enabled=yes
          bindaddr=0.0.0.0
          bindport=8088
          prefix=asterisk

          ########################
          /extensions.conf
          [LABORATORIO_WEB]
          ;Anexo 1111
          exten => 1111,1,Answer( )
          exten => 1111,n,Dial(Sip/1111)
          exten => 1111,n,Hangup()
          ;Anexo ld6rqvq1
          exten => ld6rqvq1,1,Answer( )
          exten => ld6rqvq1,n,Dial(Sip/ld6rqvq1)
          exten => ld6rqvq1,n,Hangup()

Deja un comentario