Udev es el sistema que se encarga de gestionar los dispositivos que se conectan al sistema GNU/Linux. Cada vez que se detecta la conexion de un dispositivo al ordenador udev leer una serie de archivos llamados “reglas” situados en /etc/udev/rules.d/ (para openSuSe) y aquellos cuyo patrón de condiciones se cumpla se ejecuta la acción indicada.

GPS  en lineaGPS en linea

Udev se encarga, por ejemplo, de asegurar que cada vez que se conecte una webcam esta sea asignada al grupo “video”, y estos disponga de permisos de acceso correctos. O, como en este caso, ejecutar un script que haciendo uso de gpsbabel conecte nuestro GPS con GoogleEarth y poder ver/archivar en él nuestras rutas, waypoints ó incluso mostrar nuestra posición en tiempo real en GoogleEarth mientras nos desplazamos con el portatil en el coche.
Para transferir los datos usaremos gpsbabel, un programa capaz de leer y escribir datos del GPS en multitud de formatos. Gpsbabel funciona en linea de comandos y está disponible para otras plataformas (Windows, MAC) y es usado como base por multitud de otros programas.

Identificar el dispositivo

Lo primero es identificar el dispositivo tal y como se conecta al ordenador. Para esto enchufa el GPS al USB y en una consola ejecuta dmesg, en mi caso se puede leer:usb 2-9.1: new full speed USB device using ehci_hcd and address 57
usb 2-9.1: new device found, idVendor=091e, idProduct=0003
usb 2-9.1: new device strings: Mfr=0, Product=0, SerialNumber=0
usb 2-9.1: configuration #1 chosen from 1 choice
garmin_gps 2-9.1:1.0: Garmin GPS usb/tty converter detected
usb 2-9.1: Garmin GPS usb/tty converter now attached to ttyUSB0

Con los valores de idVendor y idProduct construimos una nueva regla para udev con el siguiente contenido:KERNEL=="ttyUSB*", ACTION=="add", SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666", RUN="/home/tu-nombre-usuario/bin/udev_gps.sh %k &>/dev/null"
Basicamente dice: Cuando se añada un dispositivo USB con IdVendor=091e y IdProduct=0003, da permisos de lectura y escritura a todo el mundo y ejecuta el script “udev_gps.sh” pasando como primer parametro el valor del KERNEL (ttyUSB0)
Guarda esta linea en /etc/udev/rules.d con el nombre que quieras, por ejem: 999-mis-regla-para-gps.rules
De ahora en adelante cada vez que se conecte este dispositivo el sistema tratará de ejecutar el script indicado, vamos a crearlo….

Script de ejecución de GpsBabel

En tu carpeta de ~/bin crea un script llamado udev_gps.sh con algo como esto:
#!/bin/bash
DISPLAY=":0.0"; export DISPLAY
HOME=/home/tu-nombre-usuario; export HOME
sel=`/opt/kde3/bin/kdialog --geometry 300x200 --miniicon gps.png --icon gps.png --title "Garmin GPS" --menu "GPS Conectado" \
opcion1 "Importar tracks de hoy" \
opcion2 "Importar tracks y waypoints de hoy" \
opcion3 "Importar tracks de ayer" \
opcion4 "GPS tiempo real"`
case $sel in
opcion1 )
gpsbabel -t -i garmin -f /dev/$1 -x nuketypes,waypoints -x track,pack,sdistance=0.5k -x track,start=`date +%Y%m%d -d "1 day ago"`,stop=`date +%Y%m%d -d "now"` -o kml,units=m -F "/home/tu-nombre-usuario/Desktop/Tracks.kml"
;;
opcion2 )
gpsbabel -t -i garmin -f /dev/$1 -x track,pack,sdistance=0.5k -x track,start=`date +%Y%m%d -d "1 day ago"`,stop=`date +%Y%m%d -d "now"` -o kml,units=m -F "/home/tu-nombre-usuario/Desktop/Tracks y Waypoints.kml"
;;
opcion3 )
gpsbabel -t -i garmin -f /dev/$1 -x nuketypes,waypoints -x track,pack,sdistance=0.5k -x track,start=`date +%Y%m%d -d "2 day ago"`,stop=`date +%Y%m%d -d "1 day ago"` -o kml,units=m -F "/home/tu-nombre-usuario/Desktop/Tracks ayer.kml"
;;
opcion4 )
/opt/kde3/bin/ksystraycmd --hidden gpsbabel -T -i garmin -f /dev/$1 -o kml -F "/home/tu-nombre-usuario/Desktop/gps_realtime.kml" &2>/dev/null; /opt/kde3/bin/kdialog --icon gps.png --msgbox "Detener GPS Tiempo real"; killall gpsbabel
;;
esac

El contenido y aspecto de este script podeis verlo en la captura de arriba. Basicamente incluye las 3 acciones que mas habitualmente hago cuando conecto el GPS al ordenador:
– Descargar el track del dia siempre y cuando mida más de 500 metros ( para evitar importar los movimientos dentro de casa o al encenderlo en el coche)
– Idem anterior más los waypoints del dia
– Idem de la primera pero del dia anterior (algunas veces tardo en volcar los tracks al ordenador)
– y una cuarta consistente en mantener gpsbabel conectado al GPS y escribiendo en un archivo KML/GoogleEarth las coordenadas que emite el dispositivo. Este archivo podeis abrirlo desde GoogleEarth como “Enlace de red” y activando una actualización cada 1-2 segundos vereis vuestra posición en tiempo real. (para facilitar la detencion de esto, añado un dialogo oculto en la barra del sistema que detiene el proceso gpsbabel activo. Necesario tener instalado ksystraycmd.).

Tendreis que adaptar los parametros de ejecución de Gpsbabel para que funcione con vuestro modelo de GPS o para exportar los datos a cualquier otro formato salida de los muchos que soporta. Según el script anterior los datos son guardados en formato KML legible perfectamente por GoogleEarth ó GoogleMaps.