Integration continue sur ESP8266

De MediaWiki UOF
Aller à la navigation Aller à la recherche


Description du projet

Intégration continue avec Jenkins pour déployer un fichier binaire pour un ESP8266 qui va s'auto mettre à jour

Le but est de mettre à jour automatiquement une flotte d'ESP connectée en Wifi. Les ESP vont périodiquement scruter un répertoire pour voir si la version du binaire à changée. Si elle a changée, on la met à jour via OTA.

La compilation des sources .INO en binaire est assurée en intégration continue grâce à Jenkins. Le script Jenkins permet de :

  • Lorsqu'une modification est faites sur le dépôt GIT du sketch Arduino, Jenkins lance :

    • Rapatriement des sources .INO dans un environnement près pour la compilation [1] (une VM faite spécialement pour).

    • Compilation des sources pour en faire un binaire [2]

    • Renommage du binaire en rajoutant le numéro de version [3] extrait du dépôt Git.

    • Si le serveur de mise à jour n'existe pas, transfère les scripts PHP de gestion du déploiement.

    • Transfère du binaire sur le serveur de mise à jour [4]

Integration continue.png

Le fonctionnement client-serveur

Le client (l'objet connecté) va se connecter sur le serveur de façon cyclique pour vérifier si une mise à jour est à faire. Le serveur s'occupe de lui renvoyer un binaire.

La partie serveur peut être assurée dans n'import quelle langage de programmation, du moment qu'elle peut lire un flux http et son entête et renvoyer un binaire. j'ai utilisé du PHP sur un serveur Apache.

La mise à jour du client se fait via OTA (Over The Air). Il existe une bibliothèque gérant le service (coté client). Pour les NodeMCU, il s'agit de ESP8266httpUpdate.h.


Client

J'ai simplifier l'utilisation de la librairie ESP8266HTTPUpdateServer. Pour utiliser mon fichier OTA.h il faut simplement :

  • Dans le setup, rajouter OTA_setup();

  • Dans la loop, rajouter OTA_doUpdate();

Principe de fonctionnement :

  • Toutes les OTA_TimerInSecond secondes, le programme va vérifier qu'il y a une mise à jour sur le serveur.

  • Si une mise à jour existe, elle est téléchargée et installé et l'ESP reboot.

  • S'il n'y a pas de mise à jour, le serveur le dit et on ne fait rien.


Serveur

Un script permet de gérer les mises à jour des iOT. Il suffi de l'installer sur une serveur web et il s'occupe de la mise à jour du Firmware et du filesystem (si besoin), le contenu de la page web est généré à partir du fichier README.md du projet.

dépôt Git


Fonctionnement en HTTPS


Rappel sur le fonctionnement du HTTPS

Lorsqu'un navigateur se connecte à un site internet en https, le site internet doit lui fournir un certificat d'authenticité. Ce certificat est ensuite validé par une Authorités de Certification (un CA). Sans cette validation la conection ne peut pas se faire.

Chaque navigateur possède une longue liste de CA à jour. Cette liste est indispensable pour qu'une connexion sécurisée s'établisse entre un navigateur et un serveur.


HTTPS sur ESP8266

Dans le cas d'un ESP8266, le problème est qu'il n'a pas de navigateur ou de mécanisme mettant en place une liste de CA, il faut donc soit auto-valider le certificat avec un fingerprint, soit ajouter manuellement une liste de CA.

Voici une méthode pour construire une liste de CA, la sauver dans un fichier et la transférer dans un ESP8266. Pour que le fichier soit transférer dans l'ESP8266, on utilisera le FileSystem LittelFS. Il est probablement possible d'utiliser une carte SD FIXME.

Il existe un exemple de mise à jour via OTA en https sur le dépôt officiel de ESP8266/Arduino.httpUpdateSecure.ino. C'est cette version que j'ai mise en place.


Création de la liste des CA

We’ll need to generate a certificate store to flash to the device. The most common is to use Mozilla’s list of trusted root certificates. This can be done by executing the next Python script in the same folder of your project: certs-from-mozilla.py

To execute this Python script, you need 2 executables :

  • OpenSSL.exe (referenced by his path)

  • ar.exe (in the same directory than your Arduino sketch).

To add “OpenSSL.exe” to your path, you need to install Git (>2.34.1) (OpenSSL.exe is inside the git folder, in Git/usr/bin ) and then add the path to your environement system.

You can find “ar.exe”, with the ESP8266 core. Le fichier se trouve dans le répertoire esp8266-Arduino/esp8266com/esp8266/tools/windows/xtensa-lx106-elf/bin/ et se nomme xtensa-lx106-elf-ar.exe il suffi de le renommer en ar.exe et de le placer dans le répertoire du Sketch (avec le script Python).

Une fois le script Python exécuté, il va downloader les certificats dans un répertoire data. Pour le transférer dans l'ESP8266, il faut installer le pluggins LittleFS pour l'IDE Arduino (voir le dépôt officiel sur Github)


Installation du pluggins LittleFS pour l'IDE Arduino

  • Download the file uploader plugin for Arduino IDE. Go to this link and click on the ESP8266LittleFS-2.6.0.zip

  • Décompresser le zip dans un répertoire.

  • Déplacer le répertoire dans C:\Program Files (x86)\Arduino\tools/

  • Relancer l'IDE Arduino.

Il doit apparaitre un menu Outils > ESP8266 LKittleFS Data uploads. En cliquant dans ce menu, le contenu du répertoire data, s'il existe dans le répertoire du sketch .ino, est transféré dans l'ESP.


Installation de la librairie LittleFS

Ce File system s'install comme une librairie Arduino classique, en passant par le gestionnaire de bibliothèque. Gestionnaire de bibliothèque


Références


Liens Wiki