J'ai trébuché là-dessus et comme j'ai déjà fait quelque chose de similaire, j'ai décidé de poster une réponse.
J'ai fait ce qui suit:
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.
Dans mon cas, j'avais un serveur HTTP en cours d'exécution sur mon appareil. Je viens donc d'envoyer une requête HTTP HEAD pour pratiquement rien sur le port 80. Si l'appareil a répondu et que l'en-tête du serveur est correctement nommé, alors c'est mon appareil.
Mais je ne pouvais pas aller vite sans cingler d'abord. HTTP est TCP et la demande est importante, les délais d'attente doivent donc être de 4 secondes pour le WiFi. Faire cela pour 253 adresses est lent comme l'enfer. Mais vous n'auriez pas 253 appareils (probablement) plus de serveurs HTTP en moins. (ou dans votre cas, les téléphones)
La prise en compte des journaux de routeur est une très bonne idée et facile. Et encore plus vite que de tout cingler. Certains routeurs n'ont même pas besoin de se connecter pour y accéder.
En outre, il convient de vérifier si votre appareil prend en charge UPNP. Si c'est le cas, vous pouvez utiliser UPNP pour détecter sa présence. Ce serait une solution officielle (écoute en diffusion des UDP de l'UPNP). Mais tous les appareils ne le prennent pas en charge. Mais tous les appareils ne prennent pas en charge ICMP également. (ils ne souhaitent pas être bombardés inutilement).
Il existe une autre possibilité intéressante. Vous pouvez rechercher des paquets DHCP et voir quand un routeur donne une adresse IP à un nouveau périphérique. Mais cela ne fonctionnerait pas pour les appareils avec des adresses IP statiques. Ils ne toucheraient même pas au réseau avant d'avoir besoin de quelque chose. La connexion au WiFi lui-même est sur une autre couche et ne peut être facilement détectée que si vous souhaitez agir comme un renifleur. Je ne suis pas sûr, même si cela est possible avec une carte réseau en mode promisquous. Je pense que du matériel supplémentaire serait nécessaire pour cela.
Pour réaliser le ping en Python, sans sous-traiter le programme ping et perdre de la vitesse, vous devez créer un socket brut et construire le paquet ICMP manuellement. Ce n'est pas difficile. Il y en a un exemple quelque part sur le web. Bien sûr, pour l'envoyer, vous aurez besoin des autorisations root, tout comme le ping. Ceci est un inconvénient. Si vous distribuez le logiciel, vous ne pouvez pas vous attendre à ce que les utilisateurs souhaitent l'exécuter en tant que root.