Configuration WiFi automatique

Configuration WiFi automatique

À 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
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.

def get_current_ssid_win():
  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.

def get_wifi_password_win(ssid):
  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.

def get_current_ssid_macos():
  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
macOS vérifie l'authentification



def get_wifi_password_macos(ssid):
  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.

def get_current_ssid_linux():
    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

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.