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.htmlDe 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 scannOs 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:4CPara 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:4CTené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 15En 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/freeAsí que pongo:
cd /opt/google/earth/freeCon 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 realtimeY por último creamos un nuevo fichero con código de python para hacer el seguimiento del gps:
nano gegpsd.pyY 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/rfcomm0Y 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.