Indholdsfortegnelse:

Opsætning af en ESP8266 automatisk opdateringsserver: 7 trin
Opsætning af en ESP8266 automatisk opdateringsserver: 7 trin

Video: Opsætning af en ESP8266 automatisk opdateringsserver: 7 trin

Video: Opsætning af en ESP8266 automatisk opdateringsserver: 7 trin
Video: How To Chia GPU Plotting and Farming Guide for WINDOWS UPDATED - Gigahorse Start to Finish - 2023 2024, November
Anonim
Opsæt en ESP8266 automatisk opdateringsserver
Opsæt en ESP8266 automatisk opdateringsserver

Mange mennesker bruger nu ESP8266 i sine mange afskygninger (ESP-01S, Wemos D1, NodeMCU, Sonoff osv.) Til hjemmeautomatiseringssystemer. Hvis du skriver din egen kode (som jeg gør), bliver det lidt kedeligt at opdatere hver af disse separat, selv via OTA (over the air).

Mit eget system har for eksempel 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV og en NodeMCU, som deler en fælles kodebase, så det er 33 enheder i alt, der skal opdateres, når jeg laver en simpel kode lave om.

Men der er en lettere måde: En "opdateringsserver". Den fremragende Arduino IDE + ESP8266 -kerne har et bibliotek til at klare det meste af arbejdet (ESP8266httpUpdate), men du skal vide, hvordan du konfigurerer din egen server for at få det til at fungere.

Denne instruks viser dig, hvordan du bruger en NODE-RED-server, men den samme logik gælder for enhver serverteknologi efter eget valg, f.eks. Apache + PHP osv

Trin 1: Hvad du har brug for

  1. Arduino IDE
  2. ESP8266 kerne
  3. Ethvert ESP8266 dev -kort med 1M eller mere flash -RAM
  4. En webserver (selv en ydmyg hindbær Pi vil gøre - det er hvad jeg bruger)
  5. (valgfrit) mkspiffs-værktøj, hvis du vil automatisk opdatere et SPIFFS-filsystembillede

Trin 2: Opret et depot til opbevaring af binære firmwares

Opret et lager til at opbevare binære firmwares
Opret et lager til at opbevare binære firmwares

På min server har jeg en mappe kaldet/home/pi/trucFirmware, som indeholder de forskellige enheds firmwares og SPIFFS -billeder

Jeg vedligeholder en separat binær for hver hardwaretype (fra en enkelt kildefil med et par #defines), og når en ny udgivelse er klar, bruger jeg Arduino IDE "sketch/Export compiled Binary" menukommandoen for hver målenhed. Bemærk, at selv selvom der er 5 forskellige hardwaretyper, er der kun to SPIFFS -binære filer: en 1M og en 4M version - konstrueret med mkspiffs -værktøjet - da alle enhederne enten har 1M eller 4M flash.

Trin 3: Opret binærerne

Ved hjælp af Arduino IDE -menupunktet sketch/Export Compiled Binary opretter du den firmware, der uploades til enheden, når den anmoder om det fra opdateringsserveren.

Hvis du har brug for en SPIFFS -binær, skal du installere mkspiffs -værktøjet.

Når du har det, er det enkelt at bygge SPIFFS -binæren. Jeg har en batchfil med en linje til 1M-versionen, der tager versionsnummeret som en parameter (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

og en anden til 4M -versionen:

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

Jeg kopierer derefter alle de kompilerede binærfiler og SPIFFS.binære filer til depotet

Trin 4: Opret serverflowet

Opret serverflowet
Opret serverflowet

Jeg bruger NODE-RED, men den enkle logik vil være den samme på enhver serverteknologi / sprog.

a) Definer en url, der vil lytte efter ESP8266httpUpdate -anmodningen. Min raspberryPi serevr er på 192.168.1.4 og lytter på port 1880 efter /opdater med hardwaretypen vedhæftet. Så hvis jeg vil anmode om en binær til en Wemos D1 Mini, ender webadressen som:

192.168.1.4:1880/update/d1_mini

b) Opret kode til at håndtere følgende logik:

ESP8266: "Hej, jeg kører firmwareversion a.b.c, har du en nyere version?" Server: "Lad mig se … ah ja jeg har a.b.d - her kommer den …"

Hvis der findes en nyere version, sender serveren den bare som en mængde binære data i http -svaret. ESP8266httpUpdate -klassen gør den vanskelige del af at kopiere binæret til hukommelsen, ændre firmware -startadressen til den nye kode end (hvis det anmodes om) at genstarte enheden for at køre den nye kode.

Hvis der på den anden side ikke er en højere version, svarer den med en http 304 -fejl, der effektivt siger: "Jeg har intet til dig", og din kode fortsætter med at køre som normalt.

Trin 5: Tilføj serverlogikken

Den første node i flowet "lytter" efter en http -forespørgsel til url https://192.168.1.4:1880/update med den tilføjede enhedstype. Det overfører dette til "Konstruer søgesti" -funktionsknudepunkt, der har følgende javascript -kode:

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"; } ellers {var sz = h ['x-esp8266-chip-size']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } returnér msg;

Dette opretter bare den passende sti med jokertegn til sys -funktionen, der følger, som simpelthen kører

ls - r

Outputtet føres derefter til funktionsnoden "Sammenlign versioner":

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

hvis (msg.mode == "skitse") {

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

hvis (msg.version <f) {

node.warn ("opgradering påkrævet");

node.warn ("vender tilbage"+msg.filnavn); return msg; } node.warn ("ingen opgradering"); msg.statusCode = 304; msg.payload = ;

return msg;

Switchnoden sikrer derefter, at enten 304 "ingen opdatering nødvendig" -meddelelsen sendes, eller den faktiske nye binære returneres og sendes tilbage til enheden.

Trin 6: Tilføj kode til skitsen for at anmode om en opdatering

Skitsen skal have følgende kode inkluderet i den, så den opdateres automatisk næste gang du øger versionsnummeret:

#omfatte

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE indstilles tidligere afhængigt af forskellige kompileringstidsdefinitioner // som til sidst definerer hw-typen, f.eks. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // dette er min hindbær Pi-server, 1880 er standard NODE-RED port // /opdatering er den url, jeg valgte for serveren at "lytte" efter, efterfulgt af enhedstypen … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (falsk); hvis (skitse) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Dette er den linje, der "gør forretningen"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } hvis (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

vende tilbage sandt; } andet {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Opgradering mislykkedes");

}}} returner falsk; }

Trin 7: Endelig start opdateringen

Ved opstart, eller måske som svar på en MQTT -besked (som jeg gør), kør følgende kode:

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

// eller til SPIFFS …

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

Enheden opdaterer sig selv og genstarter med at køre den nyeste kode fra serveren. Det er meget enklere for mig end manuelt at opdatere 33 enheder!

Flere nyttige oplysninger om hjemmeautomatisering, IOT og programmering af ESP8266 findes på Min blog

Anbefalede: