¿Cómo detectar un dispositivo móvil cuando se conecta a una red wifi doméstica?

10

¿Cuál sería la mejor manera de que un servidor reconozca cuando un dispositivo móvil específico (teléfono celular, iPad, etc.) se conecta a la red (de forma inalámbrica, por supuesto)?

Como ejemplo, una persona tiene su red wifi doméstica configurada correctamente en su teléfono celular. Cuando se pone dentro del alcance del enrutador, se conectaría (nada nuevo sobre eso). Al conectarse a ese enrutador, su servidor doméstico lanzaría un determinado programa (o enviaría una notificación, escribiría en un archivo, etc.).

Pensé que una posible solución sería una "aplicación web" personalizada alojada en la red que se lanzaría desde el teléfono para que el servidor reconociera la llamada de la página. Sin embargo, si esto se pudiera hacer cuando el teléfono se conecta automáticamente, sería lo mejor.

Cualquier idea o solución alternativa sería muy apreciada, ¡así que gracias de antemano!

Ivan I.
fuente
Si se trata de un teléfono con Android, un trabajo cron con un sitio web local sería más fácil. Para hacerlo desde el lado de la red, tendría que usar el protocolo RADIUS y tener un servidor RADIUS configurado correctamente.
Huckle
¿Por qué no solo revisar los registros de su enrutador? Dado que estos registros están basados ​​en texto, sería fácil consultar los registros y obtener solo la información que necesita. Seguramente alguien ha escrito el código para hacer esto, pero si no, sería un simple ejercicio.

Respuestas:

4

Creo que esto se puede lograr fácilmente arp-scan.

Instalar arp-scan: sudo apt-get install arp-scan
detecte todos los hosts en la red local:sudo arp-scan -l

Puede configurar un crontab para que periódicamente (cada 2 minutos) ejecute un script que escanee la red con arp-scan y analice su salida para descubrir los hosts activos.

A veces necesitaba la -r 3bandera, que la ejecuta tres veces; funciona mucho mejor como predeterminado 2 veces, lo que a veces pierde algunos dispositivos. Así:

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

Me funciona mejor a LG V30 +.

Eric Carvalho
fuente
Cabe señalar que algunos dispositivos pueden no aparecer a menos que estén encendidos. Mi nexus 4 no aparecerá a menos que la pantalla esté encendida.
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!"

De esta manera, puede buscar el MAC de su dispositivo :)

ZaBiC
fuente
2

Realmente estoy considerando implementar una solución para esto que cumpla con los siguientes requisitos:

  1. El teléfono no necesita tener una dirección IP asignada en la red.
  2. El teléfono no necesita enviar periódicamente señales que agoten su batería.
  3. Si hay muchos teléfonos en la red, todos serían detectados.

Mi intención es montar el sistema de archivos del teléfono con ssh, pero podría usarse para lo que sea.

Digamos que la red local es 192.168.1.0 ...

Así que me gustaría implementar una aplicación que escucha UDP transmite desde la dirección de difusión: 192.168.1.255. Esta aplicación no agotaría la batería ya que es totalmente pasiva. (solo se activa cuando se recibe un paquete).

Un demonio en la computadora enviará periódicamente transmisiones a la dirección de transmisión 192.168.1.255. El teléfono responderá a tales señales dando su nombre, identificación, dirección IP, etc.

Ahora la computadora sabe que el teléfono existe en la red y para mi caso puede invocar el montaje sshfs.

Seguramente esto necesita mucho trabajo, incluido el trabajo de programación, y no es fácil. Pero creo que sería la solución más confiable y razonable.

d_inevitable
fuente
1
Wow, entonces básicamente un protocolo personalizado ... uno pensaría que existiría algo como esto ya.
Michael
1

La mejor manera en que puedo pensar es darle a dicho dispositivo una dirección IP estática, y usar un script simple para hacer ping al dispositivo cada X segundos y activar su programa / notificación.

Cosas a tener en cuenta: Muchos teléfonos no se conectarán a la red wifi hasta que se despierten del sueño. Su secuencia de comandos deberá ser capaz de distinguir entre el teléfono que se va a dormir y el teléfono que sale de la casa, posiblemente considerando la hora del día. Después de eso, hacer que el script active un programa para que se ejecute o que aparezca una notificación es trivial.

Jeff Welling
fuente
0

Escribí un script que hace algo similar usando arp-scan y una dirección IP estática en un iPhone.

Puede encontrar el código aquí: https://github.com/blackairplane/pydetect

