:::: MENU ::::

TIP : Activer/Désactiver le point d’accès WiFi via un bouton

Dans le cadre de certains projets il est intéressant de pouvoir exécuter une action sur notre Raspberry via un simple bouton poussoir. Un exemple avec un point d’accès WiFi qu’on ne souhaiterai rendre accessible qu’à la demande pour collecter des données ou effectuer une opération d’administration sur un Raspberry « autonome ». On va voir rapidement avec un petit script Python que l’on peut effectuer ce genre de chose. Dans cet exemple mon besoin est de pouvoir activer uniquement mon point d’accès WiFi quand je souhaite collecter des données sur mon installation Raspberry.

Création du script

Sur une distribution Raspbian (Lite ou non) les outils Python sont déjà installés. On peut donc passer directement à la création du script.

A l’emplacement de votre choix, créer un nouveau fichier .py, dans mon cas /home/pi/WiFiButton.py.

nano /home/pi/WiFiButton.py
#!/usr/bin/python
import subprocess
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(24,GPIO.OUT)

while True:
    GPIO.wait_for_edge(18, GPIO.FALLING)
    p = subprocess.Popen(["sudo", "service", "hostapd", "status"], stdout=subprocess.PIPE)
    (hostapd_status, err) = p.communicate()

    if hostapd_status.find("running") != -1:
        subprocess.call(["sudo", "service", "hostapd", "stop"])
        GPIO.output(24,GPIO.LOW)
    else:
        subprocess.call(["sudo", "service", "hostapd", "start"])
        GPIO.output(24,GPIO.HIGH)

Ce script va vérifier l’état du GPIO18. Si un contact est fait entre le GPIO18 et la borne GROUND alors on vérifie l’état du daemon hostapd. Si l’état running  est renvoyé par la commande alors on stop le service, sinon on le start.

Une LED verte (sur le GPIO24) s’allume également à la suite de la commande start et s’éteint si c’est une commande stop. Ne pas oublier la résistance dans le montage pour la LED (ici 100 ohms).

Création du Daemon

Ce script doit « boucler » en permanence pour vérifier l’état de notre bouton. On va donc le transformer en daemon pour qu’il soit initié au démarrage et fonctionne en arrière plan.

Ajouter les droits d’exécution au script :

chmod a+x /home/pi/WiFiButton.py

Supprimer le démarrage automatique du daemon hostapd au boot afin que le fonctionnement soit uniquement manuel :

sudo update-rc.d -f hostapd remove

On crée un nouveau service :

sudo nano /lib/systemd/system/WiFiButton.service
[Unit]
Description=WiFi Button
After=multi-user.target
 
