Приведенные выше ответы очень неэффективны и чрезмерно сложны для всех, кто использует современные версии gpsd и нуждается в данных только в определенное время вместо потоковой передачи.
Большинство GPS отправляют информацию о своем положении по крайней мере один раз в секунду.Предположительно, поскольку многие приложения на базе GPS нуждаются в обновлениях в реальном времени, подавляющее большинство примеров клиентов gpsd, которые я видел, используют вышеописанный метод наблюдения потока от gpsd и получения обновлений в реальном времени (более или менее часто, как их отправляет gps).
Однако, если (как в случае с OP) вам не требуется потоковая информация, а просто нужна последняя сообщенная позиция всякий раз, когда она запрашивается (т. Е. Посредством взаимодействия с пользователем или какого-либо другого события).), есть гораздо более эффективный и простой метод: пусть gpsd кеширует последнюю информацию о местоположении и запрашивает ее при необходимости.
* * * * * * Протокол JSON gpsd имеет запрос ?POLL;
, который возвращаетсамая свежая информация GPS, которую видел gpsd.Вместо того, чтобы перебирать бэклог сообщений gps и постоянно читать новые сообщения, чтобы избежать полных буферов, вы можете отправить сообщение ?WATCH={"enable":true}
в начале сеанса gpsd, а затем запрашивать последнюю информацию о местоположении всякий раз, когда вам это нужно, с помощью?POLL;
.Ответ представляет собой один объект JSON, содержащий самую свежую информацию, которую gpsd видел с GPS.
Если вы используете Python3, самый простой способ, который я нашел, это использовать gpsd-py3 пакет доступен на pypi.Чтобы подключиться к gpsd, получить последнюю информацию о местоположении и распечатать текущую позицию:
import gpsd
gpsd.connect()
packet = gpsd.get_current()
print(packet.position())
Вы можете повторить вызов gpsd.get_current()
всякий раз, когда вы хотите получить информацию о новой позиции, и за кадром будет выполнен пакет gpsd.?POLL;
вызов gpsd и возврат объекта, представляющего ответ.
Делать это со встроенным модулем gps
не очень просто, но есть ряд других доступных клиентов Python, иэто также довольно тривиально, чтобы сделать что-нибудь, что может выполнить сокетную связь, включая этот пример, используя 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}]}]}