Archivo de la etiqueta: Android

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 🙂

Sobre Android Gingerbread y su API SIP

Hoy dandome una vuelta por mis RSS me he encontrado los los posts en SinoLogic y VoIP Novatos comentando que la nueva versión de Android, 2.3 o Gingerbread, incluye una API para desarrollar aplicaciones VoIP basadas en SIP.

La verdad es que me he quedado bastante sorprendido, así que lo primero que he hecho ha sido echar un vistazo a la documentación. Pero como dijo el Señor Lobo:

Tras un paseo rápido por el API me he quedado bastante decepcionado. Parece muy básica y solo permite implementar llamadas de audio. Nada de mensajería. Nada de presencia.

Además, mirando la documentación de SipSession, nos encontramos con esta perla:

Defines SIP session states, such as “registering”, “outgoing call”, and “in call”.

¿Cómo? ¿Desde cuando usa sesión puede estar “registering”? Vale que quieran que el API sea sencillo, pero el registro y una sesión SIP no están para nada relacionados.

Supongo que le irán añadiendo features, y tal vez en Android 3.0 mejore… De momento me quedo con Bria (tuve la suerte de ser betatester) y cSipSimple en Android.

Veremos que nos depara el futuro 😉

Jugando con Python en Android

Prácticamente todo lo que hay para Android esta hecho en Java, pero para los que nos dejó de molar hay alternativa: Android Scripting Environment.

ASE es una aplicación de Google gracias a la cual podemos instalar diversos lenguajes de scripting como Python, Perl, Lua, etc… Hasta ahora parece que la tenían un poco abandonada, pero han sacado dos versiones en la última semana, y por fin funciona sin tener que hacer nada a mano 🙂

Para instalarla basta con acceder a la web y bajarse el apk. Una vez instalamos la aplicación nos da la opción de instalar los diversos intérpretes, así que escogemos Python 😉 Además del propio intérprete se instalan varios scripts de demostración para empezar a jugar.

Happy coding!

4448535314_8f4d1998ca_o

4447762215_cc5b507710_o

4448540138_4649853595_o

Undervolted Kernel: ahorrando batería en Android

Una de las cosas que a mucha gente le preocupa sobre los teléfonos móviles es la duración de la batería. Teniendo en cuenta que cada vez son capaces de realizar más funciones, las baterías duran menos, aunque éstas hayan mejorado mucho en los últimos años.

Para mejorar la duración de la batería en nuestro terminal Android vamos a ver cómo instalar un undervolted kernel en un Nexus One (si dispones de otro terminal Android busca un undervolted kernel adaptado a él).

El concepto de un undervolted kernel es sencillo: consiste en mantener el procesador trabajando a la velocidad original, pero utilizando menos voltaje para ello. Al utilizar menos voltaje, obtendremos una mayor duración de la batería. Esto no es posible con todos los terminales, pero con el Nexus One al menos si, así que ¡vamos a ello!

Necesitamos tener instalada la ROM CyanogenMod 5.0.3.1, y los pasos a seguir son sencillos: descargar el kernel, flashearlo desde fastboot, reiniciar el terminal y habilitar el módulo de WiFi:

wget http://kmobs.scepterr.info/kernels/zImage33UV.zip
unzip zImage33UV.zip -d uvkernel
(reiniciamos el androide en modo fastboot)
./fastboot flash zimage uvkernel/zImage33UV
./fastboot reboot
(una vez ha arrancado normal)
./adb remount
./adb push uvkernel/b*.ko /system/lib/modules
./adb reboot

Happy undervolting!

Root y custom ROM en el Nexus One

Muy buenas amigos del androide,

Hoy haremos el Nexus One un poco menos “aburrido” 🙂 El Market tiene muchas aplicaciones, sí, pero no somos root, no podemos hacer tethering, ni tener OpenVPN… ¡asi que toca flashear!

Para poder tener una mayor libertado sobre nuestro terminal y poder flashear cualquier ROM primero flashearemos una recovery image, de manera que podamos hacer una copia de seguridad de todo el firmware y jugar sobre seguro. El asunto es que para poder instalar esta recovery image será necesario desbloquear el bootloader, algo que invalida la garantía, así que si no os importa ese pequeño detalle seguimos adelante. 😉

En este post haremos lo siguiente: desbloquear el bootloader, flasear la ROM CyanogenMod 5.0 beta3 y por ultimo flashear una nueva imagen del kernel que permite direccionar más RAM, de manera que el terminal se movera mas ‘fresco’. No será necesario hacer nada especial para hacernos root en el terminal, ya que la ROM que vamos a instalar ya lo trae de serie. ¡Vamos al lio!

Descargar el software necesario

Desbloquear el bootloader

Con el terminal apagado, mantenemos pulsado el trackball y pulsamos el boton de encendido para entrar en el menu del bootloader. Una vez alli utilizaremos la herramienta fastboot para desbloquear el bootloader:

./fastboot-linux oem unlock

Al ejecutar el comando nos saldra una ventana advirtiendonos de las consecuencias. El Capitán Obvio nos ordena que aceptemos.

El zip de fastboot tambien contiene los binarios para Windows y Mac, usad el que corresponda.

Instalar el Recovery Image

