Erkennen, ob iPhone / Android in der Nähe?

10

Ich arbeite remote und es wäre praktisch zu wissen, wann jemand zu einem Meeting / Mittagessen in mein Büro gegangen ist.

Ich dachte, ich könnte passiv erkennen, welche Telefone sich in der Nähe des Himbeer-Pi befinden (und sie dann im Web / Dropbox / was auch immer veröffentlichen).

Was wäre der einfachste Weg, dies zu tun? MAC-Adresserkennung? Bluetooth?

ACooleman
quelle

Antworten:

10

Viel Jagd - viel gelernt - kein Glück beim Erkennen von Geräten anderer Leute ohne einen geringen drahtlosen Scan - Bluetooth funktioniert für das iPhone, wenn beide Ihre eigenen Geräte sind:

  1. Wifi-Scan funktioniert möglicherweise für einige Geräte, aber iOS-Geräte stellen keine Verbindung her, wenn der Bildschirm ausgeschaltet ist! Mein iPhone 6 konnte mit einem einfachen arpBefehl erkannt werden (gibt eine Tabelle mit IP- und Mac-Nummern der angeschlossenen Geräte im selben Subnetz an), dies würde jedoch nur passieren, wenn der Telefonbildschirm aufleuchtet. Sobald der Bildschirm des Telefons in den Ruhezustand wechselt, ist das WLAN nicht mehr erreichbar! Ich wette, das ist im Interesse der Akkulaufzeit.

  2. Bluetooth-Dongle hat funktioniert. Im Gegensatz zu einigen ausgefallenen Algorithmen gibt es keine Entfernungsberechnung - nur vorhanden / nicht vorhanden kann mit sehr geringem Stromverbrauch auf rPi und iPhone durchgeführt werden. Installieren Sie den Bluetooth-Dongle auf rPi wie folgt: ( sudo aptitude install bluetooth bluez-utils bluez-compat). Finden Sie den Mac Ihres Telefongeräts heraus, indem Sie ihn durchsuchbar machen und dann ( hcitool scan) auf rPi ausführen. Stellen Sie dann eine Verbindung zu Ihrem Gerät her (stellen Sie sicher, dass es durchsuchbar ist): sudo bluez-simple-agent hci0 mac_of_your_deviceund sagen Sie auf beiden Seiten Ja. Dann sudo bluez-test-device trusted mac_of_your_device. Jetzt "kennen" sich beide. Dann machsudo hcitool name mac_of_your_devicein Ihrem Lieblingsskript, um herauszufinden, ob das iPhone in der Nähe ist. Dadurch wird keine Verbindung hergestellt - sondern nur Hallo gesagt. Wenn ein Name zurückgegeben wird, befindet sich das Telefon in der Nähe. Wenn nichts zurückgegeben wird, befindet sich das Telefon nicht in der Nähe oder Bluetooth ist ausgeschaltet. Im Vergleich zum Erstellen von Verbindungen oder anderen Methoden zur Entfernungsberechnung spart diese Methode die Batterie auf beiden Seiten und reduziert die Luftwellenverschmutzung auf ein Minimum.

Ravi Tejwani
quelle
9

Ich und einige Freunde von mir haben einen Bluetooth-Näherungsscanner entwickelt, um unser Haustürschloss unseres Hackerspace zu öffnen .

Wir haben alle zulässigen Geräte gekoppelt und im Wesentlichen verwendet hcitool, um zu testen, ob sich eines der gekoppelten Geräte in der Nähe befindet. Wenn das gekoppelte Gerät beispielsweise die Adresse "00: 00: 00: 00: 00: 00" hat, können Sie dies auf der Befehlszeilenkonsole tun:

hcitool cc 00:00:00:00:00:00 && hcitool auth 00:00:00:00:00:00 && hcitool dc 00:00:00:00:00:00;

Wenn dies Null zurückgibt, befindet sich das Gerät in der Nähe.

