29 mai 2024

Une borne LANDrop avec un Raspberry PI

J’ai longtemps essayé d’utiliser des smartphones en classe, avec les élèves, pour documenter à l’aide photos ou de vidéos des expériences ou des projets. Le problème est toujours de récupérer les documents.

  • On n’a pas toujours de câbles à disposition
  • Le Wifi n’est pas disponible.
  • On ne peut pas demander aux élèves d’utiliser leur forfait 4G

L’idée était donc de créer une borne totalement autonome pour récupérer les fichiers des élèves, sans fils et sans connexion internet.

Je suis parti d’un Raspberry PI doté d’un petit écran et d’une version modifiée du logiciel LANDrop

La partie matérielle

Les différents éléments à imprimer en 3D.

Télécharger le fichier xml (BlocksCAD)Télécharger les anneaux (stl)Télécharger le boitier chargeur (stl)Télécharger tous les fichiers
Boitier completTélécharger le boitier(stl)Télécharger le couvercle(stl)Télécharger la plaquette(stl)

J’ai également ajouté un écran 3,5 pouce avec un petit ventilateur (le PI4B chauffe beaucoup).

La partie logicielle

La mise en œuvre :

Pour réaliser cette borne, je me suis largement inspiré des sites suivants :

Les étapes

Voici les grandes étapes de ce paramétrage :

Pour commencer, installer simplement la dernière version de PI OS : Un tuto parmi des centaines
Vérifiez bien que le démarrage se fait sans mots de passe d’ouverture de session.

sudo apt-get update
sudo apt-get upgrade

Préparation du système

Toute la configuration se fera par avec un câble RJ45. La carte réseau Wifi étant configuré pour fonctionner comme un HotSpot.

Pour désactiver le nommage étrange des interfaces réseaux, il suffit d’insérer la carte SD contenant votre PI OS fraîchement installée et d’éditer le fichier cmdline.txt pour ajouter l’option net.ifnames=0 (en début ou fin de ligne).

sudo mousepad /boot/cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 ....

Installation des dépendances

Nous allons avoir besoin des paquets suivants :

  • hostapd : gestion du point d’accès
  • dnsmasq : serveur DNS/DHCP léger
  • nginx : serveur web léger et rapide
sudo apt install -y hostapd dnsmasq nginx

DNSMASQ : DNS & DHCP

Commencez par éditer le fichier /etc/dhcpcd.conf : c’est ici que nous définissions l’adresse IP statique de notre framboise en rajoutant 4 lignes à la fin du fichier

sudo mousepad /etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.2.254/24
static routers=192.168.2.254
static domain_name_servers=8.8.8.8

Nous devons ensuite éditer le fichier /etc/dnsmasq.conf pour paramétrer notre serveur DNS (remplacer le contenu du fichier)

sudo mousepad /etc/dnsmasq.conf
log-facility=/var/log/dnsmasq.log
log-queries
# Never forward addresses in the non-routed address spaces.
bogus-priv

# Add other name servers here, with domain specs if they are for
# non-public domains.
server=/localnet/192.168.2.254

# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/localnet/

# Make all host names resolve to the Raspberry Pi's IP address
# address=/#/192.168.2.254 -> On laisse cette ligne commentée pour l'instant, sinon on coupe l'accès à internet

# If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.
interface=wlan0

# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
#     as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
#    domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=localnet

# Uncomment this to enable the integrated DHCP server, you need
# to supply the range of addresses available for lease and optionally
# a lease time. If you have more than one network, you will need to
# repeat this for each network on which you want to supply DHCP
# service.
dhcp-range=192.168.2.10,192.168.2.100,1h

# Override the default route supplied by dnsmasq, which assumes the
# router is the same machine as the one running dnsmasq.
dhcp-option=3,192.168.2.254

#DNS Server
dhcp-option=6,192.168.2.254

# Set the DHCP server to authoritative mode. In this mode it will barge in
# and take over the lease for any client which broadcasts on the network,
# whether it has a record of the lease or not. This avoids long timeouts
# when a machine wakes up on a new network. DO NOT enable this if there's
# the slightest chance that you might end up accidentally configuring a DHCP
# server for your campus/company accidentally. The ISC server uses
# the same option, and this URL provides more information:
# http://www.isc.org/files/auth.html
dhcp-authoritative

Il faut également modifier le fichier /etc/hosts

sudo mousepad /etc/host

et ajouter une ligne à la fin du fichier :

192.168.2.254     BorneLANDrop.localnet

redémarrer le serveur dnsmasq

sudo systemctl restart dnsmasq

hostapd

Nous pouvons à présent éditer le fichier /etc/hostapd/hostapd.conf : c’est lui qui va nous permettre de paramétrer notre point d’accès wifi (ssid, mot de passe etc.).

sudo mousepad /etc/hostapd/hostapd.conf
interface=wlan0
ssid=BorneLANDrop
hw_mode=g
channel=6
auth_algs=1
wmm_enabled=0

Il faut ensuite dire à hostapd quel fichier de configuration utiliser :

sudo mousepad /etc/default/hostapd
remplacer la ligne 
#DAEMON_CONF=""
par
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Pour éviter les conflits entre hostapd et wpa, il faut supprimer toute la configuration wifi spécifique présent dans le fichier /etc/wpa_supplicant/wpa_supplicant.conf :

sudo mousepad /etc/wpa_supplicant/wpa_supplicant.conf

Supprimez / commentez toutes les définitions de réseau wifi connu et ne laissez que le fichier de base :

country=FR
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

Il y a visiblement un problème récurent qui empêche hostpad de se lancer correctement au démarrage.
Ci-dessous une solution pour redémarrer hostapd après le lancement du bureau qui visiblement fonctionne…

