Analizando el cliente SIP de Android 2.3 (Gingerbread)

Cuando se publicó que Android 2.3 (Gingerbread) iba a traer un cliente SIP integrado muchos lo recibieron con alegría, yo personalmente me mostre escéptico ante el asunto y ahora que he podido probarlo paso a comentar mi experiencia.

Lo primero que nos encontramos al acceder al menú de configuración es una interfaz bastante sencilla (tampoco me esperaba encontrar opciones de ICE en la primera versión) en la que sin entrar en ningún menu avanzado se nos pide usuario, contraseña y servidor.

Aquí he encontrado el primer problema. Me he puesto a capturar el tráfico con ngrep en el servidor y al habilitar la opción de registro este es el REGISTER que se ha generado:

La primera línea la he dejado aposta, ya que es la información que ngrep añade acerca del origen y destino del paquete. El problema es que el REGISTER se manda a la IP obtenida como resultado de una consulta DNS de tipo A, el cliente SIP de Gingerbread no hace consultas DNS SRV. Si a día de hoy alguien saca un cliente de correo que no consulta los registros MX sería lanzado a los tiburones, pero parece que en el caso de SIP todo vale, en fín.

Aun siendo casi inusable para mí he añadido un outbound proxy para que solo hiciera la consulta de tipo A. Y así ha quedado el REGISTER:

¿Y ese maddr? Es una forma deprecated de forzar una ruta para el mensaje en cuestión. Veamos qué dice la biblia al respecto:

The maddr field has been used as a simple form of loose source routing. It allows a URI to specify a proxy that must be traversed en-route to the destination. Continuing to use the maddr parameter this way is strongly discouraged (the mechanisms that enable it are deprecated). Implementations should instead use the Route mechanism described in this document, establishing a pre-existing route set if necessary (see Section 8.1.1.1). This provides a full URI to describe the node to be traversed.

Vamos, que ya en el 2002, cuando se publicó el 3261 maddr estaba obsoleto. Pero aun así la última versión de Android lo incluye. A tope con el SIP.

Hay más: si deseleccionamos la opción de registrarnos es de suponer que se genere un REGISTER eliminando nuestro binding, ¿no? Pues no.

Pasemos al INVITE. No he enredado mucho porque llegado este punto me encontraba demasiado cabreado, así que he hecho lo posible por hacer una llamada, pero no ha sido fácil. En la plataforma sip2sip.info al llamar al 3333@sip2sip.info se sobrescribe la parte del host para mandar el request a otro servidor, pero al tener el atributo maddr OpenSIPS se hace la picha un lío y no sabe muy bien qué hacer. -1 para OpenSIPS en esta.

En concreto se trata de un bug no resuelto que podéis consultar aquí. Para solucionarlo he reescrito el RURI eliminando todos los parámetros de la URI en caso de que se encuentre maddr:

if($(ru{uri.maddr}) != "") {
    $ru = "sip:" + $rU + "@" + $rd;
}

Es una cerdada, pero ha servido para poder hacer una llamda de prueba. Milagrosamente ha funcionado.

Conclusión

El cliente SIP de Android 2.3 no funciona. Puede funcionar en entornos muy simples, pero en nada que podamos considerar serio. Creo que no debería haber sido incluido en Android hasta estar más maduro, ya tenemos clientes SIP que funcionan en Android, como Bria, SIPDroid o CSipSimple. Para tener un cliente tan mediocre mejor no tener nada. Suena severo, pero la primera impresión es importante y en mi caso es nefasta, así que el Nexus One volverá al cajón hasta que otra noche que me aburra lo saque para ver si ha mejorado algo.

PD: La foto la he tomado prestada de El Androide Libre, me daba algo de pereza sacar el screenshot 🙂

One thought on “Analizando el cliente SIP de Android 2.3 (Gingerbread)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *