El las respuestas anteriores son muy ineficientes y demasiado complejas para cualquiera que use las versiones modernas de gpsd y necesite datos solo en momentos específicos, en lugar de transmitir.
La mayoría de los GPS envían su información de posición al menos una vez por segundo. Presumiblemente debido a que muchas aplicaciones basadas en GPS desean actualizaciones en tiempo real, la gran mayoría de los ejemplos de clientes gpsd que he visto utilizan el método anterior para ver una transmisión de gpsd y recibir actualizaciones en tiempo real (más o menos tan a menudo como los gps) .
Sin embargo, si (como en el caso de la OP) no lo hace necesidad transmisión de información, sino que sólo tiene la reportada última posición cada vez que se solicita (la interacción del usuario es decir, a través de o algún otro evento), hay una mucho más eficiente y método más simple: permita a gpsd almacenar en caché la última información de posición y consultarla cuando sea necesario.
El gpsd JSON protocol tiene una solicitud ?POLL;
, que devuelve la información de GPS más reciente que gpsd ha visto. En lugar de tener que iterar sobre la acumulación de mensajes gps y leer continuamente nuevos mensajes para evitar búferes completos, puede enviar un mensaje ?WATCH={"enable":true}
al comienzo de la sesión gpsd y luego consultar la última información de posición siempre que lo necesite con ?POLL;
. La respuesta es un objeto JSON único que contiene la información más reciente que gpsd ha visto desde el GPS.
Si está utilizando Python3, la forma más fácil que he encontrado es usar el paquete gpsd-py3 disponible en pypi. Para conectarse a gpsd, obtener la última información de la posición, e imprimir la posición actual:
import gpsd
gpsd.connect()
packet = gpsd.get_current()
print(packet.position())
puede repetir el gpsd.get_current()
llamada en cualquier momento nueva información de la posición, y detrás de las escenas el paquete gpsd ejecutará la llamada ?POLL;
a gpsd y devuelve un objeto que representa la respuesta.
Hacer esto con la no incorporada gps
módulo es terriblemente sencillo, pero hay una serie de otros clientes Python disponibles, y también es bastante trivial que ver con cualquier cosa que pueda realizar una comunicación de zócalo, incluyendo este ejemplo utilizando telnet
:
$ telnet localhost 2947
Trying ::1...
Connected to localhost.
Escape character is '^]'.
{"class":"VERSION","release":"3.16","rev":"3.16","proto_major":3,"proto_minor":11}
?WATCH={"enable":true}
{"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/pts/10","driver":"SiRF","activated":"2018-03-02T21:14:52.687Z","flags":1,"native":1,"bps":4800,"parity":"N","stopbits":1,"cycle":1.00}]}
{"class":"WATCH","enable":true,"json":false,"nmea":false,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}
?POLL;
{"class":"POLL","time":"2018-03-02T21:14:54.873Z","active":1,"tpv":[{"class":"TPV","device":"/dev/pts/10","mode":3,"time":"2005-06-09T14:34:53.280Z","ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23}],"gst":[{"class":"GST","device":"/dev/pts/10","time":"1970-01-01T00:00:00.000Z","rms":0.000,"major":0.000,"minor":0.000,"orient":0.000,"lat":0.000,"lon":0.000,"alt":0.000}],"sky":[{"class":"SKY","device":"/dev/pts/10","time":"2005-06-09T14:34:53.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}]}
?POLL;
{"class":"POLL","time":"2018-03-02T21:14:58.856Z","active":1,"tpv":[{"class":"TPV","device":"/dev/pts/10","mode":3,"time":"2005-06-09T14:34:53.280Z","ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23}],"gst":[{"class":"GST","device":"/dev/pts/10","time":"1970-01-01T00:00:00.000Z","rms":0.000,"major":0.000,"minor":0.000,"orient":0.000,"lat":0.000,"lon":0.000,"alt":0.000}],"sky":[{"class":"SKY","device":"/dev/pts/10","time":"2005-06-09T14:34:53.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}]}
La respuesta es buena, pero la suspensión (0.2) no es necesaria. session.next() bloqueará, por lo que tenerlo en el while True loop no sobrecargará tu CPU de todos modos. –
son 'get_current_value()' y 'session.next()' atomic? Necesitas un candado o algún mecanismo de sincronización si no es así. – devin
Leer/reemplazar una sola variable de instancia es una operación de seguridad de subprocesos automáticamente con Python. – synthesizerpatel