我有一个Debian服务器。这个服务器应该检查iPhone是否在我家的wifi中可用。问题是,如果移动数据可用,i-Devices会将wifi模块挂起以获得安全电源。因此,一个解决方案是,只需关闭移动数据,在wifi中进行发现就可以了。(但这对我来说不是一个真正的解决方案,因为每次你在家时手动操作很烦人,其他人也会使用这个软件。)
到目前为止,已经用iPad Mini和iPhone 5(ios7)进行了测试:
-
我已经为android完成了这项任务,在android中,如果我的网络连接发生变化,就会有一个广播,所以我只需要以编程方式捕捉广播,并在我的Debianbox上注册我。在iDevice上尝试了同样的操作,但似乎不可能在后台拦截Objective-C中的Wifi状态更改。在前景中,它可能通过苹果可达性类。但我需要它在后台,所以这对我来说是不可能的
-
扫描我iPhone的所有端口,并尝试执行请求,希望这能唤醒我的Wifi模块:
-
打开UDP端口:
- 端口状态服务版本
- 999/udp打开|已过滤的applix
- 1090/udp打开|已过滤的ff fms
- 5001/udp打开|已筛选的commplex链接
- 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,之后可以在wifi中进行ping。所以推送通知只是唤醒了我的wifi!->有效,但APN服务器不会告诉你推送消息是否已送达,所以它不是很可靠。我测试过这个,有时APN服务器会"吞下"消息。每5分钟一次互联网连接和移动数据流量,以检查我的设备是否处于wifi。。。这并不是最好的做法。但迄今为止电池寿命的最佳解决方案。
-
触发您在地理围栏区域的家中。这是可能的,而且有效,但它需要花费大量的电池。但也许没有其他好的解决方案。
-
arp扫描是一种向ip范围发出arp请求的工具。如果打开了移动数据,这将不起作用,否则会起作用。
所以我的问题是:
- 我可以发送特定端口的请求来唤醒iDevice的wifi模块吗
- 有没有一种客观的方法来解决这项任务
- 我可以发送MDNS请求,iDevice会回答吗
- 我可以创建一个有后台监听套接字的应用程序,Debianbox连接到它吗
- 有其他想法可以解决这项任务吗?我没主意了
感谢
问题是,如果移动数据可用,i-Devices会将wifi模块挂起以获得安全电源
我没有读过你的整个问题,所以如果你错过了什么,我很感激,但为了避免设备在30分钟后暂停Wi-Fi,请将此密钥添加到你的信息中
UIRequiresPersistentWiFi
UIRequiresPersistentWiFi(布尔型-iOS)指定应用程序是否需要Wi-Fi连接。iOS在应用程序运行时保持活动的Wi-Fi连接打开。
您尝试过可达性吗?苹果有自己的框架,你可以使用。请他们试用此示例:https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
希望这能回答你的问题。