Asterisk 10 y los mensajes instantáneos (SIP MESSAGE) - HowTo

Una de las interesantes novedades de la versión 10 de Asterisk es la funcionalidad del envío de mensajes instantáneos entre extensiones y entre las extensiones y usuarios de las distintas redes XMPP (Jabber).

En esta primera parte veremos como configurar Asterisk para que las extensiones puedan enviarse mensajes instantáneos. En la segunda parte veremos como utilizar esta funcionalidad para el envío de mensajes instantáneos entre extensiones y usuarios XMMP (ejemplo: GoogleTalk).

Como se puede leer en la wiki oficial de Asterisk, el envío de mensajes instantáneos se basa en un protocolo independiente y acontece aunque no exista un dialogo (una llamada) entre las dos extensiones. Los mensajes enviados se procesan a través del dialplan.

Esta guía se basa es una instalación limpia de Asterisk 10.4. Los pasos a seguir son:

  1. modificar el archivo de configuración sip.conf
  2. modificar el archivo de configuración extensions.conf
  3. configurar los Softphone, teléfonos SIP que soportan esta funcionalidad

Primero se modifica el archivo sip.conf

nano /etc/asterisk/sip.conf

se modifican los siguientes cuatros parámetros:

;accept_outofcall_message = no
;outofcall_message_context = messages
;auth_message_requests = yes
;subscribecontext = default

para que queden:

accept_outofcall_message = yes
outofcall_message_context = messages
auth_message_requests = yes
subscribecontext = subscribe

  • accept_outofcall_message = yes ; se permite el envío de mensajes instantáneos
  • outofcall_message_context = messages ; el contexto del dialplan donde se procesarán los mensajes enviados. Este parámetro se puede configurar en la parte general o en cada extensión. De esta forma es posible crear grupos de extensiones con contextos distintos que podrán enviarse mensajes solamente entre ellas
  • auth_message_requests = yes ; por cada mensaje enviado, Asterisk pedirá a la extensión de autenticarse
  • subscribecontext = subscribe ; contexto donde se configurarán las extensiones hint para permitir a las extensiones de subscribir el estado de las demás

Al final del archivo se crean 3 extensiones:

[1000]
type=friend
secret=1000
host=dynamic
dtmfmode=rfc2833
disallow=all
allow=alaw

[1001]
type=friend
secret=1001
host=dynamic
dtmfmode=rfc2833
disallow=all
allow=alaw

[1002]
type=friend
secret=1002
host=dynamic
dtmfmode=rfc2833
disallow=all
allow=alaw

IMPORTANTE: nunca utilizar como contraseña de una extensión el numero de la extensión. En esta guía se hace solamente para simplificar las configuraciones.

Terminada la configuración del sip.conf se pasa al dialplan:

nano /etc/asterisk/extesions.conf

Al final del archivo se configuran dos contextos:

[subscribe]
exten => 1000,hint,SIP/1000
exten => 1001,hint,SIP/1001
exten => 1002,hint,SIP/1002

El contexto subscribe para el monitoreo de las extensiones.

[messages]
exten => _X.,1,Noop(Mensaje de ${MESSAGE(from)})
same => n,Noop(Mensaje para ${MESSAGE(to)})
same => n,Noop(Texto = ${MESSAGE(body)})
same => n,Messagesend(sip:${EXTEN},${MESSAGE(from)})
same => n,Noop(Estado del mensaje ${MESSAGE_SEND_STATUS})
same => n,Hangup

El contexto messages (como configurado en el parámetro outofcall_message_context del sip.conf), donde se procesarán los mensajes enviados. La configuración que aparece funciona solamente si todas las extensiones configuradas empiezan con un numero (_X.).

La función MESSAGE contiene los siguiente datos del mensaje enviado:

  • MESSAGE(from) – el destinatario
  • MESSAGE(to) – el remitente
  • MESSAGE(body) – el contenido del mensaje

Estas son las variables que se van a presentar en la consola de Asterisk con las primeras tres líneas.

Con la aplicación Messagesend se envía el mensaje al destinatario indicando el remitente. La sintaxis para el destinatario es SIP:numeroextensión (URI). La aplicación genera la variable ${MESSAGE_SEND_STATUS} que enviamos a la consola para saber si el mensaje ha sido enviado con éxito.

Ya se puede iniciar Asterisk:

service asterisk start

Ahora Falta configurar los teléfonos SIP. Para Esta prueba se utilizarán:

  • X-Lite = 1000
  • Bria = 1001
  • CSIPsimple (Android) = 1002

Se configuran con los datos presentes en el file sip.conf y se añaden las demás extensiones en la lista de “amigos”. El resultado:

Captura

En una ventana terminal se entra en la consola de Asterisk:

asterisk -rvvvvvvvvvvvvv

En otra se capturan los paquetes SIP:

ngrep -W byline port 5060 > /tmp/sipmessage

Desde la extensión 1000 se envía un mensaje a la extensión 1001. El resultado en los teléfonos:

Captura

En la consola de Asterisk:

Captura

En la captura SIP:

Captura

X-LIte envía el mensaje a Asterisk que contesta con un “401 Unauthorized” pidiendo a X-Lite che se autentique.

Captura

X-Lite vuelve a enviar el mensaje con sus datos de autentificación y Asterisk contesta con un “202 Accepted”

Captura

Asterisk envía el mensaje a la extensión 1001 (el softphone Bria) que contesta con un “200 OK”