Ein Nachteil ist, dass das Timeout ca. 5 Sekunden dauert, wenn das Gerät nicht in der Nähe ist.

Wir haben den Quellcode auf Github unter der Open-Source-Lizenz von Apache veröffentlicht.

MadMike
quelle
2
Ich kann bestätigen, dass dies mit funktioniert hcitool .... Sie müssen die Befehle jedoch wie im obigen Beispiel verketten. Die Verbindung ist nur für sehr kurze Zeit aktiv. Sie können dem Mix Nähe hinzufügen, indem Sie dies tun hcitool rssi ....
Gunnar
2

Ich habe einige Setups gesehen, die Bluetooth für ähnliche Anwendungsfälle verwenden, aber es wird wahrscheinlich einige Hacking beinhalten. Die Telefone, die Sie erkennen möchten, befinden sich normalerweise nicht im erkennbaren Modus.

Wenn die Telefone WLAN verwenden, können Sie wahrscheinlich eine gewisse Nähe erkennen. Dies bedeutet jedoch wahrscheinlich auch, dass Sie auf einer relativ niedrigen Ebene nach ihnen suchen müssen, da sie nicht auf Ihre WLAN-Antenne zugreifen und wahrscheinlich eine verschlüsselte Verbindung herstellen. Werfen Sie einen Blick auf kismet, um eine drahtlose Bonanza auf niedrigem Niveau zu erhalten.

Der einfachste Weg, um festzustellen, ob sich jemand in einem Raum befindet oder nicht, wäre jedoch die Verwendung des Kameramoduls und eines Panaramaspiegels.

Bex
quelle
1

Wenn Sie über ein WiFi-Netzwerk verfügen, mit dem sie im Büro eine Verbindung herstellen, können Sie den PI alle x Zeiträume nach MAC-Adressen durchsuchen lassen und eine Webseite (Dropbox, was auch immer) mit dem aktuellen Status aktualisieren. Wahrscheinlich die zuverlässigste Route.

Möglicherweise können Sie etwas mit Bluetooth und einem USB-Bluetooth-Adapter tun, aber ich habe keine Erfahrung damit.

Ohne sie, die mit dem Pi verbunden sind, oder ohne das Netzwerk, in dem sich der Pi befindet, werden Sie wahrscheinlich nicht viel Erfolg haben.

Butter
quelle
Nett. Welche Technologie / App / Plattform wollten Sie zum Scannen der MAC-Adressen verwenden?
ACooleman
Ich würde es mit nmap, der Befehlszeilenversion und einem kleinen benutzerdefinierten Python-Code (ich bin sicher, es gibt eine Python-API) tun. Führen Sie eine schnelle Ping-Sweep- / MAC-Abfrage durch und vergleichen Sie diese mit einer vorgefertigten Liste. Verwenden Sie dies, um eine PHP-Seite (HTML?) zu erstellen und sie mit dem Lightppd-Webserver (Apache?) bereitzustellen. Stellen Sie den Python-Job so ein, dass er alle x Zeiträume ausgeführt wird, und lassen Sie die Webseite alle y Zeiträume automatisch aktualisieren. Es ist eine coole Projektidee ... Ich muss es vielleicht versuchen, nachdem ich alle anderen Projekte abgeschlossen habe, die auf meinem Teller sind.
Butters
Möglicherweise können Sie Ihren Router nach der ARP-Tabelle oder auch Ihren DHCP-Server abfragen ... Könnte es etwas schneller machen ..
Butters
1

Das Lesen der obigen Antworten hat mich auch dazu veranlasst, über die folgenden Möglichkeiten nachzudenken:

Verwenden Sie airmon-ng , um das Netzwerk kontinuierlich nach WLAN-Client-Geräten zu durchsuchen. Die Ausgabe kann in eine Datei geschrieben werden. Wenn sich die Datei ändert, hat ein Client den Bereich des pi eingegeben oder verlassen. Wenn Sie eine Liste bekannter Mac-Adressen haben, können Sie den Benutzer identifizieren und aufgrund der Änderung der Datei einige Aktionen auslösen.

