Anclaje inverso de varios dispositivos Android a través de USB
Estoy intentando fijar un ambiente de prueba para mi androide app donde los dispositivos separados necesitan una conexión a Internet, pero no tienen capacidades sin hilos.
Así que decidí usar la conexión inversa usb. Mi máquina host está ejecutando Ubuntu. Ya he logrado configurar el anclaje inverso para un dispositivo, la conexión funciona y puedo hacer ping a google.com desde el shell de adb de este dispositivo.
- Dispositivo USB HID para Android
- Qué es SingleAdbInterface, CompositeAdbInterface y SingleBootLoaderInterface en android_winusb.inf
- No se puede depurar Android: este dispositivo no se puede iniciar. (Código 10)
- USB debugging - Problema con la instalación de controladores para Epson Moverio
- Cómo emular dispositivo de almacenamiento masivo en Emulador Genymotion
Cuando conecto un segundo dispositivo, el primer tethering deja de funcionar. Ambos dispositivos tienen la misma dirección IP configurada en su interfaz interna usb0.
Esto es lo que tengo hasta ahora:
-
El reenvío de puertos en el host está activado
echo 1 > /proc/sys/net/ipv4/ip_forward
-
Regla de Iptables en el host para enrutar tráfico:
iptables -t nat -A POSTROUTING -s 169.254.255.2/24 -j MASQUERADE
-
Plugin primer dispositivo:
ifconfig shows the device on usb0 @ ip 169.254.255.2/30
-
En el primer dispositivo (con shell de adb)
> route add default gw 169.254.255.2 dev usb0 > setprop net.dns1 8.8.8.8 > ping google.com --> is giving results
-
Plugin del segundo dispositivo
ifconfig shows this device on usb1 @ ip 169.254.255.2/30
-
En el segundo dispositivo
Add gw, set DNS like above
Ahora el segundo dispositivo puede hacer ping a google.com, pero el primero no.
Cuando cambio la IP interna o los IPs asignados a los anfitriones usb0, interfaces del usb1 no puedo conectar con los dispositivos vía adb más.
Sospecho que esto es un problema de red, en lugar de un problema con ADB? ¿Algunas ideas?
- ¿Por qué VirtualBox no detecta mi dispositivo Android?
- Android: Comunicación USB Android <-> Dispositivo externo
- Android: BroadcastReceiver cuando inserta / extrae el dispositivo USB en / desde un puerto USB
- Opciones de cámara externa de Android: superposición en la parte superior de la secuencia de vídeo, sin servidor intermediario / enrutador
- Comunicación USB entre Android (modo accesorio) y Windows PC (host)
- ¿Qué sucede después de que DTR / RTS sea enviado a una placa Arduino basada en FTDI?
- Android USB API: cambia entre carga y envío de datos
- Recepción de datos mediante dispositivo USB Host y FTDI
Después de un montón de google y ensayo y error finalmente encontré la solución para mi configuración particular.
Lo que hice al final, y lo que extrañé en mis primeros intentos, fue poner cada dispositivo USB conectado en una subred separada (vea esta respuesta en serverfault ).
Para decirlo claramente, la configuración es ahora como sigue:
-
Iptables contiene la siguiente regla
iptables -t nat -A POSTROUTING -j MASQUERADE
-
La interfaz del usb0 y del usb1 del anfitrión, ahora en subnets separados
usb0: inet addr:169.254.0.1 Bcast:169.254.15.255 Mask:255.255.240.0 usb1: inet addr:169.254.16.1 Bcast:169.254.31.255 Mask:255.255.240.0
-
Usb0 interno iface del dispositivo androide conectado en usb0 del anfitrión:
- usb0 169.254.0.2/20 - default gw 169.254.0.1 (so the host's usb0 iface)
-
Interna usb0 iface del dispositivo Android conectado en host usb1:
- usb0 169.254.16.2/20 - default gw 169.254.16.1 (so the host's usb1 iface)
De esa manera ahora tengo acceso a Internet (después de shell de adb setprop net.dns1 8.8.8.8) de cada dispositivo android conectado a las interfaces usb en mi host.
Usted necesita un sistema linux con acceso root, enraizado teléfono androide y cable usb.
Pasos
-
Instale adb y fastboot en su sistema linux.
sudo apt-get install android-tools-adb android-tools-fastboot
- Conecta tu teléfono Android a tu PC a través de USB y habilita el tethering USB desde la configuración de tu teléfono.
- Abra el terminal en su PC y escriba los comandos que se indican a continuación.
-
Descubre la nueva interfaz de red que se creó en tu PC.
ifconfig
Generalmente la nueva interfaz de red será usb0 o usb1. Consideremos usb0 .
-
Ahora haga una dirección IP estática para esta nueva interfaz usb0.
sudo ifconfig usb0 10.42.0.1 netmask 255.255.255.0
-
Ahora haga esta nueva interfaz usb0 como conexión compartida.
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
-
Ahora haga algunos cambios en el firewall de iptables.
sudo iptables -t nat -F sudo iptables -t nat -A POSTROUTING -j MASQUERADE
-
Ahora tenemos que introducir algunos comandos en el teléfono Android. Podemos usar cualquiera de adb o directamente escribiendo los comandos en el teléfono android a través de un emulador de terminal instalado en el teléfono. Estoy utilizando la forma adb.
-
Encuentra la interfaz de red en el teléfono Android.
adb shell busybox ifconfig
La mía fue rndis0 .
-
Establezca la IP estática, la máscara de red y la puerta de enlace.
adb shell ifconfig rndis0 10.42.0.2 netmask 255.255.255.0 adb shell route add default gw 10.42.0.1 dev rndis0
-
Verifique la conectividad de Internet en su teléfono.
adb shell ping 8.8.8.8
Si está haciendo ping, entonces el Internet en su móvil está trabajando.
Esta conexión a Internet no funciona con las aplicaciones como opera mini y paytm, pero funciona bien con whatsapp.
- Notificaciones de empuje basadas en ubicación para Android
- La aplicación se bloquea al agregar un ImageView