Debe limpiarse ya que soy nuevo en Python, pero creo que ilustra el concepto.

JamieHoward
fuente
0

Me topé con esto y cuando hice algo similar decidí publicar una respuesta.

Hice lo siguiente:

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.

En mi caso, tenía un servidor HTTP ejecutándose en mi dispositivo. Así que acabo de enviar la solicitud HTTP HEAD para esencialmente nada en el puerto 80. Si el dispositivo respondió y el encabezado del servidor se llama correctamente, entonces este es mi dispositivo.

Pero no podía ir rápido sin hacer ping primero. HTTP es TCP y la solicitud es grande, por lo que los tiempos de espera deben ser de 4 segundos para WiFi. Hacer esto para 253 direcciones es lento como el infierno. Pero no tendría 253 dispositivos (probablemente) menos servidores HTTP. (o en su caso, teléfonos)

Tener en cuenta los registros del enrutador es una muy buena idea y fácil. E incluso más rápido que hacer ping a todos. Algunos enrutadores ni siquiera necesitan iniciar sesión para acceder a ellos.

Además, vale la pena verificar si su dispositivo tiene soporte UPNP. Si lo hace, puede usar UPNP para detectar su presencia. Esta sería la solución oficial (escuchando en la transmisión los UDP de UPNP). Pero todos los dispositivos no lo admiten. Pero todos los dispositivos no son compatibles con ICMP también. (No desean ser bombardeados innecesariamente).

Hay otra posibilidad interesante. Puede buscar paquetes DHCP y ver cuándo un enrutador le da a un nuevo dispositivo una dirección IP. Pero esto no funcionaría para dispositivos con IP estáticas. Ni siquiera tocarían la red hasta que necesiten algo. La conexión a WiFi en sí está en otra capa y no se puede detectar fácilmente a menos que desee actuar como un rastreador. No estoy seguro, incluso si es factible con el adaptador de red en un modo promiscuo. Creo que se necesitaría hardware adicional para esto.

Para lograr ping en Python, sin subprocesar el programa de ping y perder velocidad, debe crear un socket sin procesar y construir el paquete ICMP manualmente. No es dificil. Hay un ejemplo de ello en algún lugar de la web. Por supuesto, para enviarlo necesitará permisos de root al igual que el ping. Este es un inconveniente. Si va a distribuir el software, no puede esperar que los usuarios quieran ejecutarlo como root.

Dalen
fuente
0

Tenía dos soluciones que usé. (Pitón)

Solución 1

Primero fue armar números ip conocidos que quiero rastrear. Hice esto en tres pasos. 1 # use "-c1" para enviar solo un ping. Si el dispositivo está activo, responderá y. La función saldrá con éxito 2 # use "-c3" ahora le da más tiempo para responder a uno de los tres. Esto suele ser suficiente cuando se trata de una señal wifi pobre. 3 # use "-c10" esto puede ser necesario cuando es realmente mala señal wifi. (Noté que el viejo iPad necesita aproximadamente 10 intentos de respuesta) Para acelerar las cosas, creé procesos separados para cada número de IP que quiero rastrear.

También cambié los intervalos de ping dependiendo de si es un éxito o no. Si encuentra el dispositivo, esperará más tiempo hasta que vuelva a verificar. Si se trata de un error, lo intentará nuevamente en 60 segundos. (Quiero la luz encendida cuando entro en mi casa) así que 60 años es suficiente para encontrarme en la calle

Esto funcionó perfectamente! Cuando llegué a casa me percibió, apagó la luz y se apagó cuando me fui.

Solución 2

Es posible que el arping no sea pesado en la red, pero cambié la solución para omitir todos los pings y creé mi propio servidor DHCP en mi raspberry pi.

Luego agregué "on commit" que activan un script tan pronto como un dispositivo obtiene un número de ip. Este script usa una 'llamada curl http API' para notificar a mi servidor www (Flask) tan pronto como un dispositivo recibe o renueva su número de ip.

En mi Android, cambié la configuración para que nunca apague el wifi cuando la pantalla está apagada. No estoy seguro si es posible en iPhone. No hay gran diferencia en la batería (OnePlus 5)

La primera solución también incluyó escaneo Bluetooth para Mac específico. Entonces, incluso si mi WiFi está apagado en mi teléfono, todavía detectará el Bluetooth. El uso de la dirección Mac no necesita emparejarse ni tenerlo disponible para que todos lo vean.

Christian Grenfeldt
fuente