Flasheamos la imagen de recovery con fastboot (tenemos que estar en el menu del bootloader igual que antes):

./fastboot-linux devices (nos aseguramos de que nuestro androide es detectado)
./fastboot-linux flash recovery recovery-RA-nexus-v1.5.3.img

Instalar la ROM CyanogenMod 5.0 beta3

Primero tenemos que copiar los ficheros zip de la ROM de Cyanogen y las aplicaciones de Google a la raiz de la tarjeta SD.

Llegado este punto lo mejor es hacer un backup completo del terminal, seleccionando la opción “Nand backup”.

Antes de proceder a flashear nada es necesario que hagamos un wipe del terminal (al loro, que se borra TODO). Para ello iniciamos el terminal en el menu del bootloader y seleccionamos la opción recovery y luego “Wipe data/factory reset”.

Una vez hecho el wipe podemos proseguir a flashear, primero la ROM de Cyanogen y luego las aplicaciones de Google. Para ello utilizaremos la opción “Flash zip from sdcard”.

¡Más RAM por favor!

El Nexus One tiene mucha RAM, pero nunca hay demasiada RAM 😉 asi que vamos a instalar un nuevo kernel con soporte para direccionar más memoria, de manera que podamos tener más aplicaciones abiertas simultánemente sin que se nos ralentice el sistema.

./fastboot-linux flash zimage zImage-2.6.29.6-highmem

Yo he notado muchísima diferencia, así que os lo recomiendo.

Bueno, esto es todo por hoy, en el proximo post hablaremos de VoIP en Android, stay tuned!

4320083024_b298b49378_m

Fuentes:

http://android.modaco.com/content/google-nexus-one-nexusone-modaco-com/299241/05-jan-1-5-3-ra-nexus-recovery-image/
http://android.modaco.com/content/google-nexus-one-nexusone-modaco-com/299078/how-to-unlock-the-bootloader-on-your-nexus-one/
http://n0rp.chemlab.org/android/nexus/testing/
http://forum.xda-developers.com/showthread.php?t=623496

Nexus One: primeras impresiones

Como algunos sabéis por Twitter, aprovechando la jugada de la ITEXPO me he agennciado el juguete de moda: un Nexus One. Tras unos días jugando con el voy a comentar un poco el feeling que he tenido en diversos aspectos. Es obvio que el Nexus One ha sido diseñado para competir con el iPhone, y como casualmente también tengo uno, no puedo evitar compararlos 😉

Proceso de compra

Un 10 para Google. Hice el pedido un domingo por la tarde y el martes a las 9 de la mañana ya tenía el jueguete. Puedes seguir vía web por dónde va tu paquete, joder ¡solo falta el DNI de las personas que lo manipulan! ¡Y encima con mi nombre inscrito detrás! Me lo trajeron sin problemas al hotel, así que si váis de viaje a Estados Unidos por más de dos días no dudéis ni un segundo 🙂

Unboxing y primer contacto

Al abrir la caja te encuentras con un embalaje bastante similar el iPhone, sencillo, sin manual. Cuando te compras un Nokia u otro móvil te viene con un super-manual de 100 páginas que no se lee nadie. Cuando te compras un iPhone o un Nexus One no viene manual. Porque no hace falta. Es tan fácil de usar que no necesitas manual, y eso aunque a alguno le parezca un bug es  una feature.

El feeling del terminal es muy bueno: no pesa, parece consistente y robusto… pero le falta algo. Es dificil de explicar, pero podría decirse que veo el Nexus One como diseñado por un ingeniero mientras que el iPhone esta diseñado por alguien con más arte, por decirlo de alguna manera. No obstante, no echarás de menos tu iPhone, créeme.

Pantalla

Aunque la pantalla del N1 es solo 0,2 pulgadas más grande que la de el iPhone da la sensación de ser mucho más grande. Las fuentes son muy claras (de hecho es la que uso en mi desktop, ttf-droid) y se puede visualizar mucha más información que en el iPhone. Parece como si tuviera el doble de resolución o algo. :-O

Aplicaciones

Queridos señores de Apple, más vale que el iPhone OS 4.0 tenga multi-tasking, porque sino… El hardware del N1 es muy potente (procesador a 1GHz y 512MB de RAM) por lo que puedes tener muchas aplicaciones abiertas a la vez y ni te enteras. Personalmente siempre tengo un softphone SIP y un cliente de Jabber funcionando, y no tiene sentido abrir las aplicaciones solo cuando tu quieras hacer una llamada o mandar un mensaje, tienes que poder recibir llamadas…

“Apertura”

Vale, el iPhone funciona con un sistema operativo propietario y el N1 con uno libre, pero me he encontrado con las mismas trabas en ambos casos: si quieres hacer cosas diferentes con tu N1 tienes que ser root, y para eso tienes que realizar un proceso (habrá otro post 🙂 ) que invalida la garantía. Lo mismo que hacer el famoso jailbreak, así que no por utilizar un sistema operativo libre tienes todo el control sobre el terminal… ¿got root?

Concluyendo…

No os rallo más, pero si tenéis la oportunidad de haceros con uno (566$ libre) cogedlo, además ¡ser un early adopter siempre mola! 😉 He dejado unas fotos aquí en Flickr.

4299794413_7ffcaf1c1e_m