[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/WiFiButton.py
Restart=on-abort
 
[Install]
WantedBy=multi-user.target

On change les droits du fichier de service :

sudo chmod 644 /lib/systemd/system/WiFiButton.service

Enfin on recharge l’ensemble des daemons, on active le démarrage de notre nouveau service au démarrage et on lance le service.

sudo systemctl daemon-reload
sudo systemctl enable WiFiButton.service
sudo systemctl start WiFiButton.service

A propos de l'auteur :

Passionné par le monde informatique et ses applications dans la vie quotidienne. Chez moi sont hébergées deux RPi, l'une dédié multimédia, l'autre centre domotique. J'ai également conçu une solution de monitoring de chaufferie collective où notre chère carte fruité est le point central.


5 Comments

  • Répondre Ter |

    Bonjour.
    je suis assez novice en raspberry, mais ca va, je penses quand même comprendre un peu…
    je viens de suivre votre tuto sur le bouton pour le wifi, je l’ai fait chez moi, mais j’ai aucune réaction d’activation/désactivation du wifi de la raspberry. je n’ai juste pas désactivé d’office au démarrage de la pi.
    vous êtes le seul tuto que j’ai trouvé sur le sujet.
    je précise que je suis sur une raspberry b, mais le gpio est le même pour la première partie.
    que ce soit bien clair aussi, c’est bien un « bouton poussoir » que vous utilisez…

    • Répondre Manu |

      Bonjour,

      J’utilise effectivement un bouton poussoir, qui est fermé uniquement quand on reste appuyé dessus. Il n’a qu’une seule position « stable », ouverte.
      Le tuto ayant deux ans, il est possible que des modifications sur les versions de Raspbian plus récentes empêchent son bon fonctionnement.
      Que renvoi la commande sudo systemctl status WiFiButton.service ?

  • Répondre Jerome |

    Bonjour, même si ce tuto date , il me semble important de signifier que ces scripts comportent quelques failles de sécurité.
    1 – l’utilisation du « sudo service .. » devrait ce faire via un path de sécurité « sudo /usr/sbin/service … » de manière a éviter que une modification de la Variable d’environnement PATH puisse démarrer un faux script service malveillant en exécutant WiFiButton.py

    2 – bien pire ici, la ou les droits du service en lui même sont suffisant grâce a « sudo chmod 644 ..  » les droits du script WiFiButton.py eux sont une faille collosal : En effet par défaut un script créé dans /home/pi va hérité du own et grp $USER , soit « pi » avec au minimum les droits rw-rw-rw- , mais ensuite vous le rendez exécutable il obtient les droits rwxrwxrwx , le service lui est démarre en au reboot en tant que root il va donc exécuter le script WiFiButton.py en root, mais WiFiButton.py peut très bien être réécrit (même si service offre une certaine protection elle est contournable via la première fail) ce qui permet une élévation de droit à qui réécrit ce script: les droits en écriture sur ce fichier devraient donc être au moins restreint a own et tant que root

    c’est un minimum
    chown root /home/pi/WiFiButton.py
    chmod 761 /home/pi/WiFiButton.py

    • Répondre Manu |

      Merci pour ces précisions.
      Effectivement le tutoriel date un peu et l’aspect sécurité n’avait pas été priorisé à l’époque à sa juste valeur.

  • Répondre sergiodelaho |

    bonjour,
    je suis votre protocole pour creer un interrupteur wifi, et j ai eu les memes resultats que TER . J’ai donc poser la question du statut, et voila la reponse fournie ci dessous:
    Il semblerai qu’il y ai un probleme avec hostapd, et peut etre avec le fait que j ai changé le nom du fichier (WiFiBouton ?)
    Merci pour votre reponse si vous avez le temps. Serge

    ● WiFiBouton.service – WiFi Button
    Loaded: loaded (/lib/systemd/system/WiFiBouton.service; enabled; vendor prese
    Active: active (running) since Fri 2021-07-02 15:13:05 CEST; 5min ago
    Main PID: 525 (python)
    Tasks: 1 (limit: 721)
    CGroup: /system.slice/WiFiBouton.service
    └─525 /usr/bin/python /home/pi/WiFiBouton.py

    juil. 02 15:13:05 raspberrypi systemd[1]: Started WiFi Button.
    juil. 02 15:16:35 raspberrypi sudo[886]: root : TTY=unknown ; PWD=/ ; USER=r
    juil. 02 15:16:35 raspberrypi sudo[886]: pam_unix(sudo:session): session opened
    juil. 02 15:16:35 raspberrypi python[525]: Unit hostapd.service could not be fou
    juil. 02 15:16:35 raspberrypi sudo[886]: pam_unix(sudo:session): session closed
    juil. 02 15:16:35 raspberrypi sudo[891]: root : TTY=unknown ; PWD=/ ; USER=r
    juil. 02 15:16:35 raspberrypi sudo[891]: pam_unix(sudo:session): session opened
    juil. 02 15:16:39 raspberrypi python[525]: Failed to start hostapd.service: Unit
    juil. 02 15:16:39 raspberrypi sudo[891]: pam_unix(sudo:session): session closed
    ~
    lines 1-17/17 (END)

Laissez un commentaire