miércoles 10 de octubre de 2007

Gtalk2Voip: pasarela SIP-Gtalk-MSN-Yahoo

Gracias al servicio Gtalk2Voip es posible hablar y chatear entre cuentas SIP genéricas, Gtalk, MSN y Yahoo.

Explico a continuación algún ejemplo y posteriormente una pequeña configuración para OpenSer que ofrece algo de transparencia.

Llamada de SIP a Gtalk

Primeramente es necesario que el receptor (en este caso una cuenta de Gtalk user@gmail.com) autorice a un nuevo contacto (la pasarela) en su lista de contactos. Para ello introducir la dirección del receptor (user@gmail.com) en el recuadro "Subscription" de la página www.gtalk2voip.com.

Al usuario user@gmail.com le aparecerá un nuevo contacto service@gtalk2voip.com que tendrá que aceptar para recibir llamadas y mensajes.

A continuación desde nuestra cuenta SIP (genérica, de un proveedor, etc) llamamos o enviamos un mensaje a: sip:user_at_gmail.com@gtalk.gtalk2voip.com.

Y ya está :)

Llamada de SIP a MSN y Yahoo

Idem, pero con una modificación:

  • Llamada o chat a user@hotmail.com:    sip:user_at__at_msn.com@msn.gtalk2voip.com
  • Llamada o chat a user@yahoo.com:    sip:user_at__at_yahoo.com@yahoo.gtalk2voip.com

Llamada desde Gtalk a cuenta SIP

Muy fácil, ya que Gtalk se integra con este servicio y mostrará un usuario SIP en la lista de contactos (si previamente dicho usuario SIP le ha llamado y le hemos aceptado como contacto).

Es decir, Gtalk hace transparente este servicio en su softphone.

Llamada desde MSN o Yahoo a cuenta SIP

No tan bonito, ya que el único contacto que veremos será el de service@gtalk2voip.com y habrá que enviar comandos propios de este servicio.

Iniciamos un "chat" con service@gtalk2voip.com de nuestra lista de contactos (porque se supone que previamente nos hemos subscrito y aceptado a este contacto), y escribimos: IM sipuser@domain.org (para mensajería instantánea) ó CALL sipuser@domain.org (para llamada de voz)

Podemos conocer todas las posibilidades (hay muchas más) abriendo un chat con service@gtalk2voip.com y escribiendo HELP.

Configuración transparente para OpenSer

Sin duda es un poco feo escribir en nuestro softphone user_at_gmail.com@gtalk.gtalk2voip.com, así que en la sección "outbound" de nuestor OpenSer podemos facilitar un poco las cosas traduciendo las direcciones directamente:

# ---------------------------------------
# Outbound Section
# ---------------------------------------
# Mensajes que no van a nuestro servidor.
route[9] {

  xlog("L_INFO", "Outbound\n");

  ### Pasarela SIP to GoogleTalk.
  # usuario@gmail.com --> usuario_at_gmail.com@gtalk.gtalk2voip.com
  if ($rd == "gmail.com") {
   $avp(s:ru) = $ru;
   avp_subst("$avp(s:ru)", "/@gmail.com/_at_gmail.com@gtalk.gtalk2voip.com/g");
   $ru = $avp(s:ru);
   xlog("L_INFO", "$(Cps)Llamada a GoogleTalk$(Cxx) --> nueva RURI = $ru\n");
   sl_send_reply("181", "Llamada a GoogleTalk redirigida a $ru");
  }

  ### Pasarela SIP to Yahoo Messenger.
  # usuario@yahoo.com --> usuario_at_yahoo.com@yahoo.gtalk2voip.com
  else if ($rd == "yahoo.com") {
   $avp(s:ru) = $ru;
   avp_subst("$avp(s:ru)", "/@yahoo.com/_at_yahoo.com@yahoo.gtalk2voip.com/g");
   $ru = $avp(s:ru);
   xlog("L_INFO", "$(Cps)Llamada a Yahoo Messenger$(Cxx) --> nueva RURI = $ru\n");
   sl_send_reply("181", "Llamada a Yahoo Messenger redirigida a $ru");
  }

  ### Pasarela SIP to MSN Messenger.
  # usuario@msn.com --> usuario_at_msn.com@msn.gtalk2voip.com
  else if ($rd == "msn.com") {
   $avp(s:ru) = $ru;
   avp_subst("$avp(s:ru)", "/@msn.com/_at_msn.com@msn.gtalk2voip.com/g");
   $ru = $avp(s:ru);
   xlog("L_INFO", "$(Cps)Llamada a MSN Messenger$(Cxx) --> nueva RURI = $ru\n");
   sl_send_reply("181", "Llamada a MSN Messenger redirigida a $ru");
 }
  else if ($rd == "hotmail.com") {
   $avp(s:ru) = $ru;
   avp_subst("$avp(s:ru)", "/@hotmail.com/_at_hotmail.com@msn.gtalk2voip.com/g");
   $ru = $avp(s:ru);
   xlog("L_INFO", "$(Cps)Llamada a MSN Messenger$(Cxx) --> nueva RURI = $ru\n");
   sl_send_reply("181", "Llamada a MSN Messenger redirigida a $ru");
  }

  if (method=="INVITE") {
   t_on_branch("8");; # Tratamiento NAT por cada branch con RTP-proxy.
  }

  route(1);
  exit;

}

De esta forma podemos, desde nuestro softphone registrado en OpenSer, llamar o chatear directamente con las direcciones reales de los usuarios de Gtalk, MSN y Yahoo sin tener que "traducirlas" a la nomenclatura de la pasarela Gtalk2Voip: user@gmail.com - user@hotmail.com - user@yahoo.com

Problemas

  • Esta comodidad acarrea un problema. Si enviamos un mensaje a user@gmail.com y éste nos responde, su campo "From" no será user@gmail.com, sino user_at_gmail.com@gtalk.gtalk2voip.com, por lo que nos abrirá una ventana nueva e independiente de la que habíamos iniciado nosotros.
  • Según mis pruebas, este servicio de pasarela Gtalk2Voip no respeta la cabecera "Record-Route" que inserta mi OpenSer (cuyo objetivo es el de mantener a OpenSer en el path de toda la comunicación), por lo que si durante una llamada de voz SIP-Gtalk uno de los usuarios cuelga, el BYE no pasa por OpenSer. No obstante tengo que confirmar este bug aún, ya que el autor me contestó en un correo que sí respetaban esa cabecera.