需要更多想法:如何检查iPhone是否在Wifi中



我有一个Debian服务器。这个服务器应该检查iPhone是否在我家的wifi中可用。问题是,如果移动数据可用,i-Devices会将wifi模块挂起以获得安全电源。因此,一个解决方案是,只需关闭移动数据,在wifi中进行发现就可以了。(但这对我来说不是一个真正的解决方案,因为每次你在家时手动操作很烦人,其他人也会使用这个软件。)

到目前为止,已经用iPad Mini和iPhone 5(ios7)进行了测试:

  1. 我已经为android完成了这项任务,在android中,如果我的网络连接发生变化,就会有一个广播,所以我只需要以编程方式捕捉广播,并在我的Debianbox上注册我。在iDevice上尝试了同样的操作,但似乎不可能在后台拦截Objective-C中的Wifi状态更改。在前景中,它可能通过苹果可达性类。但我需要它在后台,所以这对我来说是不可能的

  2. 扫描我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分钟后可能会有一个"深度睡眠"。

  3. MacBookPro作为wifi热点和iDevices连接到此。然后我用Wireshark嗅探了整个流量,以检查通过Wifi发送的消息。至少找到了一个由每个iOS7设备完成的MDNS多播。这个消息可以被一个小python服务器捕获。->有效,但设备发送多播的时间是1分钟到30多分钟,所以它不稳定。

  4. 一种创造性的方式:静音推送通知唤醒iDevice,之后可以在wifi中进行ping。所以推送通知只是唤醒了我的wifi!->有效,但APN服务器不会告诉你推送消息是否已送达,所以它不是很可靠。我测试过这个,有时APN服务器会"吞下"消息。每5分钟一次互联网连接和移动数据流量,以检查我的设备是否处于wifi。。。这并不是最好的做法。但迄今为止电池寿命的最佳解决方案。

  5. 触发您在地理围栏区域的家中。这是可能的,而且有效,但它需要花费大量的电池。但也许没有其他好的解决方案。

  6. 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

希望这能回答你的问题。

最新更新