Tôi vấp phải điều này và khi tôi đã làm điều gì đó tương tự đã quyết định đăng một câu trả lời.
Tôi đã làm như sau:
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.
Trong trường hợp của tôi, tôi đã có một máy chủ HTTP chạy trên thiết bị của mình. Vì vậy, tôi vừa gửi yêu cầu HTTP Head về cơ bản không có gì trên cổng 80. Nếu thiết bị phản hồi và tiêu đề Máy chủ được đặt tên chính xác, thì đây là thiết bị của tôi.
Nhưng tôi không thể đi nhanh mà không ping trước. HTTP là TCP và yêu cầu rất lớn, vì vậy thời gian chờ phải là 4 giây cho WiFi. Làm điều này cho 253 địa chỉ là chậm như địa ngục. Nhưng bạn sẽ không có 253 thiết bị (có thể) ít máy chủ HTTP hơn. (hoặc trong trường hợp của bạn, điện thoại)
Xem xét các bản ghi bộ định tuyến là ý tưởng rất tốt, và dễ dàng. Và thậm chí nhanh hơn so với ping tất cả. Một số bộ định tuyến thậm chí không cần đăng nhập để truy cập chúng.
Ngoài ra, cần kiểm tra xem thiết bị của bạn có hỗ trợ UPNP hay không. Nếu có, bạn có thể sử dụng UPNP để phát hiện sự hiện diện của nó. Đây sẽ là giải pháp chính thức (nghe trên phát sóng cho UDP của UPNP). Nhưng tất cả các thiết bị không hỗ trợ nó. Nhưng tất cả các thiết bị cũng không hỗ trợ ICMP. (họ không muốn bị bắn phá không cần thiết).
Có một khả năng thú vị khác. Bạn có thể câu cá cho các gói DHCP và xem khi nào bộ định tuyến cung cấp cho thiết bị mới một địa chỉ IP. Nhưng điều này sẽ không hoạt động cho các thiết bị có IP tĩnh. Họ thậm chí sẽ không chạm vào mạng cho đến khi họ cần một cái gì đó. Bản thân việc kết nối với WiFi nằm trên một lớp khác và không thể dễ dàng phát hiện trừ khi bạn muốn hoạt động như một trình thám thính. Tôi không chắc chắn ngay cả khi nó có thể thực hiện được với bộ điều hợp mạng ở chế độ hứa hẹn. Tôi nghĩ phần cứng bổ sung sẽ là cần thiết cho việc này.
Để đạt được ping trong Python, không cần xử lý chương trình ping và mất tốc độ, bạn phải tạo ổ cắm thô và xây dựng gói ICMP theo cách thủ công. Nó không khó Có ví dụ về nó ở đâu đó trên web. Tất nhiên, để gửi nó, bạn sẽ cần quyền root cũng như ping. Đây là một nhược điểm. Nếu bạn sẽ phân phối phần mềm, bạn không thể mong đợi người dùng muốn chạy nó dưới quyền root.