miércoles 30 de enero de 2008

Mensajes SMS gratis

LA IDEA

Mientras las operadoras sigan sin cobrar por intento de conexión (es decir, cuando llamas y el otro no contesta o comunica) existe una manera de enviar datos de un teléfono a otro sin pagar un duro.

En realidad es algo parecido a lo de las llamadas perdidas: cuando alguien te hace una es para confirmar que le ha llegado tu mensaje o para decir que se acuerda de tí (menuda mariconada...). En cualquier caso la perdida es gratis (ni tú ni el que recibe la perdida habéis pagado por hacerla) y ha servido para transmitir información.

Pero la cosa vamás allá. Muchas veces alguien te envía un SMS y te dice: "Hemos quedado a las 8 en el bar del Miguel, si puedes venir haz una perdida corta, y si no, haz una perdida larga". O en vez de una corta y una larga te dicen que hagas una o dos perdidas seguidas.

Lo curioso de las llamadas perdidas es que, por lo que me ha parecido a mi, sólo se hacen en España. A gente que he conocido de Francia, Italia, Alemania, Noruega y EEUU no se les había ocurrido nunca la utilidad de una "perdida". Haced la prueba con los Erasmus: cuando llegan aquí no lo comprenden (aunque no tardan mucho en adaptarse al modo Español de ver las cosas: si puedes hacerlo gratis, no pagues, aunque sea peor, jeje...)

Bueno... el caso es que si nos pusiésemos en modo "ultra-rata", podríamos sacrificar conveniencia y comodidad a cambio de poder enviar más información gratis por medio de "perdidas". Por ejemplo, podríamos elegir 8 mensajes comunes que solemos enviar por SMS, como los siguientes:

  1. Si
  2. No
  3. Quedamos hoy a las 17:00 donde siempre
  4. Quedamos hoy a las 20:00 donde siempre
  5. Quedamos hoy a las 22:00 donde siempre
  6. Ya te llamo yo luego
  7. Te estoy esperando, date prisa
  8. Ya voy !!
Entonces transmitir uno de esos 8 mensajes usando tres bits: "Si" sería "000", "No" sería "001", ..., y finalmente "Ya voy !!" sería "111"

Ahora acordamos que el "0" es una perdida corta y el "1" una perdida larga.

Ya lo tenemos! Para decirle a alguien que "quedamos hoy a las 17:00 donde siempre" sólo tengo que hacerle tres perdidas: una corta, seguida de una larga y finalmente otra corta.

Claro que habría que acordar una cosa más para que funcionase el invento: Nadie debe coger el teléfono hasta que esté seguro de que se trata de una llamada de verdad (y no del inicio de una secuencia de tres perdidas). Esto es fácil: basta con esperar hasta el tercer o cuarto toque, y luego coger el teléfono. (de hecho esto ya se hace ahora, por si se tratase de una perdida de las de toda la vida).

Bueno... ya veis por donde van los tiros, ¿no?

Si en vez de 3 bits utilizásemos 5, podríamos transmitir hasta 32 mensajes distintos. Pero ahora en vez de 32 mensajes lo que vamos a hacer es transmitir las 27 letras del abecedario (incluimos la "ñ" pero dejamos fuera la "ll") más los signos de "?", "!", " " (espacio) y "." Con eso tenemos 31 caracteres. El 32 lo reservamos para indicar que ha terminado la transmisión del mensaje.

Entonces ya lo tenemos todo: Si queremos enviar "Hola Luis" primero hacemos 5 perdidas (largas y cortas, la secuencia que corresponda a la "H") seguida de otras 5 perdidas (para la "o"), etc... hasta llegar a la "s". Por último enviamos el símbolo de "fin de transmisión", que es el número 32, que se corresponde con 5 perdidas largas.


IMPLEMENTACIÓN

Se trata de hacer dos aplicaciones para teléfonos móviles:
  1. Una que dada un mensaje y un número de teléfono empiece a generar perdidas que transmitan el contenido del mensaje.
  2. Otra que en cuanto detecte que se están recibiendo perdidas de un mismo número, vaya traduciendo la secuencia en un mensaje de texto
La aplicación debería tener acceso a la funcionalidad de "hacer y recibir" llamadas... supongo que tanto Java para móviles, Symbian o Android tienen permisos ó, como mucho, habría que proporcionárselos explicitamente de alguna manera a la hora de instalar la aplicación... pero no sería mayor problema.

