Нужно больше идей: как проверить, находится ли iPhone в сети Wi-Fi

у меня есть сервер дебиан. Этот сервер должен проверять, доступны ли iPhone в моем домашнем Wi-Fi. Проблема в том, что i-Devices приостанавливают работу модуля Wi-Fi для безопасного питания, если доступны мобильные данные. Итак, одно из решений — просто отключить мобильные данные, и обнаружение в Wi-Fi будет работать нормально. (Но это не реальное решение для меня, потому что это раздражает делать это вручную каждый раз, когда вы дома, и другие люди тоже будут использовать это программное обеспечение.)

На данный момент протестировано с iPad Mini и iPhone5 (ios7):

  1. Я выполнил задачу для Android, в Android есть трансляция, если у меня изменится подключение к сети, поэтому мне просто нужно поймать трансляцию программно и зарегистрировать меня на моем Debianbox. Пробовал то же самое на iDevice, но, похоже, невозможно перехватить изменения состояния Wi-Fi в Objective-C в фоновом режиме. На переднем плане это возможно через Apple-Reachability-Class. Но мне это нужно в фоновом режиме, поэтому для меня это невозможно.

  2. Просканируйте все порты моего iPhone и попробуйте выполнить запросы в надежде, что это разбудит мой Wi-Fi-модуль:

    • Открытые UDP-порты:

      • PORT STATE SERVICE VERSION
      • 999/udp открытое|отфильтрованное приложение
      • 1090/udp открытый|отфильтрованный ff-fms
      • 5001/udp open|отфильтрованная комплексная ссылка
      • 5353/udp open|отфильтровано zeroconf
      • 18134/udp открыто|отфильтровано неизвестно
      • 19141/udp открыто|отфильтровано неизвестно
      • 19717/udp открыто|отфильтровано неизвестно
      • 20919/udp открыто|отфильтровано неизвестно
      • 21354/udp открыто|отфильтровано неизвестно
      • 31625/udp открыто|отфильтровано неизвестно
      • 49191/udp открыто|отфильтровано неизвестно
      • 57409/udp открыто|отфильтровано неизвестно
    • Открытые порты TCP:

      • PORT STATE SERVICE VERSION
      • 62078/tcp открыть TCPWrapped

    Я пытался делать запросы с помощью netcat через порт 5353 UDP (Bonjour/MDNS). В результате iDevices действительно будит модуль Wi-Fi в первые 30 минут! По истечении этого периода времени это своего рода удача, если запрос разбудит модуль Wi-Fi. Я думаю, что примерно через 30 минут наступает «глубокий сон».

  3. MacBookPro как точка доступа Wi-Fi и iDevices, подключенные к ней. Затем я пронюхал весь трафик с помощью Wireshark, чтобы проверить, какие сообщения отправляются через Wi-Fi. По крайней мере, нашел многоадресную рассылку MDNS, которая выполняется каждым устройством iOS7. Эти сообщения могут быть перехвачены небольшим сервером Python. -> Работает, но период, когда устройства отправляют многоадресные рассылки, составляет от 1 до 30+ минут, так что это ненадежно.

  4. Креативный способ: Silent Push Notification для пробуждения iDevice, после чего возможен пинг в wifi. Так что push-уведомление просто разбудит мой Wi-Fi! -> Работает, но сервер APN не сообщает вам, было ли доставлено push-сообщение, так что это не очень надежно. Я проверил это, и несколько раз сервер APN «проглатывал» сообщение. И каждые 5 минут интернет-соединение и мобильный трафик данных, чтобы проверить, подключено ли мое устройство к Wi-Fi ... это не совсем лучшая практика. Но пока лучшее решение для автономной работы.

  5. Триггер, что вы находитесь дома с регионом геозоны. Это возможно, и работает, но стоит столько батареи. Но, возможно, нет другого хорошего решения.

  6. arp-scan — это инструмент, который делает arp-запрос к диапазону IP-адресов. Это не работает, если мобильные данные включены, иначе работает.

Итак, мои вопросы:

  • Есть ли запрос на определенный порт, который я могу отправить, чтобы разбудить Wi-Fi-модуль iDevice?
  • Может быть, есть объективный способ решить эту задачу?
  • Могу ли я отправить запрос MDNS, и iDevice ответит на него?
  • Могу ли я создать приложение с сокетом для фонового прослушивания, к которому подключается Debianbox?
  • Любые другие идеи, которые могут решить эту задачу? У меня нет идей.

Спасибо


person flo    schedule 06.12.2013    source источник


Ответы (2)


Проблема в том, что i-Devices приостанавливают модуль Wi-Fi для безопасного питания, если доступны мобильные данные.

Я не читал весь ваш вопрос, поэтому приношу извинения, если вы что-то пропустили, но чтобы устройство не отключало Wi-Fi через 30 минут, добавьте этот ключ в свой info.plist.

UIRequiresPersistentWiFi

UIRequiresPersistentWiFi (логическое значение — iOS) указывает, требуется ли приложению подключение к Wi-Fi. iOS поддерживает активное соединение Wi-Fi во время работы приложения.

person Robert    schedule 06.12.2013
comment
Привет, спасибо за ваш ответ. Я проверял это, но, похоже, он не работает в фоновом режиме, если на телефоне не запущена задача Wi-Fi. Любые другие идеи? - person flo; 09.12.2013

Вы пробовали Достижимость? У Apple есть собственная структура, которую вы можете использовать. Попробуйте этот образец от них: https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html

Надеюсь, что это ответ на ваш вопрос.

person Septronic    schedule 05.08.2015