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?

Solutions Collecting From Web of "Android: как использовать Wi-Fi-сеть для определенных хостов, но использовать телефон. Мобильная сеть для всего остального."

На самом деле вы можете, но только с 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 ) для ваших запросов.

Android обычно срывает сети, которые не являются сетевыми предпочтениями. Работа, которую вы можете использовать, – создать AP через мобильное приложение и позволить устройству подключиться к нему. Таким образом, мобильный телефон может поддерживать подключение к Интернету, а также связываться с устройством.

Для получения информации о реализации см. Следующие ссылки:

https://github.com/opengarden/android-tether

https://code.google.com/p/android-wifi-tether/

Аналогично Asked before as Включить одновременный Wi-Fi и 3G-интерфейс на Android, и быстрый ответ был НЕТ.

Но на самом деле это возможно и реализовано в некоторых программах, таких как SuperDownload (см. Stackexchange )

Это программное обеспечение требует root.

http://geeknizer.com/wp-content/uploads/2012/08/super-download-3g-wifi.jpg

Двухканальная загрузка также рекламируется на некоторых новых телефонах Android. (Я не могу найти ссылку, они использовали новый маркетинговый термин для использования Wi-Fi + 3G вместе)

Есть ли решение, позволяющее Android-приложению использовать Wi-Fi для определенного IP-адреса и мобильной сети для всего остального? Может быть, это можно сделать через NDK?

Возможно, потому, что WiFi необходим только для локального адреса, вы можете пойти на создание специального WiFi-драйвера, но это будет непросто.

И идя дальше в программное обеспечение:

Эта функция – маршрутизация пакетов TCP / IP. Если вы знаете, как реализовать это в Linux, вы делаете половину. Следующим было бы заставить его работать на Android. Но я предполагаю, что это не будет включено для несистемного приложения, так как это будет легко использовать всю целостность безопасности (например, заменить IP-адрес банковского сервера)

Это может быть простое решение: устанавливать WiFi в качестве предпочтительного интерфейса каждый раз, когда вам нужно управлять устройством, и устанавливать предпочтительную сеть мобильной связи сразу после завершения работы. Это может привести к прерыванию одновременных действий в Интернете, но напомните, что TCP и большинство приложений позволяют задерживать до нескольких секунд (или даже больше). Прерывание является незначительным, если контрольное задание для вашего устройства является спорадическим и никогда не требует долгого ожидания.

Если вышеуказанная ситуация не соответствует действительности, сделайте обратное: установите WiFi как предпочтительный интерфейс по умолчанию и установите предпочтительную мобильную сеть, когда вам не нужно управлять устройством. Но убедитесь, что вы переключаетесь обратно в мобильную сеть часто, скажем каждые 3 секунды, чтобы предотвратить тайм-аут активности в Интернете.