的以上回答使用的GPSD的现代版本,并需要在只有特定的时间的数据,而不是流是非常低效和任何人过于复杂。
大多数GPSes每秒传送位置信息至少一次。大概是因为许多基于GPS的应用程序的愿望实时更新,绝大多数的GPSD客户端的例子我见过的使用看,从通用产品安全指令流和接收实时更新的上述方法(或多或少尽可能多的GPS将它们发送) 。但是,如果(如在OP的情况下),你不需要需要流信息,但只要需要最后报告的位置(即通过用户交互或其他事件),就需要最后报告的位置,更简单的方法:让gpsd缓存最新的位置信息,并在需要时查询它。
gpsd JSON protocol有一个?POLL;
请求,它返回gpsd已经看到的最新GPS信息。而不必遍历的GPS信息的积压,并不断地阅读新邮件,以避免全缓冲的,你可以在GPSD会话开始发送?WATCH={"enable":true}
消息,然后查询最新的位置信息,只要你有?POLL;
需要它。响应是包含gpsd从GPS中看到的最新信息的单个JSON对象。
如果您使用Python3,我发现最简单的方法是使用PyPI上可用的gpsd-py3包。要连接到GPSD,获取最新的位置信息,并打印当前位置:
import gpsd
gpsd.connect()
packet = gpsd.get_current()
print(packet.position())
可以重复,只要你想新的位置信息gpsd.get_current()
呼叫,以及幕后的GPSD包将执行?POLL;
调用gpsd并返回表示响应的对象。
与内置gps
模块不是非常简单的这样做,但也有一些其他的Python客户可用,并且它也是相当琐碎与任何可以进行socket通信,包括使用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}]}]}
答案看起来不错,但睡眠(0.2)不是必需的。 session.next()会阻塞,所以在True循环中不会超载你的cpu。 – 2012-01-27 15:12:37
是'get_current_value()'和'session.next()'原子?如果没有,你需要一个锁或一些同步机制。 – devin 2012-04-02 15:38:27
读取/替换单个实例变量是Python自动执行的线程安全操作。 – synthesizerpatel 2012-04-02 23:43:42