web-dev-qa-db-fra.com

Comment configurer une connexion Wifi-Direct entre Android et Linux

Je souhaite connecter deux appareils via Wifi-Direct . L’un est un ordinateur sous Linux (lors de mon test, j’utilise Linux Mint 17.2), l’autre est un smartphone Android (Samsung Galaxy S3 avec Android 4.3. Non enraciné et ne veux pas enraciner).

Après avoir lu plusieurs guides sur Internet, j’ai décidé d’utiliser wpa_supplicant sous Linux et de créer une application pour Android . C’est l’un des meilleurs guides que j’ai trouvé pour wpa_supplicant: http: // processeurs. wiki.ti.com/index.php/OMAP_Wireless_Connectivity_NLCP_WiFi_Direct_Configuration_Scripts#p2p_group_add

Lorsque je lance iw list, je constate que les "modes d'interface pris en charge:" autorisent P2P_client et P2P_GO . Mon fichier wpa_supplicant.conf contient:

ctrl_interface=/var/run/wpa_supplicant
update_config=1 

ap_scan=1
device_name=My-pc
device_type=1-0050F204-1
driver_param=use_p2p_group_interface=1

p2p_go_intent=15
p2p_go_ht40=1

L'application est très similaire à cet exemple (extrait d'un livre) http://kurser.iha.dk/eit/itsmap/basic/MEIER/Professional%20Android%204%20All%20downloads/9781118102275%20PA4AD/Code% 20Snippets/Chapitre% 2016/PA4AD_Ch16_WiFiDirect/src/com/paad/wifidirect/WiFiDirectActivity.Java (J'ai supprimé toute la "partie socket").

Cela fonctionne comme prévu. Lorsque je l'essaie avec deux appareils Android, ils peuvent se voir et se connecter (l'icône Wi-Fi apparaît).

Maintenant, j'essaie de connecter Android et Linux, mais je suppose que je ne comprends pas vraiment comment wpa_supplicant fonctionne ... J'ai aussi vu cette question qui est très similaire à celle que j'ai posée, mais cela ne répond pas vraiment à mes doutes. .. Communication Wi-Fi directe entre un smartphone Android et d'autres appareils

Mon problème est que je ne comprends pas comment faire la poignée de main entre les deux appareils et comment configurer le réseau.

Wpa_supplicant est mon problème. Je cours:

Sudo wpa_supplicant -wlan0 -Dnl80211 -c/etc/wpa_supplicant.conf
Sudo wpa_cli

Mais j’ai eu beaucoup de problèmes: - Le device_name (et d’autres paramètres) n’étaient pas définis comme je le spécifie dans le fichier .conf .__- wpa_supplicant continue d’essayer de se connecter à tous les réseaux - p2p_find était vraiment lent ...

donc je suis allé dans/usr/share/dbus-1/system-services et ai éloigné les deux fichiers

fi.epitest.hostap.WPASupplicant.service
fi.w1.wpa_supplicant1.service

Maintenant je peux

Sudo killall wpa_supplicant

et il meurt vraiment, me déconnectant du Wifi sans reconnecter la seconde qui suit . Je peux maintenant lancer wpa_supplicant et les trois problèmes sont résolus.

Je vais dans wpa_cli, lance "p2p_find" et, en même temps, j'autorise la recherche depuis l'application.

Android et Linux peuvent maintenant se voir.

P2P-DEVICE-FOUND 00:11:22:44:88:ff p2p_dev_addr=00:11:22:44:88:ff
pri_dev_type=10-0050F204-5 name='GT-I9300' config_methods=0x188
dev_capab=0x24 group_capab=0x0 vendor_elems=1 new=0

Avec "p2p_peers" je peux voir le téléphone portable MAC.

> aa:bb:cc:dd:ee:ff

Ici, je ne peux pas y aller. J'ai essayé diverses possibilités, mais aucune d'entre elles n'a fonctionné. Mon objectif est d'avoir Linux comme propriétaire du groupe.

  • Question 1.1: Quelle est la bonne façon de négocier les deux appareils?
  • Question 1.2: Quand j'essaye de p2p_connect, il y a souvent "Une erreur de Michael MIC détectée" entre les résultats, qu'est-ce que cela signifie dans ce concours?
  • Question 1.3: Android tente actuellement de se connecter à la PBC. Il y a un moyen de se connecter avec un code PIN?

Voyant que je ne pouvais pas connecter Android/Linux, j’ai essayé de pratiquer un peu avec Linux/Linux (Linux Mint en tant que GO, Ubuntu en tant que client), en suivant des exemples d’Internet comme ceux du premier lien nombre de problèmes, même ici.

À la menthe j'essaie

p2p_connect MAC_UBUNTU pin auth

dans Ubuntu j'essaie

p2p_connect MAC_MINT PIN_GENERATED_BY_MINT

Lorsque j'écris psp_connect dans Mint, il crée une nouvelle interface p2p_wlan0 _0 et renvoie

P2P-DEVICE-LOST p2p_dev_addr=MAC_UBUNTU

