Bunu tökezledim ve bir zamanlar benzer bir şey cevaplamaya karar verdim.
Aşağıdakileri yaptım:
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.
Benim durumumda, cihazımda çalışan bir HTTP sunucusu vardı. Bu nedenle, bağlantı noktası 80'de aslında hiçbir şey için HTTP HEAD isteği gönderdim. Cihaz yanıtladıysa ve Sunucu başlığı düzgün bir şekilde adlandırıldıysa, bu benim cihazım.
Ama önce ping atmadan hızlı gidemedim. HTTP TCP'dir ve istek büyüktür, bu nedenle WiFi için zaman aşımlarının 4 saniye olması gerekir. Bunu 253 adres için yapmak cehennem kadar yavaştır. Ancak 253 cihazınız (muhtemelen) daha az HTTP sunucunuz olmazdı. (veya sizin durumunuzda telefonlar)
Yönlendirici günlüklerini dikkate almak çok iyi bir fikir ve kolaydır. Ve hepsine ping atmaktan bile daha hızlı. Bazı yönlendiricilerin bunlara erişmek için oturum açmasına bile gerek yoktur.
Ayrıca, cihazınızın UPNP desteğine sahip olup olmadığını kontrol etmeye değer. Varsa, varlığını tespit etmek için UPNP'yi kullanabilirsiniz. Bu resmi bir çözüm olacaktır (UPNP'nin UDP'lerinin yayınını dinlemek). Ancak tüm cihazlar bunu desteklemiyor. Ancak tüm cihazlar ICMP'yi de desteklemez. (gereksiz yere bombalanmak istemezler).
Başka ilginç bir olasılık daha var. DHCP paketleri için balık tutabilir ve bir yönlendiricinin yeni bir cihaza ne zaman IP adresi verdiğini görebilirsiniz. Ancak bu, statik IP'lere sahip cihazlar için işe yaramaz. Bir şeye ihtiyaç duyana kadar ağa dokunmazlar bile. WiFi'ye bağlanmak başka bir katmandadır ve dinleyici olmak istemediğiniz sürece kolayca algılanamaz. Ağ bağdaştırıcısıyla belirli bir modda yapılabilse bile emin değilim. Bunun için ek donanıma ihtiyaç olacağını düşünüyorum.
Python'da ping elde etmek için, ping programına alt işlem yapmadan ve hızı kaybetmeden, ham soket oluşturmanız ve ICMP paketini manuel olarak oluşturmanız gerekir. Zor değil. Web üzerinde bir yerde bunun bir örneği var. Tabii ki, göndermek için ping gibi kök izinlerine ihtiyacınız olacak. Bu bir dezavantaj. Yazılımı dağıtacaksanız, kullanıcıların kök olarak çalıştırmak istemesini bekleyemezsiniz.