android - señal - porque mi celular no se conecta a wifi de mi casa
Android: cómo utilizar una red Wifi para hosts específicos, pero utilizar el teléfono Red móvil para todo lo demás (4)
Estoy desarrollando una aplicación móvil (iOS y Android) para controlar un dispositivo a través de Wi-Fi. El dispositivo crea una red inalámbrica (SoftAP) pero no proporciona acceso a Internet.
En iOS, puedo conectarme al dispositivo y realizar solicitudes a su dirección IP (192.168.70.1), pero todas las demás solicitudes recurren a la red móvil. Esto permite que el teléfono mantenga la conectividad a Internet mientras está conectado al dispositivo a través de Wi-Fi.
En Android, si me conecto a la red inalámbrica del dispositivo, las solicitudes de Internet no recurren a la conexión móvil, simplemente fallan.
En mi aplicación de Android, puedo usar ConnectivityManager.requestRouteToHost
para forzar que las solicitudes de mi aplicación utilicen la red móvil. Sin embargo, las solicitudes realizadas por otras aplicaciones todavía utilizan la red wifi del dispositivo y fallan.
También he intentado usar el ConnectivityManager
para cambiar la preferencia de red con:
ConnectivityManager.setNetworkPreference (ConnectivityManager.TYPE_MOBILE)
Esto hace que el teléfono use la red móvil para todas las solicitudes de todas las aplicaciones. Wi-Fi está desactivado. Parece que en versiones anteriores de Android Wi-Fi todavía podría usarse incluso si no es la red "preferida" pero esto no parece funcionar en KitKat. Es posible que esté relacionado con un cambio en Android 4.2: https://code.google.com/p/android/issues/detail?id=73509 "ConnectivityManager desde 4.2 destruye las redes que no son el NetworkPreference"
¿Existe alguna solución que permita que una aplicación de Android use Wi-Fi para una dirección IP específica y la red móvil para todo lo demás? Tal vez esto se puede hacer a través del NDK?
En realidad se puede, pero solo desde Lollipop (API 21).
De la documentación de Android 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.
Por lo tanto, puede usar la clase NetworkRequest.Builder para crear un NetworkRequest que envíe la solicitud sobre un determinado tipo de transporte .
Usa la siguiente función:
NetworkRequest.Builder addTransportType(int transportType)
Para configurar los tipos de transporte ( WIFI , ETHERNET o CELLULAR por ejemplo) para sus solicitudes.
Esta podría ser una solución simple: configure WiFi como la interfaz preferida cada vez que necesite controlar el dispositivo, y configure la red móvil preferida justo después de terminar el trabajo. Hacer esto podría interrumpir las actividades concurrentes de Internet, pero recuerde que TCP y la mayoría de las aplicaciones permiten demoras hasta unos pocos segundos (o incluso más). La interrupción es insignificante si el trabajo de control de su dispositivo es esporádico y nunca requiere una espera prolongada.
Si la situación anterior no es el caso, haga lo contrario: configure WiFi como la interfaz preferida como predeterminada, y configure la red móvil preferida siempre que no tenga que controlar el dispositivo. Pero asegúrese de volver a la red móvil con frecuencia, por ejemplo, cada 3 segundos, para evitar el tiempo de espera de sus actividades de Internet.
Normalmente, Android destruye las redes que no son de preferencia de red. Una solución alternativa que puede utilizar es crear un AP a través de la aplicación móvil y dejar que el dispositivo se conecte a ella. De esta manera, el móvil puede mantener la conectividad a Internet y comunicarse con el dispositivo.
Consulte los siguientes enlaces para detalles de implementación:
Similar Preguntado antes como Habilitar simultáneamente la interfaz wifi y 3G en Android y la respuesta rápida fue NO.
Pero en realidad es posible e implementado en algún software como SuperDownload (ver stackexchange )
Ese software requiere root.
http://geeknizer.com/wp-content/uploads/2012/08/super-download-3g-wifi.jpg
La descarga de dos canales también se anuncia en un nuevo teléfono Android. (No puedo encontrar el enlace, utilizaron un nuevo término de marketing para WiFi + 3G usado juntos)
¿Existe alguna solución que permita que una aplicación de Android use Wi-Fi para una dirección IP específica y la red móvil para todo lo demás? Tal vez esto se puede hacer a través del NDK?
Posiblemente debido a que WiFi solo se necesita para la dirección local, podría hacer una manera de crear un controlador WiFi especial, pero eso tampoco sería sencillo.
Y profundizando en el software:
Esta característica es el enrutamiento de paquetes TCP / IP. Si sabes cómo implementar esto en Linux, estás medio hecho. Lo siguiente sería hacerlo funcionar en Android. Pero supongo que no se habilitaría para una aplicación que no sea del sistema, ya que sería una seguridad completa y fácil de explotar (por ejemplo, IP de servidor de banco sustituto)