viernes, 22 de junio de 2007

Recibir e-mail en el celular desde el PC vía bluetooth

Primero, el parche antes de la herida: No soy un experto en shell así que reconozco que mi solución no debe ser la más elegante. Pero bueno.

La necesidad era la siguiente: Quería recibir notificaciones de correo electrónico a mi teléfono móvil a través de bluetooth. Por ejemplo, normalmente dejo el PC de escritorio encendido las 24 horas del día y si en algún momento me encuentro alejado de mi escritorio y recibo un e-mail, me gustaría saber de antemano si vale la pena acercarme al escritorio para atenderlo o no. Busqué por internet y no encontré nada similar así que me puse a picar.

Materiales:

El primer paso es averiguar la dirección MAC de nuestro teléfono y el canal por el cuál podemos enviar las notificaciones. El paquete bluez-utils incluye una herramienta que nos puede ayudar. Conectamos nuestro adaptador bluetooth al computador, habilitamos la conexión bluetooth en el móvil y abrimos una consola de comandos y ponemos:
sdptool search OPUSH
Lo que nos devolverá algo como esto:
Inquiring ...
Searching for OPUSH on 00:02:EE:6D:ED:1A ...
Service Name: OBEX Object Push
Service RecHandle: 0x10016
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 9
"OBEX" (0x0008)
Language Base Attr List:
code_ISO639: 0x454e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"OBEX Object Push" (0x1105)
Version: 0x0100

En negrita encontrarán la MAC y el canal respectivamente.
Luego, con el comando obex_test (que encontramos en el paquete openobex-apps) podemos hacer una prueba para enviar un archivo a nuestro celular, le damos como parámetros la MAC y el canal, de esta forma (en negrita aparece lo que el usuario ingresa):

obex_test -b 00:02:EE:6D:ED:1A 9
Using Bluetooth RFCOMM transport
OBEX Interactive test client/server.
> c
Connect OK!
Version: 0x10. Flags: 0x00
> p
PUT file (local, remote)> /pics/tux.jpg tux.jpg
name=/pics/tux.jpg, size=15811
Going to send 15811 bytes
Made some progress...
Made some progress...
Made some progress...
PUT successful!
> q

En este ejemplo, se ha enviado al teléfono la imagen tux.jpg que se encuentra en /pics/.
Hecho con éxito estos pasos, procedemos a descargarnos un script que nos permita hacer todo este trámite en una sola línea de comando. Este script se llama obexsend.sh y lo pueden descargar de aquí.
obexsend.sh espera como parámetros la dirección MAC, el canal y el archivo a enviar:

obexsend.sh 00:02:EE:6D:ED:1A 9 imagen.jpg

Ahora, creamos el siguiente script (reemplazando donde sea necesario) que yo llamé SendBluetoothAlert.sh:

#! /bin/sh
cd ~/inbox/
name=$(ls -tr |tail -1 |awk '{print $NF}')
from=$(grep -i -e from: $name)
subject=$(grep -i -e subject: $name)
rm /home/francisco/NewMail.txt
x1=$(echo "$from" | tee /home/francisco/NewMail.txt)
x2=$(echo "$subject" | tee -a /home/francisco/NewMail.txt)
/home/francisco/bin/obexsend.sh 00:02:EE:6D:ED:1A 9 /home/francisco/NewMail.txt

Ahora explicaré qué hace cada línea para que lo adapten a su medida.

Primero, nos posicionamos en el directorio donde Kmail almacena los mails:
cd /home/francisco/.kde/share/apps/kmail/mail/inbox/cur/

Almacenamos el nombre del archivo más reciente que existe en el directorio (el email nuevo):
name=$(ls -tr |tail -1 |awk '{print $NF}')

A partir de este archivo, creamos dos variables que almacenen el remitente y el asunto del e-mail:
from=$(grep -i -e from: $name)
subject=$(grep -i -e subject: $name)

Borramos nuestro archivo NewMail.txt que es el que enviaremos por bluetooth para "vaciarlo":
rm /home/francisco/NewMail.txt

Agregamos los campos remitente y asunto a nuestro archivo NewMail.txt:
x1=$(echo "$from" | tee /home/francisco/NewMail.txt)
x2=$(echo "$subject" | tee -a /home/francisco/NewMail.txt)


Finalmente enviamos el archivo NewMail.txt a nuestro móvil utilizando obexsend.sh (esta es una sola línea):
/home/francisco/bin/obexsend.sh 00:02:EE:6D:ED:1A 9 /home/francisco/NewMail.txt

Otorgamos permisos de ejecución a nuestro script: chmod +x SendBluetoothAlert.sh y estamos casi listos. Ahora vamos a la sección de notificaciones de Kmail y elegimos que ejecute nuestro script cada vez que tengamos un nuevo e-mail.

Eso es todo. Esto lo hice en una tarde y no creo que vuelva a trabajar en este tema pero aún falta mucho por mejorar:
  • Si llega un mail y estamos fuera del alcance del móvil (normalmente 20 metros); perdimos. Hay que implementar un sistema de cola y/o de reintentos.
  • Si se descargan dos nuevos mails del servidor, probablemente se notifique sólo del más reciente (no he probado ese caso aún).

Referencia:
1. Obtener MAC y canal de transmisión de datos, Duane Odom.

No hay comentarios:

Real Time Web Analytics