Se repite la prueba enviando un mensaje a la extensión 1002 que contesta. En el X-Lite:

Captura

En el CSIPsimple:

Screenshot_2012-05-27-01-48-59

Perfecto. Ahora la pregunta:

¿Cómo podemos saber con certeza que el mensaje ha sido recibido?

Modificando el dialplan de esta manera:

nano /etc/asterisk/extensions.conf

[messages]
exten => _X.,1,Noop(Mensaje de ${MESSAGE(from)})
same => n,Noop(Mensaje para ${MESSAGE(to)})
same => n,Noop(Texto = ${MESSAGE(body)})
same => n,Set(dest=${EXTEN})
same => n,Messagesend(sip:${EXTEN},${MESSAGE(from)})
same => n,Noop(Estado del mensaje ${MESSAGE_SEND_STATUS})
same => n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?failed,s,1)
same => n,Hangup

Se guarda el contenido de la variable ${EXTEN} en la variable ${dest} y con la aplicación Gotoif se controla el valor de la variable ${MESSAGE_SEND_STATUS}. Si es distinto a SUCCESS se va al contesto failed, extensión s, prioridad 1. En ese contexto se pone:

[failed]
exten => s,1,Set(texto=${MESSAGE(body)})
same => n,Set(MESSAGE(body)="El Mensaje - ${texto} - para ${dest} no ha sido enviado")
same => n,Set(remit=${CUT(MESSAGE(from),<,2)})
same => n,Set(remit=${CUT(remit,@,1)})
same => n,MessageSend(${remit},CentroMensajes)
same => n,Noop(Estado del mensaje ${MESSAGE_SEND_STATUS})
same => n,Hangup

En la segunda línea se asigna a la variable (MESSAGE(body) el texto que será enviado a la extensión para comunicarle que el mensaje no se ha podido enviar. En la tercera y cuarta líneas, se extrae la URI  del remitente del mensaje enviado sin éxito y se asigna a la variable ${remit}. En la quinta línea se envía el mensaje y como remitente se pone “CentroMensajes”. En la penúltima se averigua si el mensaje ha sido enviado con éxito.

Se recarga la configuración del dialplan:

CLI> dialplan reload

y se hace la prueba. Desde la extensión 1000 se envía un mensaje a la extensión 1001 mientras no está conectada a Asterisk. El resultado:

Captura

Captura

El proceso en la consola de Asterisk:

Captura

Pronto la segunda parte.

Comments

Quisiera saber como se envian los sms entre asterisk por supuesto de la version 10 en adelante...????
es que lo he logrado pero en una sola direccion de unos clientes sip a otros peros viceversa no!!!!

y es que los que estas en el asterisk2 envian los sms a los de asterisk1 pero viceversa no!!!!
es nesesario un siproxd o proxy sip?? aunque lo instalé (siproxd) y me registra solo los clientes del asterisk2...

o que tengo que hacer...

a proposito muy interesante este post...

gracias por tu respuesta por adelantado...

si fueras tan amable de enviarme tu experiencia por email suchi@ucp.gu.rimed.cu

Como hacerlo usando FreePBX ?
Muchas Gracias

Amiga, te felicito por tus post; una condulta en XLITE puedo recibir mensajes pero no puedo enviar a que se debe???? gracias.

Hola,

la ultima versión de X-Lite ya no funciona para enviar mensajes instantáneos. Puedes utilizar el softphone Jitsi.

Saludos

Hola Andrea, una consulta, esto se puede hacer en Asterisk 11, y conoces si existe algun plugin donde pueda usarse estos para el envio de SMS a traves de un servidor de SMS y cobrarlo a traves del dial plan de A2billing, incluso te cuento que yo tengo unos GW GSM donde puedo recibir datos y procesarlos para enviar SMS, Gracias

Hola Cesar,

que yo sepa no se puede y no se si existe algo parecido.

La única forma es escribir directamente a los desarrolladores para ver que dicen.

Saludos

- Andrea

Hola, el tutorial esta muy bueno, pero a mi nome funciona, estoy trabajando con asterisk 1.11.0.7 desde ubuntu
y cuando mando un mensaje me dice:

Dial("Message/ast_msg_queue","SIP/83,15") in new stack
chan_sip.c:29701 sip_request_call: Asked to get a channel of unsupported format (nothing) while capability is (gsm|ulaw|alaw|h263|testlaw)
app_dial.c:2437 dial_exec_full: Unable to create a channel of type 'zip' (cause 58 - Beareer capability not aviable)

que puede estarme pasando???
ayudaaaaaaaaaa!!!!

Alguien por favor que haya logrado configurar el sip sms en asterisk 11, no hay forma que me funcione, ayuda para configurarlo por favor alguien???

gracias yordan

Buen dia, estoy implementando esta solucion de mensajeria en PBX base asterisk 8.3, funciona o solo con asterisk 10?

Gracias Saludos.

Hola,

solamente desde la versión 10 de Asterisk

En la 1.8.X no

Saludos

funciona asterisk 16  nov 2020. mi unico inconveniente a sido conseguir la aplicacion de escritorio que mejor funcione con los chats

con microsip y phonelite envia y recibe bien los chats. con otras como ekiga llegan pero no los envia en momentos.

lo he probado con: ekiga, yate, kiax, microsip, zoiper, talksetup, discord, phonelite, linphone.

si encuentra algun cliente mas funcional me avisan

nota: tambien tengo funcionando para chats xmpp con prosody, independiente de asterisk