Rileva se iPhone / Android nelle vicinanze?


10

Sto lavorando da remoto e sarebbe utile sapere quando qualcuno è uscito per una riunione / pranzo nel mio ufficio.

Pensavo di essere in grado di rilevare passivamente quali telefoni vicino al raspberry pi (e quindi pubblicarli sul web / dropbox / qualunque cosa)

Quale sarebbe il modo più semplice per farlo? Rilevamento indirizzo MAC? Bluetooth?

Risposte:


10

Molta caccia - appreso un po '- nessuna fortuna nel rilevare i dispositivi di altre persone senza molta scansione wireless di basso livello - Bluetooth funziona per iPhone se entrambi sono i tuoi dispositivi:

  1. La scansione Wifi potrebbe funzionare per alcuni dispositivi, ma quelli iOS non si collegano quando lo schermo è spento! Il mio iPhone 6 potrebbe essere rilevato con un semplice arpcomando (fornisce la tabella dei numeri ip e mac dei dispositivi collegati sulla stessa sottorete) ma questo accadrebbe solo quando lo schermo del telefono è illuminato. Una volta che lo schermo del telefono dorme - è fuori limite sul wifi! Scommetto che questo è nell'interesse della durata della batteria.

  2. Dongle Bluetooth funzionante. Nessun calcolo della distanza a differenza di alcuni algoritmi fantasiosi là fuori - solo presente / assente può essere fatto con un consumo di energia molto ridotto su rPi e iPhone. Installa dongle bluetooth su rPi come: ( sudo aptitude install bluetooth bluez-utils bluez-compat). Capisci il mac del tuo dispositivo telefonico rendendolo ricercabile e poi fai ( hcitool scan) su rPi. Quindi connettiti al tuo dispositivo (assicurati che sia ricercabile) come: sudo bluez-simple-agent hci0 mac_of_your_devicee dì si su entrambi i lati. Poi sudo bluez-test-device trusted mac_of_your_device. Ora entrambi si "conoscono". Quindi fasudo hcitool name mac_of_your_devicenella tua sceneggiatura preferita per capire se l'iphone è nelle vicinanze. Questo non creerà una connessione, ma salutaci. Se restituisce un nome, il telefono si trova nelle vicinanze. Se non restituisce nulla, il telefono non è nelle vicinanze o il bluetooth è disattivato. Rispetto alla creazione di connessioni o altri metodi di calcolo della distanza - questo metodo consente di risparmiare la batteria su entrambi i lati e ridurre al minimo l'inquinamento da onde aeree.


9

Io e alcuni miei amici abbiamo sviluppato uno scanner di prossimità bluetooth per aprire la nostra serratura della porta d'ingresso del nostro spazio per hacker .

Abbiamo associato tutti i dispositivi consentiti e essenzialmente utilizzato hcitoolper verificare se uno dei dispositivi associati si trova nelle vicinanze. Ad esempio, se il dispositivo associato ha l'indirizzo "00: 00: 00: 00: 00: 00", lo faresti sulla console della riga di comando:

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

Se questo restituisce zero, il dispositivo è nelle vicinanze.

Un aspetto negativo è che questo richiederà circa 5 secondi per il timeout se il dispositivo non è nelle vicinanze.

Abbiamo pubblicato il codice sorgente su Github con la licenza open source apache.


2
Posso confermare che questo funziona usando hcitool .... Tuttavia, è necessario concatenare i comandi come nell'esempio sopra riportato. La connessione è attiva solo per un periodo di tempo molto breve. Puoi aggiungere vicinanza al mix facendo hcitool rssi ....
Gunnar,

2

Ho visto alcune configurazioni che utilizzano il bluetooth per casi d'uso simili, ma probabilmente comporteranno degli hacking. I telefoni che si desidera rilevare non sono in genere in modalità rilevabile.

Se i telefoni utilizzano il Wi-Fi, è possibile che tu possa rilevare un po 'di prossimità, ma ciò probabilmente significherà anche che dovrai cercarli a un livello piuttosto basso, poiché non accederanno all'antenna Wi-Fi e probabilmente si collegheranno crittografati. Dai un'occhiata a Kismet per un po 'di bonanza wireless a basso livello.

