Два одновременных цикла Python с одним результатом - PullRequest
1 голос
/ 29 сентября 2011

В настоящее время у меня есть фрагмент кода Python 2.6, который запускает два цикла одновременно.Код использует модуль gps (gpsd) и модуль scapy.По сути, первая функция (gpsInfo) содержит непрерывный цикл во время захвата данных GPS с устройства GPS и записи местоположения на консоль.Вторая функция (ClientDetect) работает в непрерывном цикле, также анализирует эфир для данных Wi-Fi и печатает эти данные при обнаружении определенных пакетов.Я связал эти две петли с 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()

Может кто-нибудь взглянуть на мой код, чтобы увидеть, как лучше всего получить данные одновременно, когда есть Wi-Fi, для печати координат GPSтоже?Кто-то упоминал о реализации очередей, но я исследовал это, но безрезультатно, как его реализовать.

Как уже говорилось, цель этого кода состоит в том, чтобы сканировать как GPS, так и определенные пакеты Wi-Fi, а при обнаружении распечататьподробности, касающиеся пакета и места, где он был обнаружен.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Простой способ получить это - сохранить местоположение gps в глобальной переменной и заставить поток wifi sniffing считывать этот глобальный параметр, когда ему нужно напечатать некоторые данные; Суть в том, что, поскольку два потока могут одновременно обращаться к глобальной переменной, вам нужно заключить ее в мьютекс;

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 голос
/ 29 сентября 2011

Я думаю, вы должны быть более конкретными в своей цели.

Если все, что вы хотите сделать, это получить координаты GPS при обнаружении сети Wi-Fi, просто сделайте (псевдо-код):

while True:
    if networkSniffed():
        async_GetGPSCoords()

Если вы хотите записать все координаты GPS ихотите сопоставить это с данными сети Wi-Fi, просто распечатайте все данные вместе с метками времени и выполните постобработку, чтобы сопоставить сети Wi-Fi с координатами GPS с помощью метки времени.

1 голос
/ 29 сентября 2011

вам нужно указать python, что вы используете внешнюю переменную, когда вы используете gps в функции. Код должен выглядеть так:

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)  
...