मैं इस पर लड़खड़ाया और जैसा कि मैंने एक बार कुछ इसी तरह एक उत्तर पोस्ट करने का फैसला किया।
मैंने निम्नलिखित कार्य किया:
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 टीसीपी है और अनुरोध बड़ा है, इसलिए वाईफाई के लिए टाइमआउट 4 सेकंड का होना चाहिए। 253 पतों के लिए ऐसा करना नरक के समान धीमा है। लेकिन आपके पास 253 डिवाइस (शायद) अधिक कम HTTP सर्वर नहीं होंगे। (या आपके मामले में, फोन)
राउटर लॉग को ध्यान में रखते हुए बहुत अच्छा विचार है, और आसान है। और सभी को पिंग करने से भी तेज। कुछ राउटरों को उन्हें प्राप्त करने के लिए लॉगिंग की भी आवश्यकता नहीं होती है।
इसके अलावा, यह जांचने योग्य है कि आपके डिवाइस में UPNP का समर्थन है या नहीं। यदि ऐसा होता है, तो आप इसकी उपस्थिति का पता लगाने के लिए यूपीएनपी का उपयोग कर सकते हैं। यह आधिकारिक समाधान होगा (UPNP के यूडीपी के लिए प्रसारण पर सुनना)। लेकिन सभी डिवाइस इसका समर्थन नहीं करते हैं। लेकिन सभी डिवाइस ICMP का भी समर्थन नहीं करते हैं। (वे अनावश्यक रूप से बमबारी नहीं करना चाहते हैं)।
एक और दिलचस्प संभावना है। आप डीएचसीपी पैकेट के लिए मछली पकड़ सकते हैं और देख सकते हैं कि कब एक राउटर एक नए डिवाइस को आईपी एड्रेस दे रहा है। लेकिन यह स्थिर IP वाले उपकरणों के लिए काम नहीं करेगा। वे नेटवर्क को तब तक स्पर्श नहीं करेंगे जब तक उन्हें कुछ की आवश्यकता नहीं है। जब तक आप एक स्निफर के रूप में कार्य नहीं करना चाहते हैं तब तक वाईफाई से कनेक्ट करना एक और परत पर है और आसानी से पता नहीं लगाया जा सकता है। मुझे यकीन नहीं है कि यह एक उचित मोड में नेटवर्क एडेप्टर के साथ भी संभव है। मुझे लगता है कि इसके लिए अतिरिक्त हार्डवेयर की जरूरत होगी।
पाइथन में पिंग को प्राप्त करने के लिए, पिंग प्रोग्राम को उपप्रोसेस किए बिना और गति को खोने के बिना, आपको कच्चे सॉकेट बनाने और मैन्युअल रूप से आईसीएमपी पैकेट का निर्माण करना होगा। यह कठिन नहीं है। इसका उदाहरण वेब पर कहीं है। बेशक, इसे भेजने के लिए आपको पिंग की तरह रूट अनुमतियों की आवश्यकता होगी। यह एक खामी है। यदि आप सॉफ़्टवेयर वितरित करेंगे तो आप उपयोगकर्ताओं से इसे रूट के रूप में चलाने की अपेक्षा नहीं कर सकते।