ฉันสะดุดในเรื่องนี้และเมื่อฉันทำสิ่งที่คล้ายกันตัดสินใจโพสต์คำตอบ
ฉันทำต่อไปนี้:
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 ที่ทำงานบนอุปกรณ์ของฉัน ดังนั้นฉันเพิ่งส่งคำขอ HTTP HEAD สำหรับสิ่งใดเป็นหลักในพอร์ต 80 ถ้าอุปกรณ์ตอบสนองและส่วนหัวของเซิร์ฟเวอร์ตั้งชื่ออย่างถูกต้องนี่คืออุปกรณ์ของฉัน
แต่ฉันไม่สามารถไปอย่างรวดเร็วโดยไม่กระตุกก่อน HTTP เป็น TCP และคำขอมีขนาดใหญ่ดังนั้นการหมดเวลาต้องเป็น 4 วินาทีสำหรับ WiFi การทำเช่นนี้กับ 253 ที่อยู่นั้นช้ามาก แต่คุณจะไม่มีอุปกรณ์ 253 (อาจ) เซิร์ฟเวอร์ HTTP น้อยลง (หรือในกรณีของคุณโทรศัพท์)
พิจารณาบันทึกเราเตอร์เป็นความคิดที่ดีมากและง่าย และเร็วยิ่งกว่าส่ง Ping ทั้งหมด เราเตอร์บางตัวไม่จำเป็นต้องเข้าสู่ระบบเพื่อเข้าใช้
นอกจากนี้ควรตรวจสอบว่าอุปกรณ์ของคุณรองรับ UPNP หรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถใช้ UPNP เพื่อตรวจสอบสถานะของมัน นี่จะเป็นวิธีแก้ปัญหาอย่างเป็นทางการ (การฟังการออกอากาศสำหรับ UDP ของ UPNP) แต่อุปกรณ์ทั้งหมดไม่รองรับ แต่อุปกรณ์ทั้งหมดไม่รองรับ ICMP ด้วย (พวกเขาไม่ต้องการถูกทิ้งระเบิดโดยไม่จำเป็น)
มีความเป็นไปได้ที่น่าสนใจอีกอย่างหนึ่งคือ คุณสามารถหาแพ็กเก็ต DHCP และดูว่าเมื่อเราเตอร์ให้ที่อยู่ IP ของอุปกรณ์ใหม่ แต่สิ่งนี้จะไม่ทำงานสำหรับอุปกรณ์ที่มี IP คงที่ พวกเขาจะไม่แตะต้องเครือข่ายจนกว่าพวกเขาจะต้องการอะไร การเชื่อมต่อกับ WiFi นั้นอยู่ในเลเยอร์อื่นและไม่สามารถตรวจจับได้ง่ายเว้นแต่คุณต้องการทำท่าเหมือนดมกลิ่น ฉันไม่แน่ใจว่าจะสามารถใช้งานอะแดปเตอร์เครือข่ายได้ในโหมด promisquous หรือไม่ ฉันคิดว่าจะต้องใช้ฮาร์ดแวร์เพิ่มเติมสำหรับสิ่งนี้
เพื่อให้การ ping ใน Python ประสบความสำเร็จโดยไม่ต้อง subing โปรแกรม ping และลดความเร็วคุณต้องสร้าง socket socket ใหม่และสร้าง ICMP packet ด้วยตนเอง มันไม่ยาก มีตัวอย่างบางส่วนในเว็บ แน่นอนว่าในการส่งคุณจะต้องได้รับอนุญาตรูทเช่นเดียวกับการ ping นี่คือข้อเสียเปรียบ หากคุณจะเผยแพร่ซอฟต์แวร์คุณไม่สามารถคาดหวังให้ผู้ใช้ต้องการเรียกใช้ในฐานะรูท