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.