나는 이것에 대해 우연히 만났고 한 번 비슷한 일을 했으므로 대답을 게시하기로 결정했습니다.
나는 다음을 수행했다.
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.
제 경우에는 장치에서 HTTP 서버를 실행했습니다. 방금 포트 80에서 아무것도 HTTP HEAD 요청을 보냈습니다. 장치가 응답하고 서버 헤더의 이름이 올바르게 지정되면 이것이 내 장치입니다.
그러나 먼저 핑을하지 않고는 빨리 갈 수 없었습니다. HTTP는 TCP이고 요청이 크므로 WiFi의 시간 초과는 4 초 여야합니다. 253 개의 주소에서이 작업을 수행하는 것은 지옥만큼 느립니다. 그러나 HTTP 서버가 더 적은 253 개의 장치가 없을 것입니다. (또는 귀하의 경우 전화)
라우터 로그를 고려하는 것은 매우 좋은 생각이며 쉽습니다. 그리고 모든 것을 핑하는 것보다 훨씬 빠릅니다. 일부 라우터는 로그인을 할 필요조차 없습니다.
또한 장치가 UPNP를 지원하는지 확인하는 것이 좋습니다. 그렇다면 UPNP를 사용하여 존재를 감지 할 수 있습니다. 이것은 공식 솔루션입니다 (UPNP의 UDP에 대한 방송 청취). 그러나 모든 장치가이를 지원하지는 않습니다. 그러나 모든 장치는 ICMP도 지원하지 않습니다. (그들은 불필요하게 폭격되기를 원하지 않는다).
또 다른 흥미로운 가능성이 있습니다. DHCP 패킷을 피싱하고 라우터가 새 장치에 IP 주소를 제공하는시기를 확인할 수 있습니다. 그러나 고정 IP를 사용하는 장치에서는 작동하지 않습니다. 그들은 무언가가 필요할 때까지 네트워크를 건드리지 않을 것입니다. WiFi 자체에 연결하는 것은 다른 계층에 있으며 스니퍼로 작동하지 않으면 쉽게 감지 할 수 없습니다. 무차별 모드에서 네트워크 어댑터로 수행 할 수 있는지 확실하지 않습니다. 추가 하드웨어가 필요하다고 생각합니다.
파이썬에서 핑을 달성하려면 핑 프로그램에 대한 서브 프로세싱없이 속도를 잃지 않으면 서 원시 소켓을 작성하고 수동으로 ICMP 패킷을 구성해야합니다. 어렵지 않습니다. 웹 어딘가에 그 예가 있습니다. 물론, 그것을 보내려면 핑과 마찬가지로 루트 권한이 필요합니다. 이것은 단점입니다. 소프트웨어를 배포 할 경우 사용자가 루트로 소프트웨어를 실행하기를 기대할 수 없습니다.