Es ist eine ziemlich interessante Idee! Vielen Dank!

Arjen

credmp
quelle
Große Geschäfte verwenden diese Technik, um zu überwachen, wie Käufer ihre Waren durchsuchen, welches Rayon sie überspringen usw. Aufgrund der Datenschutzgesetze ist es jedoch nicht immer legal, eine Mac-Adresse mit einer Person in jedem Land zu verknüpfen.
Havnar
1

Solange sich alle Geräte im selben Netzwerk befinden, können Sie dazu problemlos einen Raspberry Pi verwenden. Hier ist ein vollständiges Projekt mit dem gesamten Code, den Sie benötigen ...

http://www.element14.com/community/people/mcollinge/blog/2014/09/12/raspberry-pi-network-spy--part-1

Endpunkt101
quelle
Der von Ihnen bereitgestellte Link enthält interessante Informationen. Sie können jedoch Ihre Antwort verbessern, einschließlich der Antwort auf die Frage.
Promonet
1

Ich arbeite also seit ungefähr einem Jahr an demselben Thema. Ich habe es ziemlich schnell auf meinem Mac zum Laufen gebracht, hatte aber große Probleme, es direkt auf meinem PC zum Laufen zu bringen. Ich habe viele verschiedene Ansätze ausprobiert. Ich habe ein Hausautomationssystem, das die Heizung und das Warmwasser (über ein Arduino- und ein HF-Modul) einschaltet, wenn ich oder mein Partner zu Hause sind (dh unsere iPhones sind über das WLAN zu Hause erkennbar). Am Ende habe ich 'nslookup' verwendet, um die IP-Adresse für die iPhones zu finden (falls sich die IP-Adresse geändert hat, da sie dynamisch sind (aber auf meinem Router tatsächlich nie)) und 'nmap', um festzustellen, ob das iPhone eingeschaltet ist das Netzwerk. Wenn sich das iPhone im Tiefschlaf befindet, findet 'nmap' das Telefon nicht immer, daher habe ich es 10 Mal überprüfen lassen, bevor es anzeigt, dass das Telefon nicht zu Hause ist. Unten ist ein Teil meines Hausautomationscodes in Python. Ich habe Threading verwendet. Bei Fragen mit dem folgenden Code lassen Sie es mich wissen.

# Dictionary to store variables to reuse on program restart
    v = {
        'boilerControlCH' : 'HIH', # 'scheduled' or 'HIH' (Honey I'm Home)
        'boilerControlHW' : 'scheduled',
        'thermostatSetPoint' : 20.8,
        'thermostatVariance' : 0.1,
        'morningTime' : datetime(1970,1,1,6,0,0),
        'nightTime' : datetime(1970,1,1,23,0,0),
        'someOneHome' : False,
        'guest' : False,
        'minimumTemperatureOO' : False,
        'minimumTemperature' : 4.0,
        'iPhoneMark' : {'iPhoneHostname' : 'marks-iphone', 'home' : False},
        'iPhoneJessica' : {'iPhoneHostname' :'jessicaesiphone', 'home' : False}
        }

und

# Check if anyone at home
    def occupancyStatus(person, Bol = False):
        with lockOccupancyStatus:
            someOneHome = False

        if 'iPhone' in person:
            v[person]['home'] = Bol
        elif 'retest' in person:
            pass
        else:
            v[person] = Bol

        if v['guest'] == True:
            someOneHome = True

        for key in v:
            if 'iPhone' in key:
                if v[key]['home'] == True:
                    someOneHome = True

        v['someOneHome'] = someOneHome
        variablesToFile()
    return

