Serveur IoT Part I

De VoWiki
Aller à la navigation Aller à la recherche

AccueilNos Projets

PlatfIoT VNC RPi firstScreen.JPG



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.


RPiLogo65px.png

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


PlatfIoT HMIplug.JPG

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:

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.

PlatfIoT BanggoodDriverDownloadLink.JPG

Lorsqu'on suit le lien de la figure ci-dessus, on ne trouve pas le fameux driver mais un fichier Word docx !

PlatfIoT touchTitreDocEtVersion.JPG

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

PlatfIoT touchTitreDocEtVersion v1.1.JPG

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.

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 :

PlatfIoT usbCourantMesure.JPG


Résultats : courant total inférieur à 1A. Aux environs de 600mA avec l'écran.

L'appli pour afficher les informations

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 :

PlatfIoT guiAppliAffIP.JPG

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

Fichiers sources

displayConnectd.zip

Licence

Ce document est mis à disposition selon les termes de la Licence Creative Commons Attribution 4.0 International.

CC88x31.jpgPaternité '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