Inhaltsverzeichnis:

Einrichten eines automatischen ESP8266-Update-Servers - Gunook
Einrichten eines automatischen ESP8266-Update-Servers - Gunook

Video: Einrichten eines automatischen ESP8266-Update-Servers - Gunook

Video: Einrichten eines automatischen ESP8266-Update-Servers - Gunook
Video: ESP32 Web page creating and updating 2024, Juli
Anonim
Einrichten eines automatischen ESP8266-Update-Servers
Einrichten eines automatischen ESP8266-Update-Servers

Viele Leute verwenden jetzt den ESP8266 in seinen vielen Erscheinungsformen (ESP-01S, Wemos D1, NodeMCU, Sonoff usw.) für Heimautomatisierungssysteme. Wenn Sie Ihren eigenen Code schreiben (wie ich), wird es etwas mühsam, jeden von diesen separat zu aktualisieren, sogar über OTA (over the air).

Mein eigenes System hat zum Beispiel 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV und eine NodeMCU, die sich eine gemeinsame Codebasis teilen, also insgesamt 33 Geräte zu aktualisieren, wenn ich einen einfachen Code erstelle Veränderung.

Aber es gibt einen einfacheren Weg: Einen "Update-Server". Die hervorragende Arduino IDE + ESP8266-Kern verfügt über eine Bibliothek, die den größten Teil der Arbeit erledigt (ESP8266httpUpdate), aber Sie müssen wissen, wie Sie Ihren eigenen Server einrichten, damit er funktioniert.

Dieses Instructable zeigt Ihnen, wie Sie einen NODE-RED-Server verwenden, aber die gleiche Logik gilt für jede Servertechnologie Ihrer Wahl, z. Apache + PHP usw

Schritt 1: Was Sie brauchen

  1. Arduino-IDE
  2. ESP8266-Kern
  3. Jedes ESP8266-Entwicklungsboard mit 1 MB oder mehr Flash-RAM
  4. Ein Webserver (sogar ein bescheidener Himbeer-Pi reicht aus - es ist das, was ich benutze)
  5. (optional) mkspiffs-Tool, wenn Sie ein SPIFFS-Dateisystem-Image automatisch aktualisieren möchten

Schritt 2: Erstellen Sie ein Repository für binäre Firmwares

Erstellen Sie ein Repository für binäre Firmwares
Erstellen Sie ein Repository für binäre Firmwares

Auf meinem Server habe ich einen Ordner namens /home/pi/trucFirmware, der die verschiedenen Gerätefirmwares und SPIFFS-Images enthält

Ich pflege eine separate Binärdatei für jeden Hardwaretyp (aus einer einzigen Quelldatei mit ein paar #defines) und wenn eine neue Version fertig ist, verwende ich den Arduino-IDE-Menübefehl "Skizze/Kompilierte Binärdatei exportieren" für jedes Zielgerät Obwohl es 5 verschiedene Hardwaretypen gibt, gibt es nur zwei SPIFFS-Binärdateien: eine 1M- und eine 4M-Version - erstellt mit dem mkspiffs-Tool - da alle Geräte entweder 1M- oder 4M-Flash haben.

Schritt 3: Erstellen Sie die Binärdateien

Erstellen Sie mit der Arduino IDE-Menüoption Sketch/Export Compiled Binary die Firmware, die auf das Gerät hochgeladen wird, wenn es vom Update-Server angefordert wird.

Wenn Sie eine SPIFFS-Binärdatei benötigen, müssen Sie das mkspiffs-Tool installieren.

Sobald Sie es haben, ist das Erstellen der SPIFFS-Binärdatei einfach. Ich habe eine einzeilige Batchdatei für die 1M-Version, die die Versionsnummer als Parameter verwendet (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

und ein weiteres für die 4M-Version:

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

Ich kopiere dann alle kompilierten Binärdateien und die SPIFFS.binary-Dateien in das Repository

Schritt 4: Erstellen Sie den Serverflow

Erstellen Sie den Server-Flow
Erstellen Sie den Server-Flow

Ich verwende NODE-RED, aber die einfache Logik ist bei jeder Servertechnologie / -sprache gleich.

a) Definieren Sie eine URL, die auf die ESP8266httpUpdate-Anforderung lauscht. Mein RaspberryPi-Server ist auf 192.168.1.4 und lauscht auf Port 1880 auf /update mit dem angehängten Hardwaretyp. Wenn ich also eine Binärdatei für einen Wemos D1 Mini anfordere, lautet die URL:

192.168.1.4:1880/update/d1_mini

b) Erstellen Sie Code, um die folgende Logik zu handhaben:

