viernes, 14 de septiembre de 2007

Wardriving y geoposicionamiento de puntos de acceso wifi con Google Earth

   Según la Wikipedia, el Wardriving es:
La búsqueda de redes inalámbricas Wi-Fi desde un vehículo en movimiento. Implica usar un coche o camioneta y un ordenador equipado con Wi-Fi, como un portátil o una PDA, para detectar las redes.
   Además, si en la ecuación utilizamos también un GPS podemos geoposicionar dichos puntos de acceso.

   Yo he modificado ligeramente esta idea utilizando la PDA con el GPS y aprovechando los paseos que damos por las tardes con Judith. Así, sirviendome del mágnifico programa para buscar redes wifi WiFiFoFum y enlazando éste con el GPS he ido almacenando logs con los distintos puntos de acceso wifi que he ido encontrando en sucesivos paseos. Hasta aquí todo muy bien, pero tener un log como este no sirve de mucho:
0001386FCE3D WLAN_D6  AP On  20:16:57 20:18:03 40,2397633333333 -3,77285833333333
0002CF503AE3 WLAN_11 AP On 20:24:54 20:26:21 40,24089 -3,77058833333333
0003C9D1E558 Comtrend AP On 19:58:44 20:04:13 40,244575 -3,77372
000F213108CF Mota AP On 20:20:43 20:22:17 40,239985 -3,77503166666667
0011E3E40BD0 THOMSON AP Off 20:35:02 20:35:03 40,241825 -3,77842333333333

   Pensando cómo mostrar esa información de manera que resultase útil visualmente, busqué información sobre cómo convertir mis logs (en formato CSV pero con tabuladores en lugar de comas) en archivos KML que pudiera importar en Google Earth. Existen webs que convierten datos en CSV a KML, pero después de probar el resultado no me convencía demasiado porque el código generado era demasiado complejo y contenía mucha información inútil. Así, después de buscar algo de información sobre KML me dispuse a crear mi propio generador en shell script y AWK. El resultado es el script gps2kml:
#!/bin/sh
#
# gps2kml.sh: Script de creación de ficheros KML para
# Google Earth a partir de CSV separados por tabuladores
#
# Iván López Martín
# http://lopezivan.blogspot.com
#
DATA_FILE=$1
KML_FILE=$2
SKELETON=`mktemp -u`
WEP=$4

