Inverser l’attache de plusieurs appareils Android via USB

J’essaie d’installer un environnement de test pour mon application Android où les périphériques séparés ont besoin d’une connexion Internet, mais n’ont pas de capacités sans fil.

J’ai donc décidé d’utiliser le mode de connexion inverse USB. Ma machine hôte exécute Ubuntu. J’ai déjà réussi à configurer le mode de connexion inverse pour un périphérique, la connexion fonctionne et je peux envoyer une requête ping à google.com à partir du shell adb de cet appareil.

Lorsque je connecte un deuxième périphérique, le premier partage de connexion ne fonctionne plus. Les deux appareils ont la même adresse IP configurée sur leur interface usb0 interne.

Voici ce que j’ai jusqu’à présent:

  1. Le transfert de port sur l’hôte est activé

    echo 1 > /proc/sys/net/ipv4/ip_forward 
  2. Règle Iptables sur l’hôte pour acheminer le trafic:

     iptables -t nat -A POSTROUTING -s 169.254.255.2/24 -j MASQUERADE 
  3. Plugin first device:

     ifconfig shows the device on usb0 @ ip 169.254.255.2/30 
  4. Sur le premier appareil (avec shell adb)

     > route add default gw 169.254.255.2 dev usb0 > setprop net.dns1 8.8.8.8 > ping google.com --> is giving results 
  5. Plugin second device

     ifconfig shows this device on usb1 @ ip 169.254.255.2/30 
  6. Sur deuxième appareil

     Add gw, set DNS like above 

Maintenant, le deuxième appareil peut faire un ping sur google.com, mais pas le premier.

Lorsque je change l’adresse IP interne ou les adresses IP atsortingbuées aux interfaces usb0, usb1 des hôtes, je ne parviens plus à me connecter aux périphériques via adb.

Je soupçonne que ce soit un problème de réseau, plutôt qu’un problème avec ADB? Des idées?

Après beaucoup de recherches sur Google et d’essais et d’erreurs, j’ai finalement trouvé la solution pour mon installation particulière.

Ce que j’ai fait à la fin, et ce que j’ai raté dans mes premières tentatives, était de placer chaque périphérique USB connecté dans un sous-réseau distinct (voir cette réponse sur serverfault ).

Pour le dire clairement, la configuration est maintenant comme suit:

  1. iptables contient la règle suivante

     iptables -t nat -A POSTROUTING -j MASQUERADE 
  2. l’interface usb0 et usb1 de l’hôte, maintenant dans des sous-réseaux séparés

     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 
  3. usb0 iface interne de l’appareil Android connecté sur usb0 de l’hôte:

     - usb0 169.254.0.2/20 - default gw 169.254.0.1 (so the host's usb0 iface) 
  4. usb0 interne iface d’appareil Android connecté sur usb1 de l’hôte:

     - usb0 169.254.16.2/20 - default gw 169.254.16.1 (so the host's usb1 iface) 

De cette façon, j’ai maintenant un access Internet (après le shell adb setprop net.dns1 8.8.8.8) de chaque appareil Android connecté aux interfaces USB sur mon hôte.

Vous avez besoin d’un système Linux avec un access root, un téléphone Android rooté et un câble USB.

Pas

  1. Installez adb et fastboot dans votre système Linux.

    sudo apt-get install android-tools-adb android-tools-fastboot

  2. Connectez votre téléphone Android à votre PC via USB et activez le partage de connexion USB à partir des parameters de votre téléphone.
  3. Ouvrez le terminal sur votre PC et tapez les commandes ci-dessous.
  4. Découvrez la nouvelle interface réseau créée sur votre PC.

    ifconfig

    En général, la nouvelle interface réseau sera usb0 ou usb1. Considérons usb0 .

  5. Faites maintenant une adresse IP statique pour cette nouvelle interface USB0.

    sudo ifconfig usb0 10.42.0.1 netmask 255.255.255.0

  6. Maintenant, faites de cette nouvelle interface usb0 une connexion partagée.

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

  7. Maintenant, apportez quelques modifications au pare-feu d’iptables.

    sudo iptables -t nat -F sudo iptables -t nat -A POSTROUTING -j MASQUERADE

  8. Maintenant, nous devons entrer des commandes dans le téléphone Android. Nous pouvons utiliser soit adb soit directement en tapant les commandes dans le téléphone Android via un émulateur de terminal installé sur le téléphone. J’utilise la méthode adb.

  9. Trouver l’interface réseau dans le téléphone Android.

    adb shell busybox ifconfig

    Le mien était rndis0 .

  10. Définissez l’adresse IP statique, le masque de réseau et la passerelle.

    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

  11. Vérifiez la connectivité Internet sur votre téléphone.

    adb shell ping 8.8.8.8

    S’il s’agit d’un ping, l’Internet sur votre mobile fonctionne.

Cette connexion Internet ne fonctionnera pas avec les applications comme opera mini et paytm, mais fonctionne bien avec WhatsApp.