Come rilevare un dispositivo mobile quando si connette a una rete wifi domestica?


10

Quale sarebbe il modo migliore per far riconoscere un server quando un dispositivo mobile specifico (telefono cellulare, iPad, ecc.) Si connette alla rete (wireless, ovviamente)?

Ad esempio, una persona ha la propria rete wifi domestica configurata correttamente sul suo cellulare. Quando si trova nel raggio di azione del router, si connette (niente di nuovo). Alla connessione a quel router, il suo server di casa avviava un determinato programma (o lanciava una notifica, scriveva su un file, ecc.).

Ho pensato che una possibile soluzione sarebbe stata una "web app" personalizzata ospitata dalla rete che sarebbe stata lanciata dal telefono in modo che il server riconoscesse che la pagina era stata chiamata. Tuttavia, se ciò potesse essere fatto quando il telefono si connette automaticamente, sarebbe meglio.

Qualsiasi pensiero o soluzione alternativa sarebbe molto apprezzato, quindi grazie in anticipo!


Se si tratta di un telefono Android, fare un lavoro cron su un sito Web locale sarebbe più semplice. Per farlo dal lato rete dovresti usare il protocollo RADIUS e avere un server RADIUS correttamente configurato.
Huckle,

Perché non solo rivedere i registri del router. Poiché questi registri sono basati su testo, sarebbe facile eseguire una query sui registri e ottenere solo le informazioni necessarie. Sicuramente qualcuno ha scritto il codice per farlo, ma in caso contrario sarebbe un semplice esercizio.

Risposte:


4

Penso che questo possa essere facilmente realizzato da arp-scan.

Installa arp-scan: sudo apt-get install arp-scan
rileva tutti gli host sulla rete locale:sudo arp-scan -l

Puoi impostare un crontab per eseguire periodicamente (ogni 2 minuti forse) uno script che scansiona la rete con arp-scan e analizza il suo output per scoprire gli host attivi.

A volte avevo bisogno della -r 3bandiera, che la esegue tre volte; funziona molto meglio come impostazione predefinita 2 volte, che a volte manca alcuni dispositivi. Così:

 sudo arp-scan -l -r 3 | grep {Phone Static Assigned IP} 

funziona meglio per me su LG V30 +.


Va notato che alcuni dispositivi potrebbero non essere visualizzati a meno che non siano accesi. Il mio Nexus 4 non verrà visualizzato a meno che lo schermo non sia acceso.
Nicolas Bouliane,

3
import subprocess

if __name__ == '__main__':
    while True:
        sleep(5)
        p = subprocess.Popen("arp-scan -l | grep xx:xx:xx:xx:xx:xx", stdout=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        p_status = p.wait()
        if output:
            print "Yay, the devine is connected to your network!"
        else:
            print "The device is not present!"

In questo modo puoi cercare il MAC del tuo dispositivo :)


2

In realtà sto pensando di implementare una soluzione per questo che soddisfi i seguenti requisiti:

  1. Non è necessario che il telefono abbia assegnato l'indirizzo IP sulla rete.
  2. Non è necessario che il telefono invii periodicamente segnali che potrebbero scaricare la batteria.
  3. Se ci sono molti telefoni sulla rete, tutti verrebbero rilevati.

La mia intenzione è quella di montare il filesystem dei telefoni con ssh, ma potrebbe essere usato per qualsiasi cosa.

Supponiamo che la rete locale sia 192.168.1.0 ...

Quindi mi sento di implementare un app che ascolta UDP trasmissioni dal indirizzo di broadcast: 192.168.1.255. Questa app non scarica la batteria in quanto totalmente passiva. (diventa attivo solo quando viene ricevuto un pacchetto).

Un demone sul computer invierà periodicamente trasmissioni all'indirizzo di trasmissione 192.168.1.255. Il telefono risponderà a tali segnali fornendo nome, ID, indirizzo IP ecc.

Ora il computer sa che il telefono esiste sulla rete e per il mio caso può invocare mount sshfs.

Sicuramente questo richiede molto lavoro, incluso il lavoro di programmazione, e non è facile. Ma penso che sarebbe la soluzione più affidabile e ragionevole.


1
Wow, quindi in pratica un protocollo personalizzato ... si potrebbe pensare che esisterebbe già qualcosa del genere.
Michael,

1

Il modo migliore a cui riesco a pensare è di fornire a detto dispositivo un indirizzo IP statico e utilizzare un semplice script per eseguire il ping del dispositivo ogni X secondi e attivare il programma / notifica.

Cose da notare: molti telefoni non si collegheranno alla rete wifi fino al risveglio dal sonno. Il tuo script dovrà essere in grado di dire la differenza tra il telefono che va a dormire e il telefono che esce di casa, possibilmente considerando l'ora del giorno. Dopodiché, avere lo script innesca l'esecuzione di un programma o la visualizzazione di una notifica è banale.



0