create_AWK_Skeleton() {
echo { > $SKELETON
echo if \(\$4 \== \""On"\"\) icon=\""http://farm2.static.flickr.com/1248/1196978492_72600c8064_o.png"\" >> $SKELETON
echo if \(\$4 == \""Off"\"\) icon=\""http://farm2.static.flickr.com/1260/1196978476_e1a2070680_o.png"\" >> $SKELETON
echo print \""<Placemark>"\" >> $SKELETON
echo print \"" <name>\"\$2\"</name>"\" >> $SKELETON
echo print \"" <description>\"\$1\"</description>"\" >> $SKELETON
echo print \"" <Point>"\" >> $SKELETON
echo print \"" <coordinates>\"\$8\",\"\$7\",0</coordinates>"\" >> $SKELETON
echo print \"" </Point>"\" >> $SKELETON
echo print \"" <Style>"\" >> $SKELETON
echo print \"" <IconStyle>"\" >> $SKELETON
echo print \"" <Icon>"\" >> $SKELETON
echo print \"" <href>\"icon\"</href>"\" >> $SKELETON
echo print \"" </Icon>"\" >> $SKELETON
echo print \"" </IconStyle>"\" >> $SKELETON
echo print \"" </Style>"\" >> $SKELETON
echo print \""</Placemark>"\" >> $SKELETON
echo } >> $SKELETON
}

# Comprobación de parámetros
if [ "$#" != "2" ]; then
echo "Uso: `basename $0` fich_datos fich_kml"
exit 1
fi

# Creamos el esqueleto de la función para awk
create_AWK_Skeleton


# Escribimos la cabecera del fichero kml
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $KML_FILE
echo "<kml creator=\"gps2kml http://lopezivan.blogspot.com/2007/09/wardriving-y-geoposicionamiento-de.html\" xmlns=\"http://earth.google.com/kml/2.1\">" >> $KML_FILE
echo "<Folder>" >> $KML_FILE
echo " <name>APs Wifi Parla</name>" >> $KML_FILE
echo " <open>0</open>" >> $KML_FILE

# Cambiamos las comas por puntos
sed "s/,/./g" $DATA_FILE > .tmp$DATA_FILE

DATA_FILE=.tmp$DATA_FILE

# Generamos los puntos
awk -f $SKELETON -F"\t" $DATA_FILE >> $KML_FILE

# Escribimos el final del fichero
echo "</Folder>" >> $KML_FILE
echo "</kml>" >> $KML_FILE

# Borramos los temporales
rm $SKELETON 2>/dev/null
rm $DATA_FILE 2>/dev/null

   La forma de ejecutarlo es muy sencilla y lo único que necesita es el fichero de entrada con los datos y el fichero de salida. Aspectos a tener en cuenta:
  • Como es una versión de andar por casa no se realizan demasiadas comprobaciones.
  • Se utilizan dos iconos distintos en función de si el punto de acceso tiene cifrado o no.
  • Se generan todos los puntos de acceso en una misma carpeta dentro de GoogleEarth.
  • El fichero generado funciona correctamente en las versiones 4.1.7076.4458 y 4.2.0180.1134 de Google Earth bajo Linux. No lo he probado ni en windows ni con otras versiones, aunque no debería de haber problemas.

  •    Después de filtrar los puntos de acceso duplicados de todos los logs de los distintos días, ejecutamos el script con este fichero de entrada:
    ivan@doraemon:~$ ./gps2kml.sh datosGPS.txt paseoJudith.kml

       Abrimos Google Earth cargamos el fichero recien generado (por si no quereis generarlo) y obtendremos una vista de la zona por la que vivo con todos los puntos de acceso que he ido encontrado.

       Así que ya sabéis, si alguna tarde vais por Parla por esa zona y veis a esta preciosa niña, que sepáis que el que va empujando el carrito soy yo ;-).

       P.D: Después de terminar el script y el post he buscado en la web de WiFiFoFum y me he dado cuenta que desde la versión 2.2.5 del 10 de abril de 2007, el programa permite exportar a KML. ¡Eso me pasa por no utilizar versiones actualizadas! (la mía es de octubre de 2006). De todas formas me ha servido para conocer el formato KML y aprovechar los paseos de Judith. Además, el script se puede utilizar para generar el fichero KML desde otros orígenes que no sean el WifiFofum.

    6 comentarios:

    Anónimo dijo...

    ¡Ufff! Esto sí que es un paseo aprovechado ;-)

    Tomo nota por si alguna vez me compro (o regalan) una iPaq nueva, que la viejecita que tengo ahora no tiene WiFi :-(

    Por cierto, el link: http://lopez.ivan.googlepages.com/paseoJudith.kml

    ¡Me ha parecido muy interesante!... ¡Y muy geek! ;-)

    Iván dijo...

    Hola Super coco,

    la verdad es que ha sido en más de un paseo. Si tenemos que hacer todo ese recorrido en una tarde... ni en coche!.

    En lugar de una iPaq siempre puedes usar un portatil, aunque es más grande y para el paseo es más incómodo.

    Respecto al link y a googlepages, es que hay que buscar almacenamiento donde sea!. Gracias por lo de geek, intento que así sea ;-)

    Saludos, Iván.

    Dani dijo...

    joé, menudo máquina estás hecho, thank you por el script!!

    Iván dijo...

    Jeje, muchas gracias Dani. Aquí estamos para compartir y ayudar, así que me alegro de que te resulte útil el script.

    Saludos, Iván.

    Manu dijo...

    Hola Iván, muchas gracias por este script me ha sido de mucha ayuda, lo he retocado un poco para crear un archivo kml con etiquetas .
    Tengo una pregunta, ¿no sabrías de un manual para poder hacer este tipo de script para ejecutarlos en windows, por ejemplo .bat?

    Manu dijo...

    *con etiquetas TimeSpan

    Publicar un comentario