Il modo più semplice per rilevare se qualcuno è in una stanza o no, però, immagino, sarebbe usare il modulo della fotocamera e uno specchio panaramico.


1

Se disponi di una rete WiFi a cui si connettono quando si trovano in ufficio, potresti avere la PI PI scan per gli indirizzi MAC ogni x periodo di tempo e aggiornare una pagina web (dropbox, qualunque cosa) con lo stato corrente. Probabilmente il percorso più affidabile.

Potresti essere in grado di fare qualcosa con il bluetooth e un adattatore Bluetooth USB, ma non ne ho esperienza.

Senza di loro collegati al pi, o alla rete su cui si trova il pi, non credo che avrai molto successo.


Bello. Quindi quale tecnologia / app / piattaforma stavi pensando che avrei usato per scansionare gli indirizzi MAC?
ACooleman,

Il modo in cui lo farei è con nmap, la versione della riga di comando e un piccolo codice python personalizzato (sono sicuro che ci sia un python api), eseguo una rapida scansione ping / query MAC, confrontalo con un elenco predefinito, usalo per creare una pagina php (HTML?) e servirla usando il web server lightppd (Apache?). Imposta il lavoro python per eseguire ogni periodo di tempo x e fai aggiornare automaticamente la pagina web ogni periodo di y. È una bella idea di progetto ... Potrei doverlo provare dopo aver finito tutti gli altri progetti che sono nel mio piatto.
Butters,

Potresti essere in grado di interrogare il tuo router per la tabella ARP o anche il tuo server DHCP ... Potrebbe renderlo un po 'più veloce ..
Butters

1

Leggere le risposte di cui sopra mi ha anche spinto a pensare alla seguente possibilità:

usa airmon-ng per scansionare continuamente la rete alla ricerca di dispositivi client su wifi. L'output può essere scritto in un file, quindi se il file cambia o un client è entrato o ha lasciato l'intervallo del pi. Avere un elenco di indirizzi Mac noti ti consente di identificare l'utente e, a causa della modifica del file, potresti attivare alcune azioni ....

è un'idea abbastanza interessante! Grazie!

Arjen


I grandi negozi usano questa tecnica per monitorare il modo in cui gli acquirenti navigano nei loro prodotti, quale rayon saltano ecc. Ma a causa delle leggi sulla privacy non è sempre legale collegare un indirizzo mac a una persona in ogni paese.
Havnar,


1

Quindi lavoro sullo stesso problema da circa un anno. L'ho fatto funzionare sul mio mac abbastanza rapidamente, ma ho avuto molti problemi a farlo funzionare sul mio PC. Ho provato molti approcci diversi. Ho un sistema di automazione domestica che accende il riscaldamento e l'acqua calda (tramite un modulo Arduino e RF) quando io o il mio partner siamo a casa (ovvero i nostri iPhone sono rilevabili sul WiFi domestico). Alla fine ho usato 'nslookup' per trovare l'indirizzo IP per gli iPhone (nel caso in cui l'indirizzo IP sia cambiato in quanto dinamici (ma in realtà non lo fanno mai sul mio router)) e 'nmap' per rilevare se l'iPhone è acceso il network. Se l'iPhone è in modalità di sospensione molto profonda, 'nmap' non trova sempre il telefono, quindi l'ho fatto controllare 10 volte prima che dica che il telefono non è in casa. Di seguito è parte del mio codice di automazione domestica in Python. Ho usato il threading. Per qualsiasi domanda con il seguente codice fammi sapere.

# 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}
        }

e

# 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

e il codice principale

   # 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

Il codice potrebbe non funzionare se lo copi direttamente nel tuo script, poiché mancano alcune parti che non ho copiato per cercare di mantenere le cose semplici e facili da leggere, ma si spera che il codice sopra dia a tutti un'idea di come ho fatto cose.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.