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

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

  • 我已经完成了android的任务,如果我的网络连接发生变化,在android中会有一个广播,所以我只需要以编程方式捕获广播并在我的Debianbox上注册我。
    在iDevice上进行了相同的尝试,但似乎无法在后台拦截Objective-C中的Wifi状态更改。在前台,它可能通过Apple-Reachability-Class实现。
    但是我在后台需要它,所以对我来说这是不可能的。
  • 扫描我的iPhone的所有端口,并尝试发出请求,以期唤醒我的Wifi模块:
  • 打开UDP端口:
  • 端口状态服务版本
  • 999 / udp已打开|已过滤applix
  • 1090 / udp已打开|已过滤ff-fms
  • 5001 / udp已打开|已过滤复杂链接
  • 5353 / udp已打开|已过滤的零配置
  • 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分钟以上,因此不稳定。
  • 一种创新的方式:在可以ping通wifi之后,通过静默推送通知唤醒iDevice。因此,推送通知只会唤醒我的wifi!
    ->可以,但是APN Server不会告诉您是否已发送推送消息,因此它不是很可靠。我已经对此进行了测试,有时APN Server会“吞下”该消息。每隔5分钟就有一次互联网连接和移动数据流量来检查我的设备是否在wifi中……这并不是最佳做法。但是到目前为止,这是电池寿命的最佳解决方案。
  • 触发您在家里有地理围栏区域。这是可行的,而且可行,但它会消耗大量电池。但是也许没有其他好的解决方案。
  • arp-scan是一个使arp请求达到ip范围的工具。如果打开了移动数据,此功能将无效,否则它将启用。

  • 所以我的问题是:
  • 是否可以在特定端口上发送请求以唤醒iDevice的wifi模块?
  • 是否可能有一种客观的方法来解决此任务?
  • 我可以发送MDNS请求,iDevice会回答吗?
  • 我可以创建一个具有监听后台套接字的应用程序,并与Debianbox连接吗?
  • 还有其他可以解决此任务的想法吗?我没主意了。

  • 谢谢

    最佳答案

    问题是,如果移动数据可用,则i-Devices将WiFi模块挂起以确保安全供电

    我没有阅读您的整个问题,因此很想知道您是否错过了什么,但是为了避免设备在30分钟后暂停Wi-Fi,请将此密钥添加到您的info.plist

    UIRequiresPersistentWiFi

    UIRequiresPersistentWiFi(布尔值-iOS)指定应用程序是否需要Wi-Fi连接。在应用运行时,iOS会保持 Activity 的Wi-Fi连接打开。

    关于ios - 需要更多建议:如何检查iPhone是否在Wifi中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20420431/

    10-12 00:23
    查看更多