使用Python在单独线程中轮询GPSd

2024-10-01 00:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个python类,它代表一个空气质量站。每个空气质量站都有一个与之相关的GPS,这样我们就可以识别出该站的纬度和纵向坐标。GpsPoller在一个单独的线程上被调用,并持续运行,直到线程被终止。GpsPoller应用于获取任何给定时间的最新GPS数据。在

以下是我目前所做的:

class AirStation:

    def __init__(self):
        if not self._init_station():
            raise InitException("Could not initialize the AirStation!")

    def _init_station(self):
        self._id = utils.get_mac('wlan0')
        self._gpsp = utils.GpsPoller()
        self._gpsp.start()  # start polling the GPS sensor

        self._lat = self._gpsp.get_gps_data()
        self._lon = self._gpsp.get_gps_data()
        return True


class GpsPoller(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.session = gps(mode=WATCH_ENABLE)
        self.current_value = None
        self.running = True

    def get_gps_data(self):
        return self.current_value

    def run(self):
        while self.running:
            self.current_value = self.session.next()

关于这个代码,我有两个问题:

  1. 在AirStation类初始化功能中,确保纬度和纵向读数的最佳方法是什么?在初始化时,我得到的是一个纬度和纵向值为无(我怀疑是由于时间不够,GPS不得不获得卫星定位)。

  2. 确保GpsPoller与AirStation实例一起终止的标准方法是什么?每当我在命令行进行测试时,exit()命令都会挂起,因为附加线程会挂起。


我已经看了很多示例和文档,包括以下内容:

任何额外的资源或直接回答将不胜感激!在


Tags: selfdatagetinitvaluedefcurrent线程
2条回答

我相信我已经找到了最好的解决办法,我在上面张贴的问题。以下是我的想法:

  1. GPS模块需要足够的时间来定位卫星。没有办法加快这个过程(至少为了这个应用程序)。从我的实验来看,我使用的GPS模块在大约4-5秒内返回所有的GPS修正。在

    为了回答我的第一个问题,确保在初始化AirStation对象时获得纬度和纵向坐标的最佳方法是在启动GpsPoller后等待几秒钟。

  2. 确保GpsPoller线程终止的最佳方法是通过设置self终止循环条件_gpsp.正在运行在父进程中为False,然后等待线程使用self与父线程重新连接_gpsp.join(). 在

    这些操作可以放在close()方法中,该方法应该在station对象的生命周期结束时调用。

  1. 我不熟悉您似乎在GpsPoller类中使用的gps模块,以及它是否支持对其进行轮询(检查是否存在fileno属性)。然而,假设它没有,我能提供的最好的方法就是忙碌地等待,直到值设置好

比如:

while True:
    if self._lat is None:
        self._lat = self._gpsp.get_gps_data()
    elif self._lon is None:
        self._lon = self._gpsp.get_gps_data()
    else:
        break
  1. 确保线程与父进程一起消亡的最佳方法是执行您已经完成的操作,并将布尔值与其主循环相关联(主循环可以设置为False),从而在线程应该终止时中断循环。我假设您缺少的是一个调用,当您的AirStation类关闭时,将gpsPoller的running属性设置为False。在

相关问题 更多 >