1

私は現在、2つのループを同時に実行するPython2.6のコードを持っています。コードはgps(gpsd)モジュールとscapyモジュールを使用します。基本的に、最初の関数(gpsInfo)には、GPSデバイスからGPSデータを取得し、位置をコンソールに書き込む継続的なwhileループが含まれています。2番目の関数(ClientDetect)は継続的なループで実行され、wifiデータの空気をスニッフィングし、特定のパケットが見つかったときにこのデータを出力します。GPS 1つをバックグラウンドスレッドとして実行して、これら2つのループをスレッド化しました。私が探しているのは(そしてその方法を見つけるのに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と特定のwifiパケットの両方をスキャンし、検出されたときに、パケットと検出された場所に関連する詳細を印刷することです。

4

3 に答える 3

2

これを取得する簡単な方法は、gpsの場所をグローバル変数に格納し、データを出力する必要があるときに、wifiスニッフィングスレッドにそのグローバルを読み取らせることです。落とし穴は、2つのスレッドが同時にグローバル変数にアクセスできるため、ミューテックスでラップする必要があるということです。

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))  
于 2011-09-28T21:09:36.060 に答える
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)  
于 2011-09-28T21:02:25.927 に答える
1

私はあなたがあなたの目標をより具体的にすべきだと思います。

WifiネットワークがスニッフィングされたときにGPS座標を取得するだけの場合は、次のようにします(疑似コード)。

while True:
    if networkSniffed():
        async_GetGPSCoords()

すべてのGPS座標のログが必要で、それをWifiネットワークデータと照合する場合は、すべてのデータをタイムスタンプとともに出力し、後処理を行って、タイムスタンプを介してWifiネットワークをGPS座標と照合します。

于 2011-09-28T21:08:10.087 に答える