我目前有一段Python 2.6代码同时运行两个循环。该代码使用gps(gpsd)模块和scapy模块。基本上,第一个功能(gpsInfo)包含一个连续的while循环,从GPS设备抓取GPS数据并将位置写入控制台。第二个函数(ClientDetect)在一个连续循环中运行,也可以嗅探无线数据的空气,并在找到特定数据包时打印此数据。我已经将这两个循环与作为后台线程的GPS运行。我想要做的事情(并且已经苦苦挣扎了5天来解决方法)是这样的,当ClientDetect函数找到匹配并打印相应的信息时,我希望相应的GPS坐标也在打印时打印到安慰。目前我的代码似乎不起作用。
observedclients = [] p = "" # Relate to wifi packet session =
gps.gps(mode=gps.WATCH_NEWSTYLE)
def gpsInfo():
while True:
session.poll()
time.sleep(5)
if gps.PACKET_SET:
session.stream
print session.fix.latitude + session.fix.longitude
time.sleep(0.1)
def WifiDetect(p):
if p.haslayer(Dot11):
if p.type == 0 and p.subtype in stamgmtstypes:
if p.addr2 not in observedclients:
print p.addr2
observedclients.append(p.addr2)
def ActivateWifiDetect():
sniff(iface="mon0", prn=WifiDetect)
if __name__ == '__main__':
t = threading.Thread(target=gpsInfo)
t.start()
WifiDetect()
任何人都可以查看我的代码,看看在有wifi命中时如何最好地同时获取数据,同时打印GPS坐标?有人提到实施排队,但我已经研究了这个,但无法解决如何实现它。
如上所述,此代码的目的是扫描GPS和特定的wifi数据包,并在检测到时,打印与数据包相关的详细信息以及检测到的位置。
答案 0 :(得分:2)
获得此功能的一种简单方法是将gps位置存储在全局变量中,并在需要打印某些数据时将wifi嗅探线程读取为全局;问题是因为两个线程可以同时访问全局变量,所以你需要用互斥量包装它;
last_location = (None, None)
location_mutex = threading.Lock()
def gpsInfo():
global last_location
while True:
session.poll()
time.sleep(5)
if gps.PACKET_SET:
session.stream
with location_mutex:
# DON'T Print from inside thread!
last_location = session.fix.latitude, session.fix.longitude
time.sleep(0.1)
def WifiDetect(p):
if p.haslayer(Dot11):
if p.type == 0 and p.subtype in stamgmtstypes:
if p.addr2 not in observedclients:
with location_mutex:
print p.addr2, last_location
observedclients.append((p.addr2, last_location))
答案 1 :(得分:1)
当你在函数中使用gps时,你需要告诉python你正在使用外部变量。代码应如下所示:
def gpsInfo():
global gps # new line
while True:
session.poll()
time.sleep(5)
if gps.PACKET_SET:
session.stream
print session.fix.latitude + session.fix.longitude
time.sleep(0.1)
def WifiDetect(p):
global p, observedclients # new line
if p.haslayer(Dot11):
if p.type == 0 and p.subtype in stamgmtstypes:
if p.addr2 not in observedclients:
print p.addr2
observedclients.append(p.addr2)
答案 2 :(得分:1)
我认为你的目标应该更具体。
如果您想要做的就是在嗅探Wifi网络时获得GPS坐标,只需执行(伪码):
while True:
if networkSniffed():
async_GetGPSCoords()
如果您想要记录所有GPS坐标并希望将其与Wifi网络数据相匹配,只需将所有数据与时间戳一起打印出来,并通过时间戳将后续处理与GPS坐标进行匹配。< / p>