alors le p2p_connect lancé depuis Ubuntu échoue.

  • Question 2.1 Pourquoi change-t-il d’interface lors de la création du groupe?
  • Question 2.2 Quelle est la bonne façon de gérer ce changement? Après le changement, je ne peux plus p2p_find Ubuntu (je dois attendre quelque temps ou tout redémarrer)
  • Question 2.3 Ubuntu devrait-il changer d’interface?
  • Question 2.3 Dans la nouvelle interface, je devrais définir l'adresse IP d'Ubuntu et de Mint ... Comment dois-je procéder avec les adresses IP statiques?
  • Question 2.4 Si je veux configurer par exemple un serveur et un client DHCP?

  • Question 1.4 Et avec Android (client)/Linux (GO)?

11
Kida

J'ai beaucoup travaillé sur ce problème et voici les réponses que j'ai trouvées:

Je voulais Linux comme GO et Android comme client. Ce qui a donc fonctionné pour moi sous Linux, c’est:

// Kill current supplicant and avoid its automatic recreation
system("mv /usr/share/dbus-1/system-services/fi.* .");
system("killall udhcpd");
system("wpa_cli -i wlan0 terminate -B");
usleep(300000);

// Start new supplicant
system("wpa_supplicant -Dnl80211 -iwlan0 -c /etc/p2p_supplicant.conf -B");
system("wpa_cli -iwlan0 p2p_group_add");
system("ifconfig p2p-wlan0-0 192.168.1.2");

// Connect with a peer
for (;;) {
  system("wpa_cli -ip2p-wlan0-0 wps_pbc");
  system("udhcpd /etc/udhcpd.conf");
  // Here start your TCP server on a port
  Server server([port]);
  server.startServer();
}

N.B. Pour détruire la connexion P2P et redémarrer la connexion normale, j'utilise ce script:

#!/bin/bash
wpa_cli -i wlan0 terminate -B
wpa_cli -i p2p-wlan0-0 terminate -B
cp ./fi.* /usr/share/dbus-1/system-services/
service network-manager restart

Ici, le serveur écoute une connexion et le client Android s'y connecte. J'ai utilisé un serveur très facile TCP présent sur le premier site Web et cela a fonctionné comme un charme . Il est important de démarrer udhcpd sinon vous n'obtiendrez pas l'icône "connecté" dans Android . Pour. Du côté Android, j'ai suivi ce que j'ai vu sur http://developer.Android.com/training/connect-devices-wirelessly/wifi-direct.html et cela a parfaitement fonctionné.

  • Réponse 1.2 Depuis wpa_cli, vous pouvez obtenir de nombreux avertissements et erreurs différents. J'ai vu que le simple fait d'appeler la fonction (comme je l'avais fait dans l'extrait précédent) a permis de tout faire fonctionner malgré les avertissements. Je les ai ignorés.

  • Réponse 1.3 La connexion utilisant PIN fonctionne. Lorsque je l'ai essayée, je ne démarrais pas udhcpd et la connexion a été bloquée à chaque fois. Ce n'était pas dû à PIN ou à la PBC.

  • Réponse 2.1 Le serveur et le client sont en train de changer d’interface .. C'est un comportement très similaire à ce que vous faites habituellement avec les sockets. Vous créez un socket en écoute, une personne se connecte, vous créez un nouveau socket pour gérer ce client dans un thread séparé alors que le socket en écoute est toujours là, en attente d'autres utilisateurs . Vous faites la même chose avec les interfaces. Le démarrage d'un wpa_cli qui surveille l'interface wlan0 et d'un autre qui surveille l'interface p2p-wlan0-0 donne une bonne idée de ce qui se passe pendant le changement.

  • Réponse 2.2 Le client est "allé" à l'autre interface et est maintenant prêt à recevoir une adresse IP. Démarrez les serveurs DHCP et TCP!

  • Réponse 2.3 N'utilisez pas d'adresse IP statique. Ok que pour le serveur, le client doit utiliser une adresse IP DHCP. Peut-être y at-il un moyen de gérer les adresses IP statiques, mais cela n’était pas utile pour mes objectifs.

  • Réponse 2.4 Fait. C'était le problème depuis le début

  • Réponse 1.4 Cela fonctionne parfaitement même avec Android/Linux.

Désolé si j'ai commis une erreur dans ma réponse, je ne comprends toujours pas tout des connexions WiFi-Direct, j'espère simplement que cela pourra aider quelqu'un d'autre.

3
Kida

Avez-vous simplement essayé d'activer votre option de point d'accès sur Android? Ensuite, connectez-vous avec l'appareil Ubuntu, vérifiez l'adresse IP connectée sur les options du point d'accès Android et attribuez-la à votre application .

0
GabyGab

(Peut ne pas être une réponse complète, mais la bonne direction)

Le problème est du côté de Linux. Je rencontre des problèmes similaires entre CyanogenMod (Android 5) et Fedora 22, qui tentent d’utiliser Wifi Direct (Wifi P2P) pour le logiciel d’affichage sans fil d’Intel pour Linux (WDS).

En particulier, le connecteur d'Intel a divergé (écrit à partir de zéro) en 2009 de ce qui était la norme sous Linux, NetworkManager. Connman semble être la seule implémentation de Wifi Direct (Wifi P2P) pour Linux et a été écrit pour le marché des systèmes embarqués (mobiles).

En raison d'un problème de RPM, connman n'a pas encore été testé sur mon système, mais le logiciel doit fournir les communications dbus nécessaires à Linux.

Site Web: https://01.org/connman

0
Anon