und der Hauptcode

   # iPhone home status threading code
    class nmapClass(threading.Thread):
        def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        global exitCounter

        nmapThread()
        msg.log('Exited nmapThread')    
        waitEvent.set()
        waitEventAdjustable.set()
        serialDataWaiting.set()
        exitCounter += 1


def nmapThread():
    iPhone = {}
    maxCounts = 10
    for phone in v:
        if 'iPhone' in phone:
            iPhone[phone] = {}
            iPhone[phone]['hostname'] = v[phone]['iPhoneHostname']
            iPhone[phone]['count'] = maxCounts
    #msg.log(iPhone)

    while exitFlag[0] == 0:
        for phone in iPhone:
            if iPhone[phone]['count'] > 0:
                phoneFound = False
                IPAddress = '0.0.0.0'

                # Find iPhones IP address using its hostname
                commandNsloolup = 'nslookup %s' %iPhone[phone]['hostname']
                childNslookup = pexpect.popen_spawn.PopenSpawn(commandNsloolup, timeout = None)
                output = childNslookup.readline()
                while '\r\n' in output:
                    #msg.log(output)
                    if 'Name:' in output:
                        output = childNslookup.readline()
                        if 'Address:' in output:
                            tempStr = output
                            startPoint = tempStr.find('192')
                            tempStr = tempStr[startPoint:]
                            IPAddress = tempStr.replace('\r\n', '')
                            #msg.log(IPAddress)
                    output = childNslookup.readline()


                if IPAddress == '0.0.0.0':
                    pass
                    #msg.error('Error finding IP address for %s' %iPhone[phone]['hostname'], GFI(CF()).lineno)
                else:
                    #commandNmap = 'nmap -PR -sn %s' %IPAddress
                    #commandNmap = 'nmap -p 62078 -Pn %s' %IPAddress # -p specifies ports to try and access, -Pn removes pinging
                    commandNmap = 'nmap -p 62078 --max-rate 100 %s' %IPAddress
                    childNmap = pexpect.popen_spawn.PopenSpawn(commandNmap, timeout = None)
                    output = childNmap.readline()
                    while '\r\n' in output:
                        if 'Host is up' in output:
                            phoneFound = True
                            break
                        output = childNmap.readline()
                    #if phoneFound:
                    #   break


                if phoneFound:              
                    iPhone[phone]['count'] = 0

                    if v[phone]['home'] == False:
                        msg.log('%s\'s iPhone has returned home' %phone)
                        occupancyStatus(phone, True)
                        waitEventAdjustable.set()
                    #else:
                        #msg.log('%s\'s iPhone still at home' %phone)
                else:
                    iPhone[phone]['count'] -= 1

                    if v[phone]['home'] == True and iPhone[phone]['count'] == 0:
                        msg.log('%s\'s iPhone has left home' %phone)
                        occupancyStatus(phone, False)
                        waitEventAdjustable.set()
                    #else:
                        #msg.log('%s\'s iPhone still away from home' %phone)

            elif iPhone[phone]['count'] < 0:
                msg.error('Error with count variable in iPhone dictionary', GFI(CF()).lineno)


        longWait = True
        for phone in iPhone:
            if iPhone[phone]['count'] > 0:
                longWait = False
                #msg.log('%s: %s' %(phone, iPhone[phone]['count']))

        if longWait:
            #msg.log('wait long')               
            # 600 = run every 10 minutes
            waitEvent.wait(timeout=600)
            for phone in iPhone:
                iPhone[phone]['count'] = maxCounts
        else:
            #msg.log('wait short')
            waitEvent.wait(timeout=60)  

    return

Der Code funktioniert möglicherweise nicht, wenn Sie ihn direkt in Ihr eigenes Skript kopieren, da einige Teile fehlen, die ich nicht kopiert habe, um die Dinge einfach und leicht lesbar zu halten, aber hoffentlich gibt der obige Code jedem einen Eindruck davon, wie ich es getan habe Dinge.

irishcream24
quelle