Asterisk 11.X - Llamadas SIP <-> Jingle

En un precedente articulo hemos visto como crear un “gateway” para los mensajes instantáneos entre extensiones SIP y usuarios XMPP. En este articulo veremos como realizar llamadas desde extensiones SIP a usuarios XMPP conectados a un servidor XMPP que soporta el protocolo ICE-UDP (Jingle). Para que todo funcione el cliente XMPP también tiene que soportar el protocolo Jingle.

Para esta prueba se ha utilizado:

Como sabrán el cliente Jitsi soporta también el Protocolo SIP pues pareciera que no tiene mucho sentido utilizarlo ya que se podrían realizar las llamadas configurando directamente una extensión SIP. El problema es que la extensión SIP configurada en Jitsi no puede enviar mensajes instantáneos a otra extensión SIP ya que el método utilizado por Asterisk 11.X para enviar y recibir mensajes instantáneos no parece respetar la RFC relacionada.

De esto se puede tener una prueba mirando un OPTIONS enviado por Asterisk 11.X. En la cabecera Allow normalmente aparecen los métodos soportados:

Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH

Si se fijan el método MESSAGE no aparece y por eso Jitsi no permite enviar mensajes instantáneos a otras extensión SIP registrada en Asterisk 11.X.

Para la instalación de Ejabberd se utilizará un servidor de DigitalOcean con CentOS 6.5 64bit. Una vez creado el “Droplet” se accede vía SSH y se inicia la configuración. Primero se actualiza el sistema:

yum update -y

Se instalan los repositorios EPEL que luego se utilizarán para la instalación de una dependencia necesaria para la correcta instalación de Ejabberd:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Se instala el editor nano y el programa wget:

yum install nano wget -y

Se configura la zona horaria:

rm /etc/localtime

ln -s /usr/share/zoneinfo/America/Bogota /etc/localtime

El idioma (Español de Colombia):

nano /etc/sysconfig/i18n

Se modifica esta línea:

LANG="en_US.UTF-8"

para que quede (en el caso de Colombia):

LANG="es_CO.iso88591"

Se instala el paquete del network time protocol que se utiliza para tener siempre actualizada la hora del servidor:

yum install ntp -y

Se configura para que arranque en automático:

chkconfig ntpd on

Se inicia:

service ntpd start

Se crea la partición de Swap ya que no viene por defecto:

dd if=/dev/zero of=/swapfile bs=1024 count=512k

mkswap /swapfile

swapon /swapfile

Se configura la partición de swap para que arranque con el sistema:

nano /etc/fstab

al final del archivo se añade la línea que sigue:

/swapfile swap swap defaults 0 0

Se cambian los permisos del archivo recién creado:

chmod 0600 /swapfile

Se reinicia el sistema:

reboot

Se vuelve a acceder vía SSH y se instala la librería libyaml que es el lenguaje en que está escrito el archivo de configuración de Ejabberd:

yum install libyaml-devel -y

Se descarga la ultima versión del servidor Ejabberd:

cd /usr/src

wget http://www.process-one.net/downloads/downloads-action.php?file=/ejabberd...

Se renombra:

mv downloads-action.php\?file\=%2Fejabberd%2F14.05%2Fejabberd-14.05-linux-x86_64-installer.run ejabberd-14.05-linux-x86_64-installer.run

se vuelve ejecutable:

chmod +x ejabberd-14.05-linux-x86_64-installer.run

Se ejecuta:

./ejabberd-14.05-linux-x86_64-installer.run

Primero se escoge el idioma y se presiona la tecla envío:

Captura

Luego se presiona la tecla envío distintas veces hasta llegar al final de la licencia de uso:

Captura

Se escribe la letra y para aceptar los términos de la licencia:

Captura

Se presiona envío para aceptar la carpeta predefinida de instalación:

Captura

Si al servidor no está asociado un dominio, se indica la dirección IP publica y se presiona la tecla envío:

Captura

Se crea un usuario administrador (predefinido admin) y se presiona la tecla envío:

Captura

Se crea una contraseña para el usuario administrador y se confirma.

Captura

No se activa el modo Cluster:

Captura

Se termina el proceso con la instalación. Luego se entra en la siguiente carpeta:

cd /opt/ejabberd-14.05/bin

y se inicia:

./start

se averigua que el servidor esté funcionando:

./status

The node ejabberd@localhost is started with status: started
ejabberd community  is running in that node

Como ya tenemos un usuario creado por defecto (admin), creamos el segundo:

./ejabberdctl register voztovoice 162.243.122.174 sesamo
User voztovoice@162.243.122.174 successfully registered

El usuario será voztovoice y su contraseña sesamo. La IP es la misma del servidor Ejabberd.

 

ASTERISK 11.X

En Asterisk tenemos que modificar 4 archivos:

  • sip.conf
  • xmpp.conf
  • motif.conf
  • extensions.conf

