我偶然发现了这个问题,而当我一次做类似的决定时,我决定发布答案。
我做了以下事情:
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请求。如果设备响应并且Server标头正确命名,那么这就是我的设备。
但是我不能不先ping就快。HTTP是TCP,请求很大,因此WiFi超时必须为4秒。对253个地址执行此操作很慢。但是,您不会再有253台设备(可能)少一些HTTP服务器。(或者您的电话)
考虑路由器日志是一个好主意,而且很容易。甚至比对所有命令执行ping操作的速度更快。有些路由器甚至不需要登录即可访问它们。
另外,值得检查您的设备是否支持UPNP。如果是这样,则可以使用UPNP来检测其存在。这将是官方解决方案(在广播中收听UPNP的UDP)。但是所有设备均不支持。但是所有设备也不支持ICMP。(他们不想被不必要地轰炸)。
还有另一种有趣的可能性。您可以获取DHCP数据包,并查看路由器何时为新设备提供IP地址。但这不适用于具有静态IP的设备。在他们需要某些东西之前,他们甚至不会接触网络。连接到WiFi本身位于另一层,除非您想充当嗅探器,否则无法轻易检测到。我不确定它是否可以在混杂模式下与网络适配器一起使用。我认为这将需要其他硬件。
要在Python中实现ping,而又不对ping程序进行子处理又不会失去速度,则必须创建原始套接字并手动构造ICMP数据包。不难 在网络上的某个地方有它的示例。当然,要发送它,您将需要ping用户具有root权限。这是一个缺点。如果要分发软件,则不能期望用户要以root用户身份运行它。