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

时间:2013-12-06 09:32:49

标签: ios objective-c networking bonjour mdns

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

目前使用iPad Mini和iPhone5(ios7)进行了测试:

  1. 我已经完成了android的任务,在Android中有一个广播,如果我的网络连接发生变化,所以我只需要以编程方式捕获广播并在我的Debianbox上注册我。 在iDevice上尝试过相同但似乎无法在后台拦截Objective-C中的Wifi-Status-Changes。在前景中它可以通过Apple-Reachability-Class实现。 但我在背景中需要它,所以这对我来说是不可能的。

  2. 扫描我的iPhone的所有端口并尝试执行请求,希望这能唤醒我的Wifi模块:

    • 打开UDP端口:

      • 港口国服务版
      • 999 / udp open | filtered applix
      • 1090 / udp open | filtered ff-fms
      • 5001 / udp open | filtered commplex-link
      • 5353 / udp open | filtered zeroconf
      • 18134 / udp open |过滤未知
      • 19141 / udp open |过滤未知
      • 19717 / udp open |过滤未知
      • 20919 / udp open |过滤未知
      • 21354 / udp open |过滤未知
      • 31625 / udp open |过滤未知
      • 49191 / udp open |过滤未知
      • 57409 / udp open |过滤未知
    • 打开TCP端口:

      • 港口国服务版
      • 62078 / tcp open tcpwrapped

    我尝试在端口5353 UDP(Bonjour / MDNS)上使用 netcat 发出请求。结果是iDevices在前30分钟内真正唤醒了wifi模块!在那段时间之后,如果请求唤醒wifi模块那么运气。我想大约30分钟后可能会有“深度睡眠”。

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

  4. 一种创造性的方式:静音推送通知唤醒iDevice,之后可以ping通wifi。所以推送通知只是唤醒我的无线网络! - >有效,但APN服务器不会告诉您推送消息是否已发送,因此它不是很稳固。我测试了这个,有时候APN服务器“吞下”了这条消息。每隔5分钟就会有一个互联网连接和移动数据流量,以检查我的设备是否处于无线网络状态......这不是最好的做法。但到目前为止,这是电池寿命的最佳解决方案。

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

  6. arp-scan是一个向ar-range发出arp-request的工具。如果打开移动数据,则此功能无效,否则无效。

  7. 所以我的问题:

    • 我可以发送一个特定端口请求唤醒iDevice的wifi模块吗?
    • 有没有一种客观的方法可以解决这个问题?
    • 我可以发送MDNS请求吗?iDevice会回答它吗?
    • 我可以创建一个具有后台监听套接字并且Debianbox连接到该应用程序的应用程序吗?
    • 可以解决此任务的任何其他想法?我没有想法。

    谢谢

2 个答案:

答案 0 :(得分:0)

  

问题是,如果移动数据可用,i-Devices会将wifi模块暂停到安全电源

我没有阅读你的整个问题所以如果你有错过的东西就应用了,但要避免设备在30分钟后暂停Wi-Fi,请将此密钥添加到info.plist

UIRequiresPersistentWiFi

  

UIRequiresPersistentWiFi(布尔 - iOS)指定应用是否需要Wi-Fi连接。 iOS会在应用程序运行时保持活动的Wi-Fi连接处于打开状态。

答案 1 :(得分:0)

你尝试过Reachability吗? Apple有自己的框架可以使用。试试这个样本:https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html

希望这能回答你的问题。