Android: как использовать Wi-Fi-сеть для определенных хостов, но использовать телефонную сеть Мобильная сеть для всего остального
Я разрабатываю мобильное приложение (iOS и Android) для управления устройством через Wi-Fi. Устройство создает беспроводную сеть (SoftAP), но не обеспечивает доступ к Интернету.
В iOS я могу подключиться к устройству и сделать запросы на его IP-адрес (192.168.70.1), но все остальные запросы возвращаются в мобильную сеть. Это позволяет телефону поддерживать подключение к Интернету при подключении к устройству через Wi-Fi.
На Android, если я подключаюсь к беспроводной сети устройства, интернет-запросы не возвращаются к мобильному соединению, они просто терпят неудачу.
В моем приложении для Android я могу использовать ConnectivityManager.requestRouteToHost
, чтобы заставить приложения из моего приложения использовать мобильную сеть. Однако запросы других приложений по-прежнему используют сеть Wi-Fi устройства и не работают.
Я также попытался использовать ConnectivityManager
для изменения сетевого предпочтения с помощью:
ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)
Это заставляет телефон использовать мобильную сеть для всех запросов от всех приложений. Wi-Fi отключен. Похоже, что в предыдущих версиях Android Wi-Fi все еще можно было использовать, даже если это не "предпочтительная" сеть, но это, похоже, не работает в KitKat. Возможно, это связано с изменением в Android 4.2: https://code.google.com/p/android/issues/detail?id=73509 "ConnectivityManager, так как 4.2 сбрасывает сети, которые не являются NetworkPreference"
Есть ли решение, позволяющее Android-приложению использовать Wi-Fi для определенного IP-адреса и мобильной сети для всего остального? Может быть, это можно сделать через NDK?
Ответы
Ответ 1
На самом деле вы можете, но только с Lollipop (API 21).
Из документации API API 21:
Android 5.0 provides new multi-networking APIs that let your app dynamically scan for available
networks with specific capabilities, and establish a connection to them. This functionality is useful
when your app requires a specialized network, such as an SUPL, MMS, or carrier-billing network, or if
you want to send data using a particular type of transport protocol.
Итак, вы можете использовать класс NetworkRequest.Builder для создания NetworkRequest, который отправляет запрос по определенному Транспортному типу.
Используйте следующую функцию:
NetworkRequest.Builder addTransportType(int transportType)
Чтобы установить типы транспорта (WIFI, ETHERNET или CELLULAR, например) для ваших запросов.
Ответ 2
Android обычно срывает сети, которые не являются сетевыми предпочтениями.
Работа, которую вы можете использовать, - создать AP через мобильное приложение и позволить устройству подключиться к нему.
Таким образом, мобильный телефон может поддерживать подключение к Интернету, а также связываться с ним.
Обратитесь к следующим ссылкам для деталей реализации:
https://github.com/opengarden/android-tether
https://code.google.com/p/android-wifi-tether/
Ответ 3
Аналогично Задано ранее как Включить одновременно интерфейс Wi-Fi и 3G на Android, и быстрый ответ был НЕТ.
Но на самом деле это возможно и реализовано в некоторых программах, таких как SuperDownload.
(см. stackexchange)
Это программное обеспечение требует root.
![]()
(источник: geeknizer.com)
Двухканальная загрузка также рекламируется в каком-то новом телефоне Android. (Я не могу найти ссылку, они использовали новый маркетинговый термин для WiFi + 3G, использованного вместе)
Есть ли решение, которое позволяет приложению Android использовать Wi-Fi для определенного IP-адреса и мобильную сеть для всего остального? Может быть, это можно сделать через NDK?
Возможно, из-за того, что WiFi нужен только для локального адреса, вы можете создать специальный драйвер WiFi, но это опять-таки не будет простым.
И углубляясь в программное обеспечение:
эта функция - маршрутизация пакетов TCP/IP. Если вы знаете, как реализовать это в Linux, вы наполовину готовы. Следующим будет заставить его работать на Android. Но я предполагаю, что он не будет включен для несистемного приложения, так как это будет легко эксплуатируемое целое безопасности (например, IP-адрес замещающего банковского сервера)
Ответ 4
Это может быть простое решение: устанавливать WiFi в качестве предпочтительного интерфейса каждый раз, когда вам нужно управлять устройством, и устанавливать мобильную сеть предпочтительно после завершения задания. Это может привести к прерыванию одновременных действий в Интернете, но напомните, что TCP и большинство приложений позволяют задерживать до нескольких секунд (или даже больше). Прерывание является незначительным, если контрольное задание для вашего устройства является спорадическим и никогда не требует долгого ожидания.
Если вышеуказанная ситуация не так, сделайте обратное: установите WiFi как предпочтительный интерфейс по умолчанию и задайте мобильную сеть, если вам не нужно управлять устройством. Но убедитесь, что вы переключаетесь обратно в мобильную сеть часто, скажем каждые 3 секунды, чтобы предотвратить тайм-аут активности в Интернете.