En el archivo sip.conf creamos una nueva extensión o utilizamos una ya creada. Luego renombramos el archivo xmpp.conf:

mv /etc/asterisk/xmpp.conf /etc/asterisk/xmpp.conf.old

creamos uno nuevo:

nano /etc/asterisk/xmpp.conf

copiamos las líneas que siguen:

[general]
debug=yes
autoprune=no
autoregister=yes
;collection_nodes=yes
;pubsub_autocreate=yes
;auth_policy=accept=yes

[admin]
type=client
serverhost=162.243.122.174
;pubsub_node=pubsub.dominio.com
username=admin@162.243.122.174
secret=sesamo
priority=1
port=5222
usetls=yes
usesasl=yes
buddy=voztovoice@162.243.122.174
;distribute_events=yes
status=available
statusmessage=Asterisk Server
timeout=100
sendtodialplan=yes
context=message

Los datos importantes:

  • serverhost: la IP publica o el nombre de dominio del servidor Ejabberd
  • username: nombre de usuario XMPP con IP publica del servidor Ejabberd
  • secret: la contraseña del usuario XMPP (admin)
  • buddy: el segundo usuario creado en el servidor Ejabberd (voztovoice)

Guardamos los cambios y renombramos el archivo motif.conf:

mv /etc/asterisk/motif.conf /etc/asterisk/motif.conf

Creamos uno nuevo:

nano /etc/asterisk/motif.conf

copiamos las siguientes líneas:

[jingle]
context=xmpp-in
transport=ice-udp
allow=ulaw
allow=h263
allow=h264
connection=admin

Datos importantes:

  • context: contexto donde llegarán las llamadas entrantes de usuarios XMPP
  • trasport: para la extensión Jingle es ice-udp
  • connection: etiqueta que da inicio a la configuración del usuario admin en el archivo xmpp.conf

Se guardan los cambios y se modifica el dialplan:

nano /etc/asterisk/extensions.conf

se crea el contexto xmpp-in para las llamadas entrantes de los usuarios XMPP:

[xmpp-in]
exten => s,1,NoOp( Llamadas de usuarios XMPP )
same => n,Dial(SIP/1000,30)
same => n,Hangup()

En este caso la extensión que recibirá las llamadas será la 1000. En el contexto a que tiene acceso la extensión 1000 se crea el bloque que sigue:

exten => _[a-z].,1,Dial(motif/jingle/${EXTEN}@162.243.122.174,30)
same => n,Hangup

Este bloque funciona si los usuarios XMPP que se llaman empiezan con una letra minúscula entre a y zeta.

Se guardan los cambios y se reinicia Asterisk:

service asterisk restart

Se entra en la consola:

asterisk -rvvvvvvvvvvvvvv

se averigua que el usuario admin esté conectado al servidor Ejabberd:

CLI> xmpp show connections
Jabber Users and their status:
       [admin] admin@162.243.122.174     - Connected

Se configura el X-lite para conectarse a la extensión 1000 y luego se descarga el cliente Jitsi y se inicia. Se entra en el menú Tools –> Options y se presiona el botón Add para crear un nuevo usuario:

Captura

Se configura el usuario voztovoice y se presiona el botón Add. Como el certificado del servidor Ejabberd es auto firmado, Jitsi preguntará si continuar. Una vez aceptado el certificado aparecerá la solicitud de “amistad” del usuario admin:

Captura

Se aceptará presionando el botón Authorize. El resultado:

Captura

Como primera prueba se llama desde Jitsi el usuario admin. Se presiona el icono del auricular. El X-lite empezará a timbrar:

Captura

En la consola de Asterisk:

Executing [s@xmpp-in:1] NoOp("Motif/voztovoice-2816", " Llamadas de usuarios XMPP ") in new stack
Executing [s@xmpp-in:2] Dial("Motif/voztovoice-2816", "SIP/1000,30") in new stack
    -- Called SIP/1000
    -- SIP/1000-00000002 is ringing

Se contesta la llamada y el audio se escuchará perfecto. Ahora desde el X-lite se llama el usuario voztovoice:

Captura

En el cliente Jitsi:

Captura

En la consola de Asterisk:

Executing [voztovoice@externas:1] Dial("SIP/1000-00000004", "motif/jingle/voztovoice@162.243.122.174,30") in new stack
Called motif/jingle/voztovoice@162.243.122.174
Motif/voztovoice@162.243.122.174/jitsi-27i72bg-bc5d is proceeding passing it to SIP/1000-00000004
Motif/voztovoice@162.243.122.174/jitsi-27i72bg-bc5d is ringing

Las dos pruebas han funcionado correctamente…

¿Les parece una solución útil?

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

16 comentarios

Hola interesante esta guia ,

Hola interesante esta guia , estoy tratando de implementarla pero me da este error