La aplicación receptora debería interceptar cualquier intento de llamada entrante y sólo una vez confirmado que no se trata de una perdida, activar el speaker del teléfono para que tú atiendas la llamada. Esto es más que nada para que no te esté sonando el móvil mientras recibes el mensaje (el proceso puede durar varios minutos!)


PROBLEMAS


Para empezar, supongamos que, en el peor de los casos, hacer una perdida tarda unos 5 segundos en completarse (entre que has marcado el último número y suena el "TUUUUUUU" que confirma que el otro lado está sonando)
Las perdidas cortas serían entonces de 5 segundos, y las largas pongamos que de 7.

Cojamos el peor caso: 7 segundos. Los SMS actuales dejan enviar hasta 160 caracteres. Es decir, que para tener la misma funcionalidad que un SMS, en el peor caso necesitamos 5*7*160 = 5600 segundos, que es una hora y media más o menos.

Pero eso no es lo peor, estamos estableciendo 5*160 = 800 llamadas de extremo a extremo, y esto consume muchísima batería (de hecho, seguramente un móvil de ahora no sería capaz)... además, si enviamos un par de estos mensajes a la semana, la operadora podría terminar por sospechar y acabar cobrándo los intentos de establecimiento (como juraría que ya se hace en EEUU). Aunque no se yo como se tomaría eso la gente aquí en España :)

Se podría, por ejemplo comprimir el texto a enviar, de manera que utilizaríamos menos llamadas perdidas... pero una solución mejor todavía sería si, además, utilizásemos un sistema en base 3 ó 4 ó más, en vez de en base 2. Es decir, si en vez de poder transmitir "1" ó "0" en cada perdida (que se corresponden con "perdida larga" ó "perdida corta") pudiésemos transmitir, por ejemplo, "00", "01", "10", "11" (que se corresponderían con "perdida muy corta", "perdida corta", "perdida larga" y "perdida muy larga".

Si hiciésemos esto último, ya no necesitamos cinco perdidas para transmitir una letra, sino sólo 3, y además en esas tres ya estaríamos transmitiendo, de paso, parte de la siguiente letra.

De hecho, para mensajes de 160 caracteres (160*5 = 800 bits) ya sólo necesitamos 800 / 2 = 400 llamadas.

Pero siguen siendo muchas. Un número razonable que no hiciese despertar las sospechas sería, como mucho, 10 llamadas por cada mensaje de 160 caracteres.

Para transmitir 600 bits en 10 símbolos (llamadas) necesitamos que cada símbolo (llamada) transporte 60 bits. Es decir, necesitamos diferenciar entre 2^60 tipos de llamadas perdidas "cortas", "menos cortas", ..., "largas", etc...

2^60 es mucha tralla... En el mejor de los casos me imagino (aunque esto habría que estudiarlo) que la mayor resolución que puede obtenerse al establecer una llamada con otro extremo es de 1 milisegundo (siendo muy optimista!). Con esto estoy diciendo que desde que a mi (que soy quien llama) me suena el "TUUUUUU" de que el otro extremo está recibiendo mi llamada hasta que le suena el "RIIIING" al otro extremo (que es quien recibe la llamada) hay un desfase de +/-1 milisegundo... (ya digo que seguramente sea de muuucho más, del orden de un segundo... pero sigamos soñando que si no se nos va el invento al traste).

Bueno... pues suponiendo que distinguimos milisegundos y que una llamada perdida puede durar, como mucho, dos segundos (antes de decidir que no es una perdida, sino una llamada normal), entonces con una misma llamada podemos transmitir 2000 estados posibles. Pongamos que 2048 para que el resto de operaciones de exacto.

2048 estados se corresponden con 11 bits. Es decir, 11 bits por llamada.

Para transmitir 800 bits que hay en un mensaje de 160 caracteres de 5 bits necesitamos 800 / 11 = 72 llamadas.

Siguen siendo muchas !!!

Pero si comprimimos esos 800 bits podemos reducir su tamaña hasta por 4 y pico (en el mejor de los casos, tal y como se explica aqui) y entonces si que nos quedamos en unas 18 llamadas !!!! Por tanto sería posible.