sudo systemctl unmask hostapd
sudo systemctl enable hostapd

On crée un script pour redémarrer automatiquement hostapd
mousepad /home/pi/restart_mousepad.sh

Ajouter les lignes :
#!/bin/bash
service hostapd restart

Enregistrer et fermet mousepad

sudo chmod +x /home/pi/restart_mousepad.sh

On ajoute les droits pour le lancement du srcipt avec sudo sans mot de passe
sudo visudo

Ajouter la ligne :
pi ALL= NOPASSWD: /home/pi/restart_mousepad.sh

On va ensuite créer un raccourcis pour redémarrer hostapd quand le bureau se lance
mkdir /home/pi/.config/autostart
mousepad /home/pi/.config/autostart/hostapd.desktop

Ajouter les lignes :
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=hostapd
Comment=restart hostapd service
Exec=sudo lxterminal -e "/home/pi/restart_hostapd.sh"

Enregistrer et fermet mousepad

Nginx

Afin de servir du contenu local, j’utilise Nginx comme serveur web. Pour configurer Nginx :

sudo mousepad /etc/nginx/sites-available/BorneLANDrop.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/portail;
	    
    # For iOS
    if ($http_user_agent ~* (CaptiveNetworkSupport) ) {
        return 302 http://BorneLANDrop.localnet/ios.html;
    }
				    
    # For Android
    location /generate_204 {
       return 302 http://BorneLANDrop.localnet/android.html;
    }
    location ~* \.(apk)$ {
       default_type application/vnd.android.package-archive;
       add_header Content-Type application/vnd.android.package-archive;
       add_header Content-Disposition 'attachment';
    }

    # For others
    location / {
       return 302 http://BorneLANDrop.localnet/windows.html;
    }
}

server {
    listen 80;
    listen [::]:80;

    server_name BorneLANDrop.localnet;
    
    root /var/www/portail;
    
    index index.html;
    
    location / {
        try_files $uri $uri/ /index.html =404;
    }
}
# on active notre nouveau site
sudo ln -s /etc/nginx/sites-available/BorneLANDrop.conf /etc/nginx/sites-enabled/BorneLANDrop

# on désactive le site par défaut
sudo rm /etc/nginx/sites-enabled/default

Installation de LANDrop

Quelques instructions à suivre pour télécharger les sources du logiciel :

sudo apt install git qt5-qmake qtbase5-dev libsodium-dev
git clone https://github.com/du-man-net/BorneLANDrop.git

Mise en place de la partie web
vous allez ajouter dans le dossier /var/www la structure du site permettant aux usagers d’installer leur client LANDrop au moment de la connexion WIFI.

sudo mv -R BorneLANDrop/portail /var/www/ 

sudo wget -P /var/www/portail/ https://releases.landrop.app/LANDrop-flutter-latest-android.apk
sudo wget -P /var/www/portail/ https://releases.landrop.app/LANDrop-latest-win.zip

sudo chown pi:www-data -R /var/www/portail
sudo chmod 755 -R /var/www/portail

On peut redémarrer le serveur web nginx

sudo systemctl restart nginx

Compilation du logiciel LANDrop

mkdir -p BorneLANDrop/build
cd BorneLANDrop/build
qmake ../LANDrop
make -j$(nproc)
sudo make install

Vous pouvez ensuite lancer LANDrop pour voir si ça fonctionne :

landrop

Il faut maintenant faire en sorte que le logiciel démarre à l’ouverture de cession :

sudo mousepad /etc/xdg/lxsession/LXDE-pi/autostart
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@landrop

Un truc vraiment casse-pied, c’est :
la fenêtre qui s’affiche lorsqu’on insère une clef usb.
Pour la désactiver :

- Se connecter avec une souris.
- Ouvrir un gestionnaire de fichiers
- Cliquer sur Édition/Préférences/Gestion des supports amovibles
- Désélectionner "Afficher les options disponibles pour les supports amovibles quand ils ont inséré."

Configuration d’un petit écran 3,5 pouces

Pour voir si les transaction se passe bien, et pour rendre le projet un peu plus rigolo, j’ai ajouté un petit écran 480*320 pixels
Configuration des drivers :

cd ~
sudo git clone https://github.com/goodtft/LCD-show.git
sudo chmod -R 755 LCD-show
cd LCD-show/
sudo ./LCD35-show (redémarrage)
sudo ./rotate.sh 180 (redémarrage)

Calibrage de l’écran tactile :

cd LCD-show/
sudo dpkg -i -B xinput-calibrator_0.7.5-1_armhf.deb
Cliquez sur le bouton “Home” [Le bouton avec le Logo RPi] dans la barre des tâches, choisissez Préférences -> Calibrer l’écran tactile.

Si vous avez un problème et que vous voulez réactiver l’affichage HDMI :

cd LCD-show/
sudo ./LCD-hdmi 

Vous y êtes presque !!!

Pour terminer, on retourne modifier le fichier dnsmasq.conf :

sudo mousepad /etc/dnsmasq.conf

Décommentez la ligne suivante :

# address=/#/192.168.2.254 -> On laisse cette ligne commentée pour l'instant, sinon on coupe l'accès à internet
en
address=/#/192.168.2.254 

et on redémarre dnsmasq :

sudo systemctl restart dnsmasq

Comme indiqué, à partir du prochain démarrage, le Raspberry PI fonctionne comme une borne wifi autonome. L’accès à internet devient impossible même avec le câble RJJ45.
Il suffit de commenter la même ligne et de redémarrer dnsmasq (sudo service dnsmasq restart) pour retrouver l’accès à internet.