Table des matières:

Configurer un serveur de mise à jour automatique ESP8266 : 7 étapes
Configurer un serveur de mise à jour automatique ESP8266 : 7 étapes

Vidéo: Configurer un serveur de mise à jour automatique ESP8266 : 7 étapes

Vidéo: Configurer un serveur de mise à jour automatique ESP8266 : 7 étapes
Vidéo: B-03 NODEMCU (ESP8266) en Français: Créer un serveur Web 2024, Novembre
Anonim
Configurer un serveur de mise à jour automatique ESP8266
Configurer un serveur de mise à jour automatique ESP8266

De nombreuses personnes utilisent maintenant l'ESP8266 sous ses nombreuses formes (ESP-01S, Wemos D1, NodeMCU, Sonoff, etc.) pour les systèmes domotiques. Si vous écrivez votre propre code (comme je le fais), la mise à jour de chacun d'eux séparément, même via OTA (over the air), devient un peu fastidieux.

Mon propre système, par exemple, a 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV et un NodeMCU qui partagent une base de code commune, donc c'est 33 appareils en tout à mettre à jour quand je fais un simple code monnaie.

Mais il existe un moyen plus simple: un "serveur de mise à jour". L'excellent noyau Arduino IDE + ESP8266 possède une bibliothèque pour faire la plupart du travail (ESP8266httpUpdate), mais vous devez savoir comment configurer votre propre serveur pour le faire fonctionner.

Ce Instructable vous montre comment utiliser un serveur NODE-RED, mais la même logique s'applique à toute technologie de serveur de votre choix, par ex. Apache + PHP etc.

Étape 1: ce dont vous avez besoin

  1. IDE Arduino
  2. noyau ESP8266
  3. Toute carte de développement ESP8266 avec 1M ou plus de RAM flash
  4. Un serveur Web (même un humble Raspberry Pi fera l'affaire - c'est ce que j'utilise)
  5. (facultatif) outil mkspiffs si vous souhaitez mettre à jour automatiquement une image du système de fichiers SPIFFS

Étape 2: Créer un référentiel pour contenir les micrologiciels binaires

Créer un référentiel pour contenir les micrologiciels binaires
Créer un référentiel pour contenir les micrologiciels binaires

Sur mon serveur, j'ai un dossier appelé /home/pi/trucFirmware qui contient les différents firmwares de périphériques et images SPIFFS

Je conserve un binaire séparé pour chaque type de matériel (à partir d'un seul fichier source avec quelques #defines) et lorsqu'une nouvelle version est prête, j'utilise la commande de menu Arduino IDE "Sketch/Export compiled Binary" pour chaque périphérique cible. Notez que même bien qu'il existe 5 types de matériel différents, il n'y a que deux binaires SPIFFS: une version 1M et une version 4M - construites avec l'outil mkspiffs - puisque tous les appareils ont un flash 1M ou 4M.

Étape 3: Créer les binaires

À l'aide de l'option de menu Arduino IDE sketch/Exporter le binaire compilé, créez le micrologiciel qui sera téléchargé sur l'appareil lorsqu'il le demandera au serveur de mise à jour.

Si vous avez besoin d'un binaire SPIFFS, vous devrez installer l'outil mkspiffs.

Une fois que vous l'avez, la construction du binaire SPIFFS est simple. J'ai un fichier batch d'une ligne pour la version 1M qui prend le numéro de version en paramètre (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

et un autre pour la version 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c data/ spiffs_%1_4M.bin

Je copie ensuite tous les binaires compilés et les fichiers SPIFFS.binary dans le référentiel

Étape 4: créer le flux de serveur

Créer le flux de serveur
Créer le flux de serveur

J'utilise NODE-RED, mais la logique simple sera la même sur n'importe quelle technologie/langage de serveur.

a) Définissez une URL qui écoutera la requête ESP8266httpUpdate. Mon raspberryPi serevr est sur 192.168.1.4 et écoute sur le port 1880 pour / update avec le type de matériel ajouté. Donc, si je vais demander un binaire pour un Wemos D1 Mini, l'url se termine par:

192.168.1.4:1880/update/d1_mini

b) Créez du code pour gérer la logique suivante:

ESP8266: "Bonjour, j'utilise la version a.b.c du firmware, avez-vous une version plus récente ?"Serveur: « Laissez-moi voir… ah oui j'ai a.b.d - le voici… »

Si une version plus récente existe, le serveur l'envoie simplement sous forme de charge de données binaires dans la réponse http. La classe ESP8266httpUpdate effectue la partie délicate de la copie du binaire en mémoire, en changeant l'adresse de démarrage du micrologiciel pour le nouveau code plutôt que (si demandé) en redémarrant l'appareil pour exécuter le nouveau code.

Si par contre il n'y a pas de version supérieure, il répond par une erreur http 304 qui dit effectivement: "Je n'ai rien pour vous" et votre code continue de s'exécuter normalement.

Étape 5: ajouter la logique du serveur

Le premier nœud du flux "écoute" une requête http vers l'url https://192.168.1.4:1880/update avec le type d'appareil ajouté. Il le transmet au nœud de fonction "Construire le chemin de recherche" qui a le code javascript suivant:

msg.type=msg.req.params.type;var h=msg.req.headers; msg.version=h["x-esp8266-version"];

msg.mode=h["x-esp8266-mode"];

if(msg.mode=="sketch"){ msg.payload="/home/pi/trucFirmware/*.ino."+msg.type+".bin"; } else { var sz=h['x-esp8266-chip-size']; msg.payload="/home/pi/trucFirmware/spiffs_*_"+(sz/1048576)+"M.bin"; } renvoie le message;

Cela configure simplement le chemin approprié avec un caractère générique pour la fonction sys qui suit, qui s'exécute simplement

ls - r

La sortie est ensuite transmise au nœud de fonction « Comparer les versions »:

var f=msg.payload.split("\n")[0];msg.filename=f;

if(msg.mode=="sketch"){

f=f.replace("/home/pi/trucFirmware/truc_", ""); f=f.replace(".ino."+msg.type+".bin", ""); } else { f=f.replace("/home/pi/trucFirmware/spiffs_", ""); f=f.replace(/_\dM\.bin/, ""); }

if(msg.version < f){

node.warn("mise à niveau requise");

node.warn("retournera "+msg.filename); renvoyer le message; } node.warn("pas de mise à jour"); msg.statusCode=304; msg.payload=;

renvoyer le message;

Le nœud de commutation s'assure alors que soit le message 304 « aucune mise à jour nécessaire » est envoyé, soit le nouveau binaire réel est renvoyé et renvoyé au dispositif.

Étape 6: ajouter du code au croquis pour demander une mise à jour

L'esquisse doit contenir le code suivant afin qu'il se mette à jour automatiquement la prochaine fois que vous augmenterez le numéro de version:

#comprendre

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE est défini plus tôt en fonction de diverses définitions au moment de la compilation // qui définissent finalement le type de matériel, par ex. #define THIS_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"THIS_DEVICE; // c'est mon serveur Raspberry Pi, le 1880 est le port NODE-RED par défaut // /update est l'url que j'ai choisi pour que le serveur "écoute", suivi du type de périphérique … bool actualUpdate(bool sketch=false) { String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(false); if(sketch){ ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // ****************** C'est la ligne qui "fait l'affaire" } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf("MISE À JOUR RÉUSSIE");

renvoie vrai; } else { if(ret==HTTP_UPDATE_FAILED){

Serial.printf("Echec de la mise à niveau");

} } } renvoie faux; }

Étape 7: Enfin, lancez la mise à jour

Au démarrage, ou peut-être en réponse à un message MQTT (comme je le fais), exécutez le code suivant:

if(_actualUpdate(true)) ESP.restart();

// ou pour SPIFFS…

if(_actualUpdate(false)) ESP.restart();

L'appareil se mettra à jour et redémarrera en exécutant le dernier code du serveur. C'est beaucoup plus simple pour moi que de mettre à jour manuellement 33 appareils !

De nombreuses autres informations utiles sur la domotique, l'IOT et la programmation de l'ESP8266 sont disponibles sur mon blog.

Conseillé: