This code transform the NMEA data that [[https://play.google.com/store/apps/details?id=com.jillybunch.shareGPS&hl=es|ShareGPS]] send to the port 50000 in latitude and longitude coordinates that Openstreetmaps can recognize.
#!/bin/bash
# -*- ENCODING: UTF-8 -*-
./adb forward tcp:50000 tcp:50000
./gpsread2.py
exit
#!/usr/bin/python
# -*- coding: utf-8 -*-
############################## gpsread2.py ###############################################
#********** #sudo apt-get install python-mechanize python-beautifulsoup
#**********Revisar si el webbrowser esta instalado
import socket, string, sys, mechanize, webbrowser
from bs4 import BeautifulSoup
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 50000))
except :
print '\n\n\n************No se ha establecido la comunicacion con el GPS********'
raise SystemExit###
def Muestra(datosa,datosc): #Muestras los datos obtenidos por el gps
lat1, long1,gl,ml,sl,glo,mlo,slo= DEC (datosa[2],datosa[4])
direc= obtdirec()
opensm(lat1,long1)
#print '[-] Latitud Hemisferio: ',gl,' grados ',ml, ' minutos',sl,' segundos.',datosa[3]
print '\n[-] Las coordenadas son: ' , lat1, long1
print '\n[-] La rápidez es: ', float(datosc)[7]*1.85, 'km/h'
print '\n[-] La dirección es: '+direc
save = raw_input('Desea guardar los datos?: (YES/no) ')
if save == "" or save == 'YES' or save == 'yes' or save == 'Yes' or save == 'Y' or save == 'y':
saved(lat1,long1,float(datosc)[7]*1.85,direc )
opensm (str(lat1), str(lon1))
def obtdirec(): #Extrae la direccion de los datos NMEA
infov=s.recv(250)
while '$GPGMC' not in infov:
infov=s.recv(250)
indv=info.find('$GPGMC') #Encuentra el inicio de $GPGGA $
endv=info.find('$',indv+6,) #Encuentra el final
strgv = infov[indv:endv].rsplit(',') #Separa los elementos del strin
print '[-] Hora actual: '+datos[0][0:2]+':'+datos[0][2:4]+':'+datos[0][4:6]
azimut=int(datos[7])
rumbo=''
if(azimut==0):
rumbo='Norte'
elif(azimut<90 and azimut>0):
rumbo='Noreste'
elif(azimut==90):
rumbo='Este'
if(azimut>90 and azimut < 180):
rumbo='Sureste'
if(azimut==180):
rumbo='Sur'
if(azimut>180 and azimut<360):
rumbo='Suroeste'
if(azimut==270):
rumbo='Oeste'
if(azimut>270 and azimut<360):
rumbo='Suroeste'
return (rumbo)
def saved(lat1,long1,rapid,direc ): #Guarda los datos en un archivo llamado listGPS.txt en el directorio donde est[a el script de python
try:
desc=raw_input('\n\n\tDescripcion: ')
f= open ('listGPS.txt', 'r')
if f.readline() == "":
f.close()
f= open ('listGPS.txt', 'w')
f.write ('\t\t\tLista de coordenadas GPS\n')
f.close()
else:
pass
f= open ('listGPS.txt', 'a')
f.write ('\n---->\t'+lat1+'\t'+long1+'\t'+rapid+' km/h '+direc+'\t\t'+desc )
f.close()
print '\n\nSe guardaron los datos en listGPS.txt'
except:
print '\n\n\n Error en la escritura de los datos.'
def DEC (gms1,gms2): #Convierte los datos de Lat y Long grados, minutos y segundos en decimales
seplat = gms1.rsplit('.')
seplong= gms2.rsplit('.')
gl=float(seplat[0][:2])
ml=float(seplat[0][2:])
sl=float('0.'+seplat[1])*60
glo=float(seplong[0][:3])
mlo=float(seplong[0][3:])
slo=(float('0.'+seplong[1])*60)
lat= gl+(ml/60)+(sl/3600) #No hago casos para saber que signo llevan la latidud y la longitud, debido a q es restringido a Costa Rica, por tanto los signos no van a cambiar
longi=-(glo+mlo/60+(slo/3600))
return (lat,str(longi),gl,ml,sl,glo,mlo,slo)
def opensm(lat, lon): #Abre la posicion en OSM
try:
url= 'http://nominatim.openstreetmap.org/search.php'
br = mechanize.Browser()
br.set_handle_robots(False) # ignore robots
br.set_handle_refresh(False) # can sometimes hang without this
response = br.open(url)
#for form in br.forms(): #Encuentra formularios
#print "Form name:", form.name
#print form
br.form = list(br.forms())[0] # seleccion del formulario
br.set_all_readonly(False) # allow everything to be written to
control1 = br.form.find_control("q") #Selecciona el control por nombre
control2 = br.form.find_control ("polygon")
ll= lat+' '+lon
control1.value= ll
control2.value=['1']
resp = br.submit()
response.close()
html = br.response().read() #
soup = BeautifulSoup(html)
for link in soup.find_all():
x=(link.get('href'))
#print "------>",type( x), x
if type(x)== str:
for i in lat:
if i in x:
es = True
else:
es = False
if es == True:
linkm=x
break
else:
pass
else:
pass
webbrowser.open_new(linkm) #Abre el link obtenido
except:
print '\n\n\n Revise la conexión a internet.'
def detec(lectura):
if lectura[2]== '':
print 'NO HAY SEÑAL DE SATELITES, ASEGURESE DE NO ESTAR EN LUGARES CUBIERTOS'
resp= raw_input('\n\n\nQuiere intentarlo de nuevo?: (YES/no) ')
if resp == '' or resp == 'YES' or resp == 'yes' or resp == 'Yes' or resp == 'Y' or resp== 'y':
try:
main()
except IndexError:
main()
else:
return
raise SystemExit
else:
pass
def main():
info=s.recv(250)
while '$GPGGA' not in info:
info=s.recv(100)
print info
ind=info.find('$GPGGA') #Encuentra el inicio de $GPGGA en el codigo NMEA obtenido
end=info.find('$',ind+6,) #Encuentra el final
strg = info[ind:end].rsplit(',') #Separa los elementos del string resultante
print strg
detec(strg) #Detecta la señal de los satélites
Muestra(strg,strgc,strgv)
#opensm('10.08985','-84.47398')
main()
***The problem in that method is about no satellites signal, in that case shareGPS sends empty NMEA data.
[[teaching:ie0117:proyectos:2013:ii:proyecto_gps_-_drivecr|Return to previous page]]