ESP8266: "Hallo, ich verwende die Firmware-Version a.b.c, hast du eine neuere Version?" Server: "Lass mich sehen…ah ja, ich habe a.b.d - hier kommt es…"

Wenn eine neuere Version existiert, sendet der Server sie einfach als eine Ladung von Binärdaten in der http-Antwort. Die ESP8266httpUpdate-Klasse erledigt den kniffligen Teil des Kopierens der Binärdatei in den Speicher, ändert die Firmware-Startadresse in den neuen Code, anstatt (falls angefordert) das Gerät neu zu starten, um den neuen Code auszuführen.

Wenn es hingegen keine höhere Version gibt, antwortet es mit einem http 304-Fehler, der effektiv sagt: "Ich habe nichts für Sie" und Ihr Code läuft wie gewohnt weiter.

Schritt 5: Fügen Sie die Serverlogik hinzu

Der erste Knoten im Flow "lauscht" auf eine http-Anforderung an die URL https://192.168.1.4:1880/update mit angehängtem Gerätetyp. Es übergibt dies an den Funktionsknoten "Suchpfad erstellen", der den folgenden Javascript-Code enthält:

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"; aufrechtzuerhalten. Else {var sz=h['x-esp8266-chip-size']; msg.payload="/home/pi/trucFirmware/spiffs_*_"+(sz/1048576)+"M.bin"; } Nachricht zurückgeben;

Dadurch wird nur der entsprechende Pfad mit Wildcard für die folgende sys-Funktion eingerichtet, die einfach ausgeführt wird

ls - r

Die Ausgabe wird dann dem Funktionsknoten "Versionen vergleichen" zugeführt:

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

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

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("Upgrade erforderlich");

node.warn("gibt "+msg.filename" zurück); Nachricht zurück; } node.warn("kein Upgrade"); msg.statusCode=304; msg.payload=;

Nachricht zurück;

Der Vermittlungsknoten stellt dann sicher, dass entweder die 304-Nachricht "keine Aktualisierung erforderlich" gesendet wird oder die tatsächliche neue Binärdatei zurückgegeben und an das Gerät zurückgesendet wird.

Schritt 6: Fügen Sie der Skizze Code hinzu, um ein Update anzufordern

Der Sketch muss den folgenden Code enthalten, damit er beim nächsten Erhöhen der Versionsnummer automatisch aktualisiert wird:

#enthalten

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE wird früher gesetzt, abhängig von verschiedenen // Compile-Zeit-Definitionen, die schließlich den HW-Typ definieren, z. B. #define DIESES_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"THIS_DEVICE; // Dies ist mein Raspberry Pi-Server, der 1880 ist der Standard-NODE-RED-Port // /update ist die URL, die ich für den Server zum "Abhören" ausgewählt habe, gefolgt vom Gerätetyp … bool currentUpdate(bool sketch=false) { String-Nachricht; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(false); if(Skizze){ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** Dies ist die Zeile, die "das Geschäft erledigt" } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf ("UPDATE ERFOLGREICH");

true zurückgeben; } sonst { if(ret==HTTP_UPDATE_FAILED){

Serial.printf("Upgrade fehlgeschlagen");

} } } falsch zurückgeben; }

Schritt 7: Starten Sie schließlich das Update

Führen Sie beim Booten oder vielleicht als Reaktion auf eine MQTT-Nachricht (wie ich) den folgenden Code aus:

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

// oder für SPIFFS…

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

Das Gerät aktualisiert sich selbst und startet neu, indem der neueste Code vom Server ausgeführt wird. Für mich ist es viel einfacher, als 33 Geräte manuell zu aktualisieren!

Viele weitere nützliche Informationen zu Home Automation, IOT und Programmierung des ESP8266 finden Sie auf My Blog

Empfohlen: