Desarrollo y Depuración de Conexión por Cable en Android
Introducción
Para desarrollar funcionalidades relacionadas con conexiones por cable, es fundamental dominar los conocimientos básicos de las API y la escucha de transmisiones relevantes.
A partir de Android 13, el sistema expone una API de control para la conexión por cable, mientras que en versiones anteriores a Android 11 era necesario implementar interfaces de control manualmente.
Este artículo presenta los conocimientos básicos para el desarrollo de conexiones por cable en Android.
Desarrollo de Conexión por Cable
1. Control de Encendido/Apagado
// Control de encendido/apagado
NetworkManager ethernetManager = (NetworkManager)context.getSystemService(Context.NETWORK_SERVICE);
ethernetManager.setNetworkConnectionEnabled(isEnabled); // El parámetro true/false indica el estado
En versiones anteriores a Android 11, el sistema no expone API para controlar la conexión por cable, por lo que es necesario agregar interfaces de control manualmente en NetworkManager.
A partir de Android 13, el sistema expone API para controlar la conexión por cable, pero por defecto no registra el estado del interruptor, lo que requiere atributos personalizados para dicho registro.
2. Registros Relacionados
Las palabras clave para la conexión por cable son: eth Palabras clave en la capa superior: NetworkTracker, NetworkConnection, ServiceConectividad Palabras clave para asignación de IP: DHCP
Ejemplos de filtrado de registros:
logcat | grep -i "eth"
logcat | grep -iE "NetworkTracker|NetworkConnection|ServiceConectividad"
logcat | grep -iE "NetworkTracker|NetworkConnection|ServiceConectividad|eth"
Registros típicos cuando la conexión por cable se activa correctamente y obtiene IP automáticamente:
logcat | grep -iE "NetworkTracker|NetworkConnection|ServiceConectividad"
04-26 17:23:37.997 821 1038 I NetworkTracker: maybeTrackInterface: eth0 // Activación del nodo
04-26 17:23:38.191 821 1038 D NetworkConnectionFactory: updateInterfaceLinkState, iface: eth0, up: false
04-26 17:23:41.257 821 7570 I NetworkTracker: interfaceLinkStateChanged, iface: eth0, up: true // Nodo iniciado correctamente
04-26 17:23:41.307 1231 5322 D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=192.168.31.6 serverid=192.168.31.1 // IP asignada
04-26 17:23:41.335 821 1040 D ServiceConectividad: [113 ETHERNET] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTED
04-26 17:23:41.337 821 1040 D ServiceConectividad: Setting DNS servers for network 113 to [/192.168.31.1]
04-26 17:23:41.339 821 1040 D ServiceConectividad: Adding iface eth0 to network 113 // Registro de red correcto
Como se observa, la activación de la conexión por cable hasta la obtención automática de IP tarda aproximadamente 5 segundos, aunque a veces puede ser solo 1-2 segundso.
3. Transmisiones Relacionadas
Android no tiene transmisiones para cambios de conexión/desconexión de cable, pero se puede detectar mediante cambios en la IP: ConnectivityManager.CONNECTIVITY_ACTION: Transmisión para cambios de IP, válida tanto para WiFi como para conexión por cable String ETHERNET_STATE_CHANGE = "action.ebsw.eth.status.change"; // Transmisión personalizada de retorno de capa inferior después de cambios en la red cableada, esta es una devolución de llamada del sistema que monitorea los puertos IO.
4. Ejemplo Demo
La información básica mostrada después de activar la conexión por cable y obtener la IP:
Después de configurar IP estática y información de proxy, la pantalla muestra:
Descripción simple del demo de conexión por cable:
1. Android no tiene interruptor de estado para conexión por cable de forma nativa, se requieren atributos personalizados para recordar el estado; por defecto no se incluye un control switch.
2. El estado del interruptor de conexión por cable anteriormente se registraba usando Settings.Global.ethernet, mientras que en el AN3588 se utiliza una propiedad prop.
3. Configuración de IP estática: debe estar en la misma red que la IP obtenida automáticamente; la puerta de enlace generalmente se configura como X.X.X.1, un error en esta configuración impedirá el acceso a internet.
4. Configuración de proxy: el puerto tiene un rango válido: 1-65535, anteriormente se encontró que valores fuera de este rango en la configuración WiFi del puerto 311D2 causaban reinicio del sistema.
5. En algunas soluciones, es necesario activar y desactivar la conexión por cable una vez para que surtan efecto los cambios en IP estática o proxy.
6. El estado de conexión de la red cableada utiliza un paquete personalizado, solo es aplicable a sistemas específicos; su uso directo en otros sistemas probablemente causará fallos. Para otros sistemas, es necesario eliminar el código de verificación de conexión cableada y recompilar el APK.
El método de implementación subyacente para determinar la conexión cableada no se ha analizado en detalle, pero probablemente se basa en la detección de la conexión física del puerto IO.
5. Consideraciones Adicionales
Desarrollo y Depuración de Conexión por Cable en Android
A partir de Android 13, el sistema expone API para controlar la conexión por cable en NetworkManager, mientras que en versiones anteriores a Android 11 era necesario implementar interfaces de control manualmente.
Por defecto, el estado del interruptor de conexión por cable no se registra, requiriendo atributos personalizados para dicho registro.
Investigación del Interruptor de Conexión por Cable en Android 13
Comparación con el código de desarrollo propio del interruptor de conexión por cable en Android 9.
Configuración del Interruptor de Red Cableada en Android 9 y 11
Se descubrió que en Android 8 y posteriores, no hay API para el interruptor de red cableada, requiriendo la construcción de una ruta de control o implementación manual del control de encendido/apagado.
Esta modificación se puede completar en la capa Java de Framework:
Implementación de Conexión por Cable y WiFi Coexistentes en Android 13
Después de una adaptación adecuada en el Framework de Android, es posible tener tanto el puerto de red cableada como el WiFi activados simultáneamente.
Si hay conexión simultánea a WiFi y red cableada, el sistema prioriza y utiliza por defecto la red cableada, pero en la aplicación es posible controlar mediante código qué red utilizar para las solicitudes de red.
Análisis del Flujo de Puntuación en Conexión por Cable para Android 11
En Android, con red cableada y WiFi conectadas simultáneamente, es posible establecer prioridades y cambiar entre ellas dinámicamente.
A partir de Android 13, la lógica de puntuación es más compleja y oculta, actualmente no es configurable.