Innholdsfortegnelse:

Sett opp en ESP8266 automatisk oppdateringsserver: 7 trinn
Sett opp en ESP8266 automatisk oppdateringsserver: 7 trinn

Video: Sett opp en ESP8266 automatisk oppdateringsserver: 7 trinn

Video: Sett opp en ESP8266 automatisk oppdateringsserver: 7 trinn
Video: Introduction to NodeMCU ESP8266 WiFi Development board with HTTP Client example- Robojax 2024, November
Anonim
Sett opp en ESP8266 automatisk oppdateringsserver
Sett opp en ESP8266 automatisk oppdateringsserver

Mange bruker nå ESP8266 i sine mange fasader (ESP-01S, Wemos D1, NodeMCU, Sonoff osv.) For hjemmeautomatiseringssystemer. Hvis du skriver din egen kode (som jeg gjør) blir det litt kjedelig å oppdatere hver av disse separat, selv via OTA (over the air).

Mitt eget system, for eksempel har 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV og en NodeMCU som deler en felles kodebase, så det er 33 enheter som skal oppdateres når jeg lager en enkel kode endring.

Men det er en enklere måte: En "oppdateringsserver". Den utmerkede Arduino IDE + ESP8266 -kjernen har et bibliotek for å gjøre det meste (ESP8266httpUpdate), men du må vite hvordan du konfigurerer din egen server for å få den til å fungere.

Denne instruksen viser deg hvordan du bruker en NODE-RED-server, men den samme logikken gjelder enhver serverteknologi du ønsker, f.eks. Apache + PHP osv

Trinn 1: Det du trenger

  1. Arduino IDE
  2. ESP8266 kjerne
  3. Ethvert ESP8266 dev -kort med 1M eller mer flash -RAM
  4. En webserver (selv en ydmyk bringebær Pi vil gjøre - det er det jeg bruker)
  5. (valgfritt) mkspiffs-verktøy hvis du vil automatisk oppdatere et SPIFFS-filsystembilde

Trinn 2: Opprett et depot for å inneholde binære fastvare

Lag et depot for å inneholde binære fastvare
Lag et depot for å inneholde binære fastvare

På serveren min har jeg en mappe som heter/home/pi/trucFirmware som inneholder de forskjellige enhetens firmwares og SPIFFS -bilder

Jeg opprettholder en separat binær for hver maskinvaretype (fra en enkelt kildefil med noen få #defines), og når en ny versjon er klar bruker jeg Arduino IDE "sketch/Export compiled Binary" menykommando for hver målenhet. Vær oppmerksom på at selv selv om det er 5 forskjellige maskinvaretyper, er det bare to SPIFFS -binære filer: en 1M og en 4M versjon - konstruert med mkspiffs -verktøyet - siden alle enhetene enten har 1M eller 4M blits.

Trinn 3: Lag binærfiler

Ved å bruke Arduino IDE -menyalternativet sketch/Export Compiled Binary, oppretter du fastvaren som vil lastes opp til enheten når den ber om det fra oppdateringsserveren.

Hvis du trenger en SPIFFS -binær, må du installere mkspiffs -verktøyet.

Når du har det, er det enkelt å bygge binær SPIFFS. Jeg har en en-linje batch-fil for 1M-versjonen som tar versjonsnummeret som en parameter (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

og en annen for 4M -versjonen:

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

Jeg kopierer deretter alle de kompilerte binære filene og SPIFFS.binære filene over til depotet

Trinn 4: Opprett serverflyten

Opprett serverflyten
Opprett serverflyten

Jeg bruker NODE-RED, men den enkle logikken vil være den samme på hvilken som helst serverteknologi / språk.

a) Definer en nettadresse som vil lytte etter ESP8266httpUpdate -forespørselen. Min raspberryPi serevr er på 192.168.1.4 og lytter på port 1880 for /oppdatering med maskinvaretypen som er vedlagt. Så hvis jeg skal be om en binær for en Wemos D1 Mini, ender url -en som:

192.168.1.4:1880/update/d1_mini

b) Lag kode for å håndtere følgende logikk:

ESP8266: "Hei, jeg kjører fastvareversjon a.b.c, har du en nyere versjon?" Server: "La meg se … ah ja jeg har a.b.d - her kommer den …"

Hvis en nyere versjon eksisterer, sender serveren den bare som en mengde binære data i http -svaret. ESP8266httpUpdate -klassen gjør den vanskelige delen med å kopiere binæret til minnet, endre firmware -oppstartsadressen til den nye koden enn (om forespurt) starte enheten på nytt for å kjøre den nye koden.

Hvis det på den annen side ikke er en høyere versjon, svarer den med en http 304 -feil som effektivt sier: "Jeg har ingenting for deg", og koden fortsetter å kjøre som normalt.

Trinn 5: Legg til serverlogikken

Den første noden i flyten "lytter" etter en http -forespørsel til url https://192.168.1.4:1880/update med enhetstypen vedlagt. Den sender denne til funksjonenoden "Konstruer søkesti" som har følgende javascript -kode:

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

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

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

Dette setter bare opp den riktige banen med jokertegn for sys -funksjonen som følger, som bare kjører

ls - r

Utgangen mates deretter til funksjonsnoden "Sammenlign versjoner":

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

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

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

if (msg.version <f) {

node.warn ("oppgradering kreves");

node.warn ("returnerer"+msg.filnavn); returmelding; } node.warn ("ingen oppgradering"); msg.statusCode = 304; msg.payload = ;

returmelding;

Bryternoden sikrer deretter at enten 304 "ingen oppdatering nødvendig" -melding blir sendt eller at den faktiske nye binæren returneres og sendes tilbake til enheten.

Trinn 6: Legg til kode i skissen for å be om en oppdatering

Skissen må inneholde følgende kode, slik at den oppdateres automatisk neste gang du øker versjonsnummeret:

#inkludere

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE er angitt tidligere, avhengig av forskjellige kompileringstidsdefinisjoner // som til slutt 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 bringebær Pi-server, 1880 er standard NODE-RED-port // /oppdatering er nettadressen jeg valgte for serveren å "lytte" etter, etterfulgt av enhetstypen … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); if (sketch) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Dette er linjen som "gjør virksomheten"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("OPPDATERING Lykkes");

returner sant; } annet {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Oppgradering mislyktes");

}}} returner false; }

Trinn 7: Til slutt starter du oppdateringen

Ved oppstart, eller kanskje som svar på en MQTT -melding (som jeg gjør), kjør følgende kode:

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

// eller for SPIFFS …

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

Enheten vil oppdatere seg selv og starte den siste koden fra serveren på nytt. Det er mye enklere for meg enn å oppdatere 33 enheter manuelt!

Mye mer nyttig informasjon om hjemmeautomatisering, IOT og programmering av ESP8266 finner du på Min blogg

Anbefalt: