我有一个 Debian 服务器。此服务器应检查我的家庭 wifi 中是否有可用的 iPhone。问题是,如果移动数据可用,i-Devices 会将 wifi 模块暂停到安全电源。因此,一种解决方案是,只需关闭移动数据,wifi 中的发现就可以正常工作。(但这对我来说不是一个真正的解决方案,因为每次在家时手动执行此操作很烦人,而且其他人也会使用此软件。)
到目前为止使用 iPad Mini 和 iPhone5 (ios7) 进行了测试:
我已经完成了 android 的任务,如果我的网络连接发生变化,在 Android 中会有一个广播,所以我只需要以编程方式捕捉广播并在我的 Debianbox 上注册我。在 iDevice 上尝试了同样的方法,但似乎无法在后台拦截 Objective-C 中的 Wifi-Status-Changes。在前台,它可能通过 Apple-Reachability-Class。但我需要它在后台,所以这对我来说是不可能的。
扫描我 iPhone 的所有端口并尝试发出请求,希望这能唤醒我的 Wifi 模块:
打开 UDP 端口:
- 港口国服务版本
- 999/udp 打开|过滤的应用程序
- 1090/udp 打开|过滤 ff-fms
- 5001/udp 打开|过滤的复杂链接
- 5353/udp 打开|过滤的 zeroconf
- 18134/udp 打开|过滤未知
- 19141/udp 打开|过滤未知
- 19717/udp 打开|过滤未知
- 20919/udp 打开|过滤未知
- 21354/udp 打开|过滤未知
- 31625/udp 打开|过滤未知
- 49191/udp 打开|过滤未知
- 57409/udp 打开|过滤未知
打开 TCP 端口:
- 港口国服务版本
- 62078/tcp 打开 tcpwrapped
我尝试在端口 5353 UDP (Bonjour/MDNS) 上使用netcat发出请求。结果是 iDevices 在前 30 分钟内真正唤醒了 wifi 模块!在那段时间之后,如果请求唤醒 wifi 模块,这是一种幸运。我认为大约 30 分钟后可能会有“深度睡眠”。
MacBookPro 作为 wifi 热点和连接到此的 iDevices。然后我用 Wireshark 嗅探整个流量以检查通过 Wifi 发送的消息。至少找到了一个由每个 iOS7 设备完成的 MDNS 多播。这个消息可以被一个小的 python 服务器捕获。-> 有效,但设备发送多播的时间是 1 分钟到 30 多分钟,所以它不是固定的。
一个创造性的方法:静默推送通知来唤醒iDevice,之后可以ping wifi。所以推送通知只是唤醒了我的wifi!-> 有效,但 APN 服务器不会告诉您推送消息是否已发送,因此它不是很可靠。我已经对此进行了测试,有时 APN 服务器会“吞下”该消息。每 5 分钟检查一次互联网连接和移动数据流量,以检查我的设备是否在 wifi 中……这并不是真正的最佳做法。但迄今为止电池寿命的最佳解决方案。
触发您在家中使用地理围栏区域。这是可能的,并且有效,但它的电池成本很高。但也许没有其他好的解决方案。
arp-scan 是一个向 ip-range 发出 arp-request 的工具。如果打开移动数据,这不起作用,否则它会起作用。
所以我的问题:
- 我可以发送特定端口上的请求以唤醒 iDevice 的 wifi 模块吗?
- 是否有一种客观的方法来解决这个任务?
- 我可以发送 MDNS 请求,iDevice 会回答吗?
- 我可以创建一个具有后台监听套接字并且 Debianbox 连接到该套接字的应用程序吗?
- 还有其他可以解决此任务的想法吗?我没主意了。
谢谢