[Jul 14 16:23:22] ERROR[11604]: chan_motif.c:1955 jingle_interpret_ice_udp_transport: Received ICE-UDP transport information on session 'pa2jhsksojgi' but ICE support not available
-- Executing [s@xmpp-in:1] NoOp("Motif/allan-1cda", " llamada de usuario XMPP ") in new stack
[Jul 14 16:23:38] ERROR[11604]: chan_motif.c:1955 jingle_interpret_ice_udp_transport: Received ICE-UDP transport information on session '516edqfbeasg3' but ICE support not available
-- Executing [s@xmpp-in:1] NoOp("Motif/allan-fbed", " llamada de usuario XMPP ") in new stack

como que no reconoce el transporte declarado en motif.conf

Re: Hola interesante esta guia

Hola,

por fin creo que encontré la solución.

Para que el protocolo ICE funcione correctamente en Asterisk, antes de compilar el programa, hay que instalar también estos paquetes:

yum install libuuid libuuid-devel uuid uuid-devel

Me di cuenta porque en la versión 11.12.0 tenía el mismo problema con las llamadas Astersis -> Google

Me cuentas.

Saludos

Pregunta, tuviste que hacer

Pregunta, tuviste que hacer una instalacion limpia desde cero y haber instalado estas librerias antes para que te funcionara?

gracias por la info.

Re: Pregunta, tuviste que hacer

Hola,

instalé Asterisk 11.12.0 desde las fuentes pero antes instalé todas las librerías y paquetes que normalmente son dependencias para una correcta compilación de los módulos de Asterisk.

Lo importante para que ICE funcione correctamente es instalar los paquetes mencionados en mi anterior mensaje.

Saludos

Re: Hola Andrea , gracias gracias

Hola,

me alegra que por fin te funcionó. A mi también el tema me estaba volviendo loco.

Me parece una solución bastante útil, cuéntanos como la vas a implementar, ojala en una entrada de blog de este sitio.

Saludos

Hola sigo pensando como

Hola sigo pensando como lograste hacer que te jalara ,he tratado de reproducir este escenario y no funciona , compilando bien las librerías y los módulos , pero no jala x todos los medio , creo que Asterisk no entiende el transporte ICE-UDP

sldss

Re: Hola sigo pensando como

Hola,

hoy he vuelto a probar el articulo y ha funcionado sin problemas. Creo que el hecho que no funcione depende de como estás instalando Asterisk ya que esa parte no aparece en la guía.

Saludos

te refieres ha

te refieres ha

res_rtp_asterisk - lo tengo compilado
chan_jingle - lo quite
chan_gtalk - no lo tengo
res_jabber - lo quite
chan_motif -lo tengo compilado

aun así no jala.

hay algo especial que se me pase?

Re: te refieres a...

Hola,

me imagino que el modulo res_xmmp lo tienes compilado.

De todas formas el problema parece estar relacionado con Asterisk pues habría que mirar si se instalaron todas las dependencias.

Desde la consola de Asterisk activar el debug:

CLI> core set debug 9

y mirar si eso arroya alguna luz.

Saludos

si el res_xmpp lo tengo

si el res_xmpp lo tengo instalado y cargado

shark*CLI> module show like res_xmpp.so
Module Description Use Count
res_xmpp.so Asterisk XMPP Interface 0
1 modules loaded
shark*CLI>

activando el debug no muestra nada
Connected to Asterisk 11.11.0 currently running on shark (pid = 1721)
-- Executing [s@xmpp-in:1] NoOp("Motif/allan-dd59", " llamada de usuario XMPP ") in new stack
[Jul 23 17:43:56] ERROR[6534]: chan_motif.c:1955 jingle_interpret_ice_udp_transport: Received ICE-UDP transport information on session 'cb93e7gsqua13' but ICE support not available
shark*CLI>

habilistate en el rtp.conf el ice?
y en sip.conf?

sldss

<--- XMPP sent to 'admin'




-- Executing [s@xmpp-in:1] NoOp("Motif/allan-64f2", " llamada de usuario XMPP ") in new stack
-- Executing [s@xmpp-in:2] Dial("Motif/allan-64f2", "SIP/1001,30") in new stack
[Aug 1 21:37:55] ERROR[6963]: chan_motif.c:1955 jingle_interpret_ice_udp_transport: Received ICE-UDP transport information on session 'f910259rikh4u' but ICE support not available
== Using SIP VIDEO TOS bits 136
== Using SIP VIDEO CoS mark 6
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called SIP/1001
== Spawn extension (xmpp-in, s, 2) exited non-zero on 'Motif/allan-64f2'





Um aqui solo me timbro.

Suscribirse a Comentarios de "Asterisk 11.X - Llamadas SIP &lt;-&gt; Jingle" Suscribirse a VozToVoice - Todos los comentarios