À chaque fois qu'on a un nouvel appareil WiFi à installer, la première étape est de configurer les paramètres de connexion. Et souvent, la partie la plus longue est de retrouver et taper le mot de passe du point d'accès WiFi. Nous avons amélioré l'utilitaire que nous vous avions présenté il y a quelques semaines pour automatiser cette étape.
L'objectif est d'ajouter un bouton qui récupère les paramètres WiFi (SSID et mot de passe) utilisés par l'ordinateur pour ensuite les appliquer au YoctoHub-Wireless-n. Évidemment, cela ne fonctionne que si l'ordinateur possède une carte réseau et est actuellement connecté au réseau WiFi, mais c'est probablement une majorité des cas.
Nous avons donc ajouté un bouton "Use computer settings" qui sélectionne le réseau utilisé par l'ordinateur et qui remplit automatiquement le mot de passe. Il suffit d'appuyer sur "connect" et le YoctoHub-Wireless-n sera automatiquement connecté sur le même réseau.
Le nouveau bouton Use computer settings
Si l'ordinateur ne possède pas de carte réseau WiFi, ce bouton est désactivé. Notez qu'il faut l'exécuter avec les droits administrateur pour que l'utilitaire puisse récupérer les mots de passes WiFi.
Obtenir les paramètres WiFi
La méthode pour obtenir les paramètres WiFi est différente pour les trois OS (Windows, macOS et Linux), mais dans tous les cas il faut que l'application ait les droits administrateur.
Sous Windows
Sous Windows, la solution est d'utiliser netsh.
La commande "netsh wlan show profile" permet d'obtenir la liste des réseaux WiFi enregistrés. Il ne reste qu'à parcourir la liste pour obtenir le réseau utilisé actuellement.
try:
result = subprocess.run(
["netsh", "wlan", "show", "profile"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
check=True
)
lines = result.stdout.strip().split("\n")
for line in lines:
if "All User Profile" in line:
return line.split(":")[1].strip()
except subprocess.CalledProcessError:
return None
return None
Pour obtenir le mot de passe d'un réseau il faut utiliser la commande "netsh wlan show profile" en ajoutant l'option "key=clear" pour afficher le mot de passe en clair.
result = subprocess.run(
["netsh", "wlan", "show", "profile", f"name={ssid}", "key=clear"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
check=True
)
for line in result.stdout.splitlines():
if "Key Content" in line:
return line.split(":")[1].strip()
return None
Sous macOS
Sous macOS, la commande "networksetup -getairportnetwork" permet d'obtenir le SSID du réseau utilisé par le Mac.
result = subprocess.run(
["networksetup", "-getairportnetwork", "en0"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
check=True
)
output = result.stdout.strip()
if "Current WiFi Network" in output:
ssid = output.split(": ")[1]
return ssid
return None
Pour le mot de passe il faut utiliser la commande "security find-generic-password" qui permet de retrouver les mots de passe enregistrés par l'OS. Contrairement à Windows, cette commande va afficher un Pop-up qui demandera de nouveau à l’utilisateur de s'authentifier avant d'afficher le mot de passe.
macOS vérifie l'authentification
try:
result = subprocess.run(
["security", "find-generic-password", "-D", "AirPort network password",
"-a", ssid, "-w"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
check=True
)
password = result.stdout.strip()
return password
except subprocess.CalledProcessError as e:
return None
Sous Linux
Sous Linux, comme bien souvent, les choses sont un peu plus compliquées. En fonction des distributions et des versions du kernel, il existe plusieurs manières de récupérer le SSID du réseau courant. La manière la plus répandue est d'utiliser nmcli.
result = subprocess.run(
["nmcli", "-t", "-f", "ACTIVE,SSID", "dev", "wifi"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
check=True
)
lines = result.stdout.strip().split("\n")
for line in lines:
if line.startswith("yes:"):
return line.split(":")[1]
return None
Il n'est pas possible d'obtenir le mot de passe en clair sous Linux. Linux ne stocke pas le mot de passe, mais uniquement un hash du mot de passe.
Conclusion
Nous avons aussi profité de l'occasion pour améliorer légèrement l'interface de notre utilitaire en ajoutant une scrollbar pour la liste des réseaux détectés. Ce petit utilitaire est désormais un peu plus facile à utiliser, et vous avez une implémentation de référence si vous voulez ajouter cette fonctionnalité à votre application.
Comme d'habitude le code source est disponible sur GitHub: https://github.com/yoctopuce-examples/wifi-configurator