Подтвердить что ты не робот

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?

4b9b3361

Ответ 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 секунды, чтобы предотвратить тайм-аут активности в Интернете.