Serveur IoT Part I
← Accueil ← Nos Projets
VoLAB
Association VoRoBoTics
Date : 14/09/2017
Auteur : J.SORANZO
Relecteur :
Thème: Raspberry Pi, objet connectés, serveur
Projet Plateform IoT Serveur Part I
Problématique
Au VoLAB, Nous avons commencé à jouer, utiliser les ESP8266. Quand on utilise ce microcontrôleur on est rapidement confronté à la connexion WIFI. C'est un peu l'intérêt du bidule tout de même. Afin d'exploiter pleinement le potentiel de la bête, il est bon d'avoir un réseau WIFI actif et sur lequel on peut éventuellement intervenir.
Au départ, nous avons connecté nos ESP8266 sur le réseau du VoLAB mais... les ennuis ont vite montré le bout de leur nez et pour résoudre ce type de problèmes c'est pas vraiment évident. En effet, il est bien difficile de vérifier la connexion car elle est sans fil. Je m'explique quand c'est une connexion par câble et que cela ne fonctionne pas, on vérifie le câble point. Mais dans le cas d'un objet sans fil qui refuse de se connecter, difficile de dire si cela provient du SSID, du mot de passe, de l'objet en lui même, du point d'accès...
Au passage et pour information les SSID ne sont pas case sensitive sous Windows mais le sont sous Linux...
En bref, nous avions besoin d'un point d'accès indépendant du réseau du lab. Je me suis donc dit que cela pourrait être sympa de faire cela avec un Rapsberry Pi.
Mini cahier des charges
Le point d'accès WIFI doit fournir des IP aux objets en mode DHCP
Le point d'accès doit afficher en permanence les objets qui lui sont connecté ainsi que leurs adresses IP
Le point d'accès doit pouvoir être utilisé de manière autonome.
Le point d'accès doit être facilement déplaçable.
Le point d'accès doit servir de passerelle entre le réseau des objets et un autre réseau ayant accès à internet. Ce deuxième réseau pourra être câblé, un autre réseau WIFI ou via un modem téléphonique USB (via un téléphone portable par exemple). Ces 2 dernières options ne sont pas traitées dans cet article et feront l'objet d'une future version.
Solution technique proposée
La solution est composée d'un Raspberry Pi3 car il embarque directement un coupleur Wifi en plus de son connecteur réseau câble et d'un un écran tactile.
Tous deux approvisionnés chez Banggood, le pi aux alentours de 36€ et l'écran
L'écran TFT tactile 5 pouces 800x480 HDMI pour moins de 30€ fourni avec son stylet
Cet écran est fourni avec des colonnettes et surtout un tout petit circuit imprimé comportant 2 connecteurs HDMI
Lorsque le Rpi3 est vissé en dessous grâce aux colonnettes, les 2 connecteurs HDMI (celui du pi et celui de l'écran se retrouvent en vis à vis ce qui permet d'utilisé ce petit circuit de raccordement. Une idée brillante et simple. Pour la partie tactile l'écran utilise les GPIO du Pi (ce qui monopolise le connecteur – cela peut être gênant pour d'autres applications qui utiliseraient les GPIO).
En route...
Préparation de la distri
Suite à un crash en 2019, j'ai du réinstaller le système.
Aux vues des difficultés rencontrées avec la distribution "Buster", j'ai décidé de repasser sous Jessy.
Malheureusement, je n'avais pas fait de copie de la carte SD.
Outil utilisés: Win32DiskImager.exe
Connexion de l'écran
Je ne vous ferai pas l'affront ici de parler de la configuration initiale du Raspberry Pi (voir la rubrique webographie un peu plus bas).
Au départ, il convient de brancher un écran HDMI "classique". Nous avons opté au VoLAB pour un écran 17 pouces de PC avec une entrée DVI sur laquelle nous avons connecté un adaptateur passif DVI <=> HDMI.
Le fait d'avoir un autre écran sous la main permet de faire des essais croisés quand cela ne fonctionne pas et de revenir rapidement à une solution fonctionnelle préalablement testée.
Ce fut le cas, à la première connexion l'écran tactile resta blanc. Il convient d'intervenir dans le fichier config.txt (merci Pierre pour cette astuce). Ce dernier se trouve dans le dossier /boot (rappel ce dossier fait parti de la partition boot qui est formatée en FAT32 et est donc directement accessible depuis un PC sous Windows par exemple.)
La bonne config est :
hdmi_group=2 hdmi_mode=1 hdmi_mode=87 hdmi_cvt=800 480 60 6 0 0 0
Il convient de redémarrer le Pi pour que cette configuration soit prise en compte.
Mise à part ce point la configuration de l'écran ne pause pas de problème particulier.
Petite information complémentaire avant d'aller plus loin
Un serveur VNC (qui permet de prendre l'interface graphique du Pi sur un PC distant – à condition d'avoir un client VNC – exemple TightVNC) sous Jessy c'est Real VNC serveur qui est actif (enfin qui est activable dans l'écran de configuration).
Apparemment, TightVNC ne fonctionne plus (13/07/2019) avec les nouvelle version de Real VNC server, j'utilise donc VNC Viewer (testé avec la version 6.19.107 pour Windows)
Outre le fait d'être plus confortable pour travailler, cela permet de faire des copies d'écran.
S'il est si facile de prendre le contrôle de l'interface graphique du Pi à distance, quel est l’intérêt d'un écran tactile me direz-vous. Cela fait partie du cahier des charges : "Le point d'accès doit pouvoir être utilisé de manière autonome."
Calibration de la partie tactile
Autant la configuration de l'écran est relativement simple, autant la configuration de la partie tactile est beaucoup plus délicate.
Tout d'abord le produit est livré sans aucune documentation. Et rien sur le site Banggood ! Du moins au premier coup d’œil. Mais en insistant un peu, on fini par trouver.
Lorsqu'on suit le lien de la figure ci-dessus, on ne trouve pas le fameux driver mais un fichier Word docx !
On suit strictement cette procédure et cela ne fonctionne pas la calibration est impossible.
Lorsque l'écran de calibration apparaît impossible de cliquer sur les 4 points. Au mieux, j'ai réussi 3 points. Avec le fameux "miss clic detected" Grrrrrr ! Et retour au premier point. C'est terriblement frustrant !
Et puis en cherchant sur le net, on fini par trouver une nouvelle version du document sensiblement différente en ce qui concerne la partie calibration
Résultat : pas mieux. Mais ne nous découragerons-pas....
...Et puis en fouillant encore et encore le net, on trouve :
http://www.waveshare.com/wiki/5inch_HDMI_LCD
Bien sûr c'est en anglais. LE paragraphe intéressant est : « Touch screen calibration » qui propose une autre façon de faire.
Je met ici une copie d'écran au cas où le site viendrait à disparaitre.
Juste une petite chose en passant, il y a une faute de frappe dans :
/ect/X11/xorg.conf.d/99-calibration.conf
Regardez bien c'est facile;-)
Au final le fichier de configuration « 99-calibration.conf » (pour ce cas précis) on est bien d'accord :
Section "InputClass" identifier "calibration" MatchProduct "ADS7846 Touchscreen" Option "Calibration" "144 3924 167 3964" EndSection
Je ne prétends pas comprendre ce fichier, ni même qu'il fonctionnerait avec d'autres écrans mais ce qu'il y a de sur c'est que cela fini par fonctionner avec l'écran acheté chez Banggood.
Installation et configuration du point d'accès WIFI et du serveur DHCP
Distribution installée, écran configuré, touchScreen calibrer et pour le fun, j'ai ajouté un petit clavier sans fil mais vraiment pas très utile de chez Mamazone. Il ne reste plus qu'à passer à la partie serveur Wifi, DHCP et toutti quanti.
Là pas trop de surprise. Quoique... Mais c'est pour la fin...
J'ai donc fait une petite recherche sur le net dont je vous livre ici le résultat.
J'ai trouvé un certain nombre de site particulièrement bien écrits, détaillés et compréhensibles. Mais les sources sur le sujet ne manquent pas.
Cet article en français me parait bien
Il semble correspondre au besoin exprimé ci-dessus.
http://hardware-libre.fr/2014/02/raspberry-pi-creer-un-point-dacces-wifi/
Utilise:
- hostapd : la configuration à l'air toutchy
- dnsmasq : serveur DHCP
- iptables
Et celui-ci aussi
C'est ce tuto en particulier que j'ai suivi le 26 août 2017 (un petit repère temporel dans nos article, ça peut toujours servir...) car l'installation de isc-dhcp-server m'a paru plus simple et qu'il traite de la passerelle entre réseau filaire et réseau Wifi.
http://www.dericbourg.net/2015/07/04/utiliser-un-raspberry-pi-comme-point-dacces-wifi/
Utilise:
- isc-dhcp-server
- hostapd : est un deamon qui permet d'installer un point d'accès wifi sans fil
- iptables
- iptables-persitent
Sans oublié l'article Adafruit en pdf
https://learn.adafruit.com/setting-up-a-raspberry-pi-as-a-wifi-access-point?view=all
utilise:
- hostapd
- isc-dhcp-server
- iptables-persitent
Traite des aspect deamon et service et boot avec:
sudo update-rc.d hostapd enable
sudo update-rc.d isc-dhcp-server enable
Faire des tests au fur et à mesure
On peut tester le point d'accès WIFI simplement depuis un pc sous Windows ou sous Linux si déjà on voit le réseau qu'on a créé dans la liste des réseaux disponibles, c'est déjà bon signe. Ensuite on peut tester le fonctionnement du serveur DHCP (après son installation et sa configuration) en se connectant au réseau créé. Si on obtient une adresse ip c'est que tout va bien. Ensuite un petit ping sur l'adresse IP du Pi devrait bien se passer.
Mare du sudo
Une petite astuce en passant pour ne pas à avoir à taper sudo devant chaque commande, on peut faire :
sudo -s pour élever sa session vers admin.
Pour quitter ce mode admin ou root, faire : exit
Passerelle entre 2 réseaux
Il reste à créer une passerelle entre le réseau WIFI local des « robots » que nous venons de créer et un réseau local fourni par une box.
Là encore le net regorge de tuto sur le sujet. Et les liens présenté ci-dessus traitent également de cet aspect.
Aucune difficulté particulière la seule ombre au tableau est qu'on ne comprend pas vraiment ce qu'on fait. C'est donc un sujet qu'il me reste à approfondir.
net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
Même avec le man de la commande iptables c'est pas de la tarte à comprendre. Voilà ce qu'on peut en lire sur Wikipédia :
« iptables est un logiciel libre de l'espace utilisateur Linux grâce auquel l'administrateur système peut configurer les chaînes et règles dans le pare-feu en espace noyau »
Sur Ubuntu.fr
https://doc.ubuntu-fr.org/iptables
iptable -L -v donne la la liste des règles actuelles. D’ailleurs après les commandes du tuto ça donne ça :
root@VOR_iot_server:/home/pi# iptables -L -v Chain INPUT (policy ACCEPT 88765 packets, 6547K bytes) pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 6 packets, 320 bytes) pkts bytes target prot opt in out source destination 8785 9110K ACCEPT all -- eth0 wlan0 anywhere anywhere state RELATED,ESTABLISHED 6312 817K ACCEPT all -- wlan0 eth0 anywhere anywhere
Chain OUTPUT (policy ACCEPT 66519 packets, 11M bytes) pkts bytes target prot opt in out source destination
A quoi sert le state RELATED,ESTABLISHED ?
RELATED : signifiant que le paquet initie une nouvelle connexion, mais qu'il est associé avec une connexion existante, comme un transfert de données FTP ou une erreur ICMP ...
ESTABLISHED : signifiant que le paquet est associé à une connexion qui a déjà vu passer des paquets dans les deux sens
Pour tester la passerelle, on pourra par exemple connecter un PC sur le réseau WIFI délivrer par le Raspberry Pi (lui-même connecté à une box par son câble Ethernet) et essayer d'atteindre un site internet quelconque. J'ai une petite préférence pour www.volab.fr mais vous n'êtes pas obligé;-)
Route ou route
PC au réseau A (celui de la box), IoT réseau B et Rpi = passerelle
Pour atteindre un hôte dans le réseau B depuis le réseau A, il convient d'indiquer le chemin dans la machine du réseau A (le PC) pour cela sous cmd admin Windows
route print : permet de visualiser les routes
route add 192.168.51.0 mask 255.255.255.0 192.168.1.22
Si le pi est en 192.168.1.22 sur le réseau A
=========================================================================== Itinéraires actifs : Destination réseau Masque réseau Adr. passerelle Adr. interface Métrique 0.0.0.0 0.0.0.0 192.168.1.254 192.168.1.23 25 127.0.0.0 255.0.0.0 On-link 127.0.0.1 306 127.0.0.1 255.255.255.255 On-link 127.0.0.1 306 127.255.255.255 255.255.255.255 On-link 127.0.0.1 306 192.168.1.0 255.255.255.0 On-link 192.168.1.23 281 192.168.1.23 255.255.255.255 On-link 192.168.1.23 281 192.168.1.255 255.255.255.255 On-link 192.168.1.23 281 192.168.51.0 255.255.255.0 192.168.1.22 192.168.1.23 26 224.0.0.0 240.0.0.0 On-link 127.0.0.1 306 224.0.0.0 240.0.0.0 On-link 192.168.1.23 281 255.255.255.255 255.255.255.255 On-link 127.0.0.1 306 255.255.255.255 255.255.255.255 On-link 192.168.1.23 281 =========================================================================== Itinéraires persistants : Adresse réseau Masque réseau Adresse passerelle Métrique 192.168.51.0 255.255.255.0 192.168.1.22 1 ===========================================================================
Mesure de consommation
Outil: Pour mesurer la consommation du Raspberry pi et de son écran en fonctionnement, j'ai utilisé, un module USB qui s'interpose entre l’adaptateur secteur et son câble vendu chez Banggood :
Résultats : courant total inférieur à 1A. Aux environs de 600mA avec l'écran.
L'appli pour afficher les informations
Conception
Tout est configurer, tout fonctionne. Bon voyons comment afficher en permanence la liste des objets connectés.
J'ai décidé d'utiliser Python 3,4 et Tkinter comme module graphique. Cela m'a semblé la solution la plus légère. D'autres gestionnaires graphiques plus complets, plus puissants mais aussi plus lourds à mettre en œuvre étaient possibles. L'avantage de Tkinter est qu'il ne nécessite aucune installation et que pour l’ambition de cette application en particulier (afficher juste une liste d'adresses ip c'est amplement suffisant).
Récupérer la liste des adresses ip connectées est plutôt chose facile. Une boucle for de 1 à 255 si on donnait le sous réseau, ce qui est facile puisque la machine sur laquelle on va faire tourner cette boucle fait partie du sous réseau en question. Même pour moi qui ne suis pas un spécialiste des réseaux, ça reste compréhensible.
Par contre un point sur lequel, je bute encore est la possibilité de déterminer pour chaque adresse, le nom de la machine. J'ai tripatouillé nmap (on est dans un environnement Linux) dans tout les sens sans grand succès. J'ai parcouru de nombreux forum. Pourtant sous Windows Advanced ip scanner ou Angry IpScanner le font très bien. Dommage qu'ils n'existent pas sur Raspeberry Pi ! Ping -a ne fonctionne pas sous Raspian
Mes tests (version résumée)
iw dev wlan0 station dump nmap -sP 192.168.51.* sous python :: import socket socket.gethostbyaddr("8.8.8.8") nmap -oX scan.xml T4 -sP 192.168.51.150-200
La seule solution fonctionnelle que j'ai trouvée aujourd'hui est de copier le fichier de baux du serveur DHCP et de le parser :
lease 192.168.51.154 { starts 3 2017/09/27 16:59:51; ends 4 2017/09/28 00:59:51; cltt 3 2017/09/27 16:59:51; binding state active; next binding state free; rewind binding state free; hardware ethernet a0:20:a6:21:ca:39; client-hostname "ESP_21CA39"; }
Oh un ESP-8266 de connecté ! Mais que fait-il là ?;-)
Un petit ping histoire de voir si ça vie et on a une belle liste des machines connectées et qui réponde au ping.
Extrait de code :
with open("/home/pi/dhcp_leases.tmp", 'r') as f: adIp = 0 dico={} alive = False hostName = "unknow host name" for ligne in f.readlines(): if "lease" in ligne and "192" in ligne: addIp = ligne[6:-2] if "hardware ethernet" in ligne: macAdd = ligne[20:-2] if "client-hostname" in ligne: hostName = ligne[19:-3] dico[ addIp ] = [ macAdd, hostName, alive ] adIp = 0 hostName = "unknow host name" for k,v in dico.items(): if not os.system("ping -c 1 -w 1 "+k+" > /dev/null 2>&1"): v[2] = True
listIp = sorted(dico.items(), key=lambda t: t[0])
Un petit coup de Tk-inter par là dessus et ça donne ça :
Utilisation
uploader le fichier displayConnected.py au moyen d'une clé USB ou mieux par FTP. Cela donne l'occasion d'installé un serveur FTP sur le Pi.
J'ai choisi proftpd (apt install proftpd) sur https://raspberry-pi.fr/installer-serveur-ftp-raspberry-pi/
Aucune difficulté particulière si ce n'est que dans filezila il faut utiliser le protocole SFTP.
Pour lancer l'appli python3 displayConnected.py.
L'application affiche la liste des appareils connectés au serveur sur le réseau Wifi avec leur adresse IP, mac, leur nom quand c'est possible ainsi que le fait qu'il soit réellement connecté au moment du test.
2 case à cochées sont disponibles:
- History mode : mermet de ne pas effacer la liste à chaque refresh ( qui a lieu toutes les 15s)
- Display only IP that respond to ping : permet de n'afficher les adresses qui réponde au ping au moment du test
Outils complémentaires
VNC client : TightVNC viewer for Windows pour travailler confortablement à distance et pouvoir faire surtout des cop.col entre le PC et Raspberry pi
WinScp : pour pouvoir transférer des fichiers du pc de travail au Pi
Angry Ipscanner ou Advance IPScanner : histoire de voir les machine sur le réseau. A noter que Angry IP Scanner existe aussi sous Android et qu'il est open source.
Et bien entendu Notepad ++
Récapitulatif du matos utilisé
Matériel | Fournisseur | Prix indicatif* |
Raspberry Pi3 | Banggood | 32,75 € |
Ecran tactile | Banggood | 29,64 € |
Clavier | Amazone | 27,99 € |
Ampèremètre/voltmètre USB | Banggood | 3,34 € |
* Prix indicatif au 03/10/2017
Conclusion
Voici cette première partie terminée. Nous disposons maintenant d'un serveur sur lequel connecter nos objets.
Dans la partie II, nous verrons la création du boîtier très probablement à la découpe laser.
Dans la troisième partie, nous envisagerons la passerelle avec un autre réseau WIFI et/ou un modem usb ainsi que les autres possibilités tel que serveurs MQTT locaux et distants et autres joyeusetés...
CONSEIL: faire une copie de sauvegarde de votre carte SD grâce à la commande du Raspberry pi dans le menu accessoires.
Fichiers sources
Application pour afficher les postes connectés : displayConnectd.zip
Licence
Ce document est mis à disposition selon les termes de la Licence Creative Commons Attribution 4.0 International.
Paternité 'by' :L'œuvre peut être librement utilisée, à la condition de l'attribuer à l'auteur en citant son nom.
Note aux auteurs de documents du VoLAB, Vous avez la possibilité de changer de licence. Mais ce serait bien de rester libre et ouvert. Encore une fois ceci est une recommandation et pas une obligation.
webographie
http://fr.wikipedia.org/wiki/Licence_Creative_Commons
Raspberry Pi site officiel :
Download Raspbian Jessie from https://www.raspberrypi.org/downloads/raspbian/
Client VNC pour Windows :
Tight VNC : http://www.tightvnc.com/?f=va VNCviewer : [1]
WinScp : https://winscp.net/eng/docs/lang:fr
Angry IP Scanner : http://angryip.org/
Advenced IP Scanner : https://www.advanced-ip-scanner.com/fr/
Documentation très complète pour la mise en œuvre de l'écran Touuchscreen
http://wiki.52pi.com/index.php/5-Inch-800x480-HDMI-TFT-LCD-Touch-Screen_SKU:Z-0053
Bangoog : https://www.banggood.com/
A revoir :
http://www.magdiblog.fr/divers/creer-une-passerelle-securisee-avec-un-raspberry-pi/
Rédaction en langue française
Partant du constat de terrain qu'une énorme masse d'information concernant les sujets qui nous intéressent comme entre autres l'impression 3D n'étaient disponibles que dans la langue de Shakespeare et que de nombreuses personnes dans notre entourage ne maîtrisaient pas la dite langue et soucieux de diffuser encore plus l'information, nous avons pris le parti, au VoLAB, de rédiger nos documents de préférence en langue française.
VoLAB
Un mot sur le VoLAB. VoLAB est un fablab implanté à environ 30km au nord-ouest de Paris dans la commune de Vauréal dans l'agglomération de Cergy Pontoise. Il est animé par l'association VoRoBoTics.
Site internet www.vorobotics.com