sábado, 7 de julio de 2012

Usar el GPS del movil android para usarlo en Google earth free


Esto es un entretenimiento que estoy haciendo ahora mismo.
Quiero conectar mi movil Galaxy mini con android al pc por bluetooth, de manera que comparta el GPS y pueda usarlo con google earth free


Y pongo "free" porque el google earth que todos conocemos es el gratis, el que NO tiene soporte para GPS, cosa que apañaremos en las siguientes líneas y podréis disfrutar de posisionamiento GPS en vuestro google earth.

Por un lado he encontrado un soft para android que puede compartir el GPS por bluetooth, se llama ExtGPS y lo podéis descargar del market.

Este programa simplemente lo que hace es trasformar tu android en un receptor GPS bluetooth.

Inconvenientes de este programa:
-En mi movil parece quedarse congelado algunas veces.
-Te asigna un canal de bluetooth para gps al voleo, y diferente cada vez....

Lo primero no sé si solo me pasará a mi, lo segundo ya lo corrijo desde linux con un script que hecho y que pienso compartir.

Lo segundo que hay que hacer es configurar el pc para que se conecte al GPS del movil

Para hacer esto, antes de nada dar las gracias a Guillermo Conde, que publicó un artículo en:
http://enunmomentillo.blogspot.com.es/2009/08/gps-bluetooth-en-ubuntu.html
De manera que aprendí como operar para hacer lo que quiero.
Os recomiendo visitéis su blog, es muy interesante y pone contenido de calidad.

Todo, absolutamente todo lo que necesitáis, lo quiero simplificar en un script que más adelante quiero crear para que lo haga todo del tirón sin complicaciones, pero lo mejor es que leáis todo para saber como funciona.

Primero descargamos la aplicación la aplicación ExtGPS del 'play store' (market de toda la vida)

Lo ejecutamos y con eso, ya tenemos listo el tlf.

Ahora vamos a configurar linux.

Escaneamos en busca de dispositivos bluetooth:
hcitool scann

Os deberá mostrar las directiones mac de los dispositivos encontrados, ejemplo:

scorpyomint@pc-citomint ~ $ hcitool scann
Scanning ...
    58:C3:8B:BC:82:4C    Scorpyo

Lo que nos hace falta es la dirección mac, que en este caso es: 58:C3:8B:BC:82:4C

Para poder ver los canales por los que está transmitiendo el bluetooth del tlf y encontrar la de GPS hay que usar el siguiente comando:

sdptool records 58:C3:8B:BC:82:4C

Tenéis que buscar el apartado en el que salta extGPS y que apuntdad e canal:

 Service Name: Symarctic ExtGPS
Service RecHandle: 0x10009
Service Class ID List:
  UUID 128: 00001101-0000-1000-8000-00805f9b34fb
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 15
Si os fijáis, el canal por el que opera es el 15.

Con este otro comando, podréis obtener el número de canal casi con total seguridad, pero mucho más dificil de recordar:
sdptool records 58:C3:8B:BC:82:4C | grep ExtGPS -A 7| grep Channel: |  awk '1 { print $2 }'

Para conectarnos a ese canal tendríamos que usar el comando:
sudo rfcomm connect hci0 58:C3:8B:BC:82:4C 15

En cuanto os conectéis en la aplicación ExtGPS del tlf aparecerá un cliente conectado al bluetooth.

Bien, ahora toca configurar unas cosillas para que google earth nos muestre un nuevo link en "Lugares" ese link será una dirección generada por un script que irá tomando datos del gps y las irá colocando en ese link, de manera que el google earth muestre tu posición actualizada.

Primero nos diregimos a la ruta de google earth, yo lo tengo en:
/opt/google/earth/free

Así que pongo:
cd /opt/google/earth/free

Con eso nos situamos en el directorio de google earth, ahora creamos un archivo llamado "Realtime GPS.kml".

nano "Realtime GPS.kml"

Dentro copiamos esto:

##########################################
 <?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<NetworkLink>
    <name>Realtime GPS</name>
    <open>1</open>
    <Link>
        <href>./realtime/Realtime GPS.kml</href>
        <refreshMode>onInterval</refreshMode>
    </Link>
</NetworkLink>
</kml>
##########################################

Ctrl+o para guardar y Ctrl+x para cerrar.

Crearemos una carpeta llamada "realtime"

mkdir realtime

Y por último creamos un nuevo fichero con código de python para hacer el seguimiento del gps:

nano gegpsd.py

Y dentro copiamos esto:

##########################################
 #!/usr/bin/python

