Je cherche à appliquer les bonnes pratiques de gestion de la mémoire et du stockage.
Je m'explique:
Je possède un ESP8266-12F avec 4mo de flash sur lequel je fais tourner un Serveur WEB (HTML, CSS, JS) pour la gestion au quotidien, un captive portal pour le paramétrage du Wifi et un système WebOTA pour les mises à jour du module
J'arrive à stocker mes fichiers sources, les lire et confirmer leur présence grâce à LittleFS.
tout fonctionne à merveille.
Toutefois, je cherche à observer la bonne méthodologie dès le début et de la manière la plus pérenne possible quant à l'avenir de mes projets et des mises à jour pour les évolutions de code.
Ma question est:
Est-il préférable de générer le bin du FileSystem pour l'injecter dans l'ESP (dès la conception ou en update via WebOTA) ou de générer l'écriture des fichiers via le code C++ en définissant des String Litteral qui seront enregistrées sous forme de fichier (index.html, style.css...) au boot si la situation l'impose.
Si le côté pratique et pérenne à son importance, la gestion de l'espace mémoire n'est pas à négliger.
Et pour celà, je souhaite alimenter mon moulin grâce à vos connaissances / compétences en la matière.
Donc pour synthétiser mon interrogation concernant la mise en place d'un Serveur Web, je vois 2 possibilités:
Enregistrement des fichiers web en dur dans le FFS (index.html, style.css, script.js...)
Vérification au boot de la présence des fichiers nécessaires et, sinon, les créer en y inscrivant le contenu de String Literral définies à cet effet dans le code C++.
Quelle serait la meilleure option en terme de gestion mémoire?
Si vous les avez dans le code C++ en PROGMEM, elles sont stockées en mémoire flash, pas besoin de les convertir au boot en fichiers. Accédez simplement aux données (sur ESP8266 il faut PROGMEM, sur ESP32 les const char* sont directement en mémoire flash)
Le modèle mémoire des ESP fait que la mémoire flash est mappée dans l’espace d’adressage à côté de la RAM et donc c’est transparent en terme d’accès
Si vous voulez mettre à jour les pages web, il faudra uploader un nouveau code en OTA.
Si vous passez par des fichiers, et que vous avez un serveur web dispo, vous pourriez avoir dans votre code C++ un truc qui va interroger le serveur pour voir s’il y a des mises à jour des fichiers et si oui les télécharger.
Dans tous les cas, n’encombrez pas deux fois la mémoire flash avec les mêmes données
Après tests, je passe donc par le stockage de fichier en flash. Pas de différence constatée au niveau des temps de chargement.
Toutefois, le but étant à terme de mettre au point une librairie la plus légère possible et réutilisable, cela implique de charger les fichiers nécessaires dans la flash à chaque projet.
Je pense donc revoir ma copie afin de passer via PROGMEM pour mes fichiers HTML JS et CSS.
Le but de cette librairie est de mettre en place un portail captif permettant le paramétrage de la connexion wifi, et une page de mise à jour WebOTA.
Inclue dans chaque projet, je pourrais alors me concentrer sur la fonctionnalité principale du projet.
effectivement, je connais cette librairie pour l'avoir utilisé plusieurs fois.
Toutefois, je n'arrive pas à mes fins avec elle. Je me suis retrouvé face à un mur lorsque j'ai voulu faire une démo de présentation:
Une fois connecté à un réseau wifi, je suis incapable de faire effacer les identifiants Wifi mémorisés par WiFiManager.
Un sketch tout simple, je l'upload sur mon EPS8266 et je me connecte au CaptivePortal pour paramétrer la connexion wifi avec ma Box.
Jusque là, elle tient ses promesses.
Ensuite, comme précisé dans les commentaires, il suffit de décommenter wfifManager.resetSettings(); pour effacer toutes les informations stockées.
J'upload mon sketch de nouveau et là: boom! Il se reconnecte à ma box!
Ce n'est pas ce qui est prévu, je devrais être revenu en mode AP, mais ce n'est pas le cas.
J'ai épluché pas mal de forums à ce sujet, et il y a de la discussion avec des propositions complètement farfelues, mais désemparé, je les ai quand même testées. Sans succès bien entendu...
Si une bonne âme ici aurait une solution à ce problème. Sinon je rebasculerai sur l'écriture de mon propre CaptivePortal.
En ce qui concerne le chargemenent de fichiers ressources statiques (html, css, js, favicon, ...) en PROGMEM, j'avais fait un truc que l'on peut voir ICI
Les fichiers ressources sont simplement déposés dans le répertoire /webfiles/
Un programme webfiles.py à exécuter localement sur le PC, scrute tous les fichiers présents dans /webfiles/ et regénère la bibliothèque WiFiTerm_webfiles (fichiers .h et .cpp).
Celle-ci contient tous les fichiers chargés en constantes PROGMEM, et ajoute automatiquement les endpoints au webserver qui doit exister par ailleurs dans le programme principal ESP.
A l'usage c'était assez pratique.
Quand je modifiais un css, j'avais juste à exécuter le programme python avant de recompiler le programme ESP et le téléverser vers sa cible (en OTA ou pas).
Une amélioration probablement judicieuse serait d'ajouter une étape de minification des fichiers source.