Mi sono imbattuto in questo e come una volta ho fatto qualcosa di simile ho deciso di inviare una risposta.

Ho fatto quanto segue:

1. Ping all addresses within given network and subnet (excluding network and broadcast addresses)
2. Wait for response has a timeout so that if device doesn't answer from furthest corner of your WiFi it is considered not present.
3. So we get all IPs on the net that answer to ICMP packets.
4. Then use each detected IP to ask for more and decide which device you like and which one you don't.

Nel mio caso avevo un server HTTP in esecuzione sul mio dispositivo. Quindi ho appena inviato la richiesta HTTP HEAD per praticamente nulla sulla porta 80. Se il dispositivo ha risposto e l'intestazione del server è correttamente denominata, questo è il mio dispositivo.

Ma non potrei andare veloce senza prima eseguire il ping. HTTP è TCP e la richiesta è grande, quindi i timeout devono essere di 4 secondi per il WiFi. Fare questo per 253 indirizzi è lento da morire. Ma non avresti 253 dispositivi (probabilmente) più server HTTP in meno. (o nel tuo caso, telefoni)

Considerare i registri del router è un'ottima idea e facile. E anche più veloce del ping di tutto. Alcuni router non hanno nemmeno bisogno di accedere per accedervi.

Inoltre, vale la pena verificare se il dispositivo dispone del supporto UPNP. In tal caso, è possibile utilizzare UPNP per rilevarne la presenza. Questa sarebbe una soluzione ufficiale (ascolto in onda su UDP di UPNP). Ma tutti i dispositivi non lo supportano. Ma tutti i dispositivi non supportano anche ICMP. (non vogliono essere bombardati inutilmente).

C'è un'altra possibilità interessante. Puoi cercare i pacchetti DHCP e vedere quando un router fornisce a un nuovo dispositivo un indirizzo IP. Ma questo non funzionerebbe per i dispositivi con IP statici. Non avrebbero nemmeno toccato la rete fino a quando non avessero bisogno di qualcosa. La connessione al WiFi stesso è su un altro livello e non può essere facilmente rilevata se non si desidera agire come uno sniffer. Non sono sicuro anche se è fattibile con la scheda di rete in una modalità promettente. Penso che sarebbe necessario hardware aggiuntivo per questo.

Per eseguire il ping in Python, senza sottoprocedere al programma ping e perdere velocità, è necessario creare socket non elaborati e costruire manualmente il pacchetto ICMP. Non è difficile. Ne esiste un esempio da qualche parte sul web. Naturalmente, per inviarlo avrai bisogno dei permessi di root così come il ping. Questo è uno svantaggio. Se distribuirai il software non puoi aspettarti che gli utenti lo vogliano eseguire come root.


0

Avevo due soluzioni che ho usato. (Pitone)

Soluzione 1

Il primo è stato quello di organizzare ipnumber noti che voglio tracciare. L'ho fatto in tre passaggi. 1 # usa "-c1" per inviare solo un ping. Se il dispositivo è attivo risponderà e. La funzione terminerà con successo 2 # usa "-c3" ora dai più tempo per rispondere su uno dei tre. Questo di solito è sufficiente quando si tratta di un segnale wifi scadente. 3 # usa "-c10" questo potrebbe essere necessario quando è davvero un cattivo segnale wifi. (Ho notato che il vecchio iPad ha bisogno di circa 10 tentativi di risposta) Per accelerare le cose ho creato Processi separati per ogni numero IP che voglio monitorare.

Ho anche cambiato gli intervalli di ping a seconda che abbia successo o meno. Se trova il dispositivo attenderà più a lungo fino a quando non controlla di nuovo. Se si verifica un errore, riproverà tra 60 secondi. (Voglio la luce accesa quando entro in casa) quindi gli anni '60 sono sufficienti per trovarmi in strada

Questo ha funzionato perfettamente! Quando sono tornato a casa mi ha percepito, spento la luce e spento quando me ne sono andato.

Soluzione 2

L'arping potrebbe non essere pesante sulla rete, ma ho cambiato la soluzione per saltare tutti i ping e ho creato il mio server DHCP sul mio raspberry pi.

Ho quindi aggiunto "su commit" che attiva uno script non appena un dispositivo ottiene un numero IP. Questo script utilizza una "chiamata API HTTP arricciata" per avvisare il mio server www (Flask) non appena un dispositivo riceve o rinnova il suo numero IP.

Sul mio Android ho modificato le impostazioni per non disattivare mai il wifi quando lo schermo è spento. Non sono sicuro se è possibile su iPhone. Nessuna grande differenza sulla batteria (OnePlus 5)

La prima soluzione includeva anche la scansione Bluetooth per Mac specifici. Quindi, anche se il mio WiFi è spento sul mio telefono, percepirà comunque il Bluetooth. L'uso dell'indirizzo Mac non è necessario abbinarlo o renderlo disponibile per tutti.

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.