# Copyright (C) 2007 by Jaroslaw Zachwieja <grok!warwick.ac.uk>
# Copyright (C) 2008 by TJ <linux!tjworld.net>
# Published under the terms of GNU General Public License v2 or later.
# License text available at http://www.gnu.org/licenses/licenses.html#GPL

import serial
import string
import sys
import getopt

def usage():
        print "Usage:"
        print " -p | --port <device>   e.g. /dev/ttyS0"
        print " -b | --baud <speed>    e.g. 4800"
        print " -f | --file <filename> e.g. /tmp/gps.kml"
        print " -h | --help     display options"

def main():
    # defaults
    serial_port = "/dev/ttyS0"
    serial_baud = 4800
    file = './realtime/Realtime GPS.kml'

    try:
        opts, args = getopt.getopt(sys.argv[1:], "p:b:f:h", ["port=", "baud=", "file=", "help"])
    except getopt.GetoptError:
        usage()
        sys.exit(1)
    else:
        for opt, arg in opts:
            if opt in ("-p", "--port"):
                serial_port = arg
            elif opt in ("-b", "--baud"):
                serial_baud = string.atof(arg)
            elif opt in ("-f", "--file"):
                file = arg
            elif opt in ("-h", "--help"):
                usage()
                sys.exit(0)
            else:
                print "Unknown option"

    gps = serial.Serial(serial_port, serial_baud, timeout=1)

    print "Serving data from %s (%d baud) to %s" % (serial_port, serial_baud, file)

    latitude = 0
    longitude = 0
    speed = 0
    heading_in = 0
    altitude = 0
    range = 1000
    tilt = 30

    while 1:
        line = gps.readline()
        datablock = line.split(',')

        if line[0:6] == '$GPRMC':
            latitude_in = string.atof(datablock[3])
            longitude_in = string.atof(datablock[5])
            try:
                altitude = string.atof(datablock[8])
            except ValueError:
                # use last good value
                altitude = altitude
            speed_in = string.atof(datablock[7])
            try:
                heading_in = string.atof(datablock[8])
            except ValueError:
                # use last good value
                heading_in = heading_in
            if datablock[4] == 'S':
                latitude_in = -latitude_in
            if datablock[6] == 'W':
                longitude_in = -longitude_in

            latitude_degrees = int(latitude_in/100)
            latitude_minutes = latitude_in - latitude_degrees*100

            longitude_degrees = int(longitude_in/100)
            longitude_minutes = longitude_in - longitude_degrees*100

            latitude = latitude_degrees + (latitude_minutes/60)
            longitude = longitude_degrees + (longitude_minutes/60)

            speed = int(speed_in * 1.852)
            range = ( ( speed / 100  ) * 350 ) + 650
            tilt = ( ( speed / 120 ) * 43 ) + 30
            heading = heading_in

            if speed < 10:
                range = 200
                tilt = 30
                heading = 0

            output = """<?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://earth.google.com/kml/2.0">
        <Placemark>
            <name>%s km/h</name>
            <description>^</description>
            <LookAt>
                <longitude>%s</longitude>
                <latitude>%s</latitude>
                <range>%s</range>
                <tilt>%s</tilt>
                <heading>%s</heading>
            </LookAt>
            <Point>
                <coordinates>%s,%s,%s</coordinates>
            </Point>
        </Placemark>
    </kml>""" % (speed,longitude,latitude,range,tilt,heading,longitude,latitude,altitude)

            f=open(file, 'w')
            f.write(output)
            f.close()

    ser.close()

if __name__ == "__main__":
    main()


##########################################
Fuente del script: http://tjworld.net/wiki/Linux/Ubuntu/GoogleEarthPlusRealTimeGPS
 
Guardamos con Ctrl+o y cerramos con Ctrl+x
Le damos permisos de ejecución:
chmod +x gegpsd.py

Abrimos google y le damos a Archivo > abrir, y buscamos el archivo que ya habíamos creado, el  "Realtime GPS.kml"

Al abrirlo aparecerá en lugares, pinchamos para que nos muestre la situación actual y no hará nada.... pero parpadeará.

Ahora tendríamos que abrir una terminal para ejecutar el script así que unirá los datos que entran del gps con el archivo que está mirando google:

/opt/google/earth/free/gegpsd.py -p /dev/rfcomm0

Y google debería empezar a marcar la ruta que estamos siguiendo, marcando velocidad a la que nos movemos.

Como dije antes, pronto me pondré con el escript, que es bastante sencillo de hacer, incluso gráficamente mostrando ventanucos y todo con el teléfono a elegir etc....

Un saludo.

2 comentarios:

  1. Respuestas
    1. Tendrías que adaptarlo a Windows... no se decirte ahora mismo porque esto fue un entretenimiento pasajero.. :D

      Un saludo.

      Eliminar