私はこれにつまずきました、そして、私がかつて同様のことをしたとき、答えを投稿することに決めました。
私は次のことをしました:
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リクエストを送信しただけです。デバイスが応答し、サーバーヘッダーの名前が適切であれば、これが私のデバイスです。
しかし、最初にpingを送信しないと、速く進むことはできませんでした。HTTPはTCPであり、リクエストは大きいため、WiFiのタイムアウトは4秒にする必要があります。253アドレスに対してこれを行うと、地獄のように遅くなります。しかし、253台のデバイス(おそらく)が少ないHTTPサーバーはありません。(またはあなたの場合、電話)
ルーターのログを検討することは非常に良いアイデアであり、簡単です。そして、すべてにpingするよりも高速です。一部のルーターは、アクセスするためにログインする必要さえありません。
また、デバイスがUPNPをサポートしているかどうかを確認することも重要です。存在する場合は、UPNPを使用してその存在を検出できます。これは公式の解決策になります(UPNPのUDPのブロードキャストを聞く)。ただし、すべてのデバイスでサポートされているわけではありません。ただし、すべてのデバイスがICMPもサポートしていません。(彼らは不必要に爆撃されることを望んでいない)。
別の興味深い可能性があります。DHCPパケットを探して、ルーターが新しいデバイスにIPアドレスを与えるタイミングを確認できます。しかし、これは静的IPを備えたデバイスでは機能しません。彼らは何かが必要になるまでネットワークに触れさえしませんでした。WiFi自体への接続は別のレイヤー上にあり、スニファーとして機能することを望まない限り、簡単に検出できません。雑多モードのネットワークアダプターでそれが可能かどうかはわかりません。これには追加のハードウェアが必要になると思います。
Pythonでpingを実行するには、pingプログラムへのサブプロセスを行わずに速度を失うことなく、rawソケットを作成し、ICMPパケットを手動で作成する必要があります。難しいことではありません。ウェブ上のどこかにその例があります。もちろん、送信するには、pingと同様にroot権限が必要です。これは欠点です。ソフトウェアを配布する場合、ユーザーがrootとして実行することを期待することはできません。