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.