Innehållsförteckning:

Konfigurera en ESP8266 automatisk uppdateringsserver: 7 steg
Konfigurera en ESP8266 automatisk uppdateringsserver: 7 steg

Video: Konfigurera en ESP8266 automatisk uppdateringsserver: 7 steg

Video: Konfigurera en ESP8266 automatisk uppdateringsserver: 7 steg
Video: How To Chia GPU Plotting and Farming Guide for WINDOWS UPDATED - Gigahorse Start to Finish - 2023 2024, November
Anonim
Konfigurera en ESP8266 automatisk uppdateringsserver
Konfigurera en ESP8266 automatisk uppdateringsserver

Många människor använder nu ESP8266 i dess många skepnader (ESP-01S, Wemos D1, NodeMCU, Sonoff etc) för hemautomatiseringssystem. Om du skriver din egen kod (som jag gör) blir det lite tråkigt att uppdatera var och en av dem separat även via OTA (över luften).

Mitt eget system, till exempel har 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV och en NodeMCU som delar en gemensam kodbas, så det är totalt 33 enheter att uppdatera när jag gör en enkel kod förändra.

Men det finns ett enklare sätt: En "uppdateringsserver". Den utmärkta Arduino IDE + ESP8266 -kärnan har ett bibliotek för att göra det mesta (ESP8266httpUpdate), men du måste veta hur du konfigurerar din egen server för att få det att fungera.

Denna instruktion visar dig hur du använder en NODE-RED-server, men samma logik gäller för vilken serverteknik som helst, t.ex. Apache + PHP etc.

Steg 1: Vad du behöver

  1. Arduino IDE
  2. ESP8266 kärna
  3. Alla ESP8266 dev -kort med 1M eller mer flashminne
  4. En webbserver (även en ödmjuk hallon Pi kommer att göra - det är vad jag använder)
  5. (valfritt) mkspiffs-verktyg om du vill uppdatera en SPIFFS-filsystembild automatiskt

Steg 2: Skapa ett arkiv för binära firmware

Skapa ett arkiv för att hålla binära firmware
Skapa ett arkiv för att hålla binära firmware

På min server har jag en mapp som heter/home/pi/trucFirmware som innehåller de olika enhetens firmware och SPIFFS -bilder

Jag behåller en separat binär för varje hårdvarutyp (från en enda källfil med några #defines) och när en ny version är klar använder jag Arduino IDE "sketch/Export compiled Binary" menykommando för varje målenhet. Observera att även även om det finns fem olika hårdvarutyper finns det bara två SPIFFS -binärer: en 1M och en 4M version - konstruerad med mkspiffs -verktyget - eftersom alla enheter har antingen 1M eller 4M blixt.

Steg 3: Skapa binärfilerna

Med hjälp av menyalternativet Arduino IDE sketch/Export Compiled Binary skapar du den inbyggda programvaran som laddas upp till enheten när den begär det från uppdateringsservern.

Om du behöver en SPIFFS -binär måste du installera mkspiffs -verktyget.

När du väl har det är det enkelt att bygga SPIFFS -binären. Jag har en enradig batchfil för 1M-versionen som tar versionsnumret som en parameter (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

och en annan för 4M -versionen:

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

Jag kopierar sedan alla de sammanställda binärfilerna och SPIFFS.binära filerna över till förvaret

Steg 4: Skapa serverflödet

Skapa serverflödet
Skapa serverflödet

Jag använder NODE-RED, men den enkla logiken kommer att vara densamma på vilken serverteknik / språk som helst.

a) Definiera en webbadress som kommer att lyssna efter begäran ESP8266httpUpdate. Min raspberryPi serevr är på 192.168.1.4 och lyssnar på port 1880 för /uppdatera med maskinvarutypen som bifogas. Så om jag ska begära en binär för en Wemos D1 Mini så hamnar webbadressen som:

192.168.1.4:1880/update/d1_mini

b) Skapa kod för att hantera följande logik:

ESP8266: "Hej, jag kör firmware -version a.b.c, har du en nyare version?" Server: "Låt mig se … ah ja jag har a.b.d - här kommer det …"

Om det finns en nyare version skickar servern den bara som en mängd binär data i http -svaret. ESP8266httpUpdate -klassen gör den knepiga delen av att kopiera binären till minnet, ändra firmware -startadressen till den nya koden än (om så önskas) starta om enheten för att köra den nya koden.

Om det däremot inte finns någon högre version, svarar den med ett http 304 -fel som faktiskt säger: "Jag har ingenting för dig" och din kod fortsätter att fungera som vanligt.

Steg 5: Lägg till serverlogiken

Den första noden i flödet "lyssnar" efter en http -begäran för att url https://192.168.1.4:1880/update med enhetstypen som bifogad. Den överför detta till funktionskoden "Konstruera sökväg" som har följande javascript -kod:

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

Detta ställer bara in lämplig sökväg med jokertecken för sys -funktionen som följer, som helt enkelt körs

ls - r

Utmatningen matas sedan till funktionnoden "Jämför versioner":

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

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

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

if (msg.version <f) {

node.warn ("uppgradering krävs");

node.warn ("returnerar"+msg.filnamn); returmeddelande; } node.warn ("ingen uppgradering"); msg.statusCode = 304; msg.payload = ;

returmeddelande;

Kopplingsnoden säkerställer sedan att antingen 304 "ingen uppdatering behövs" -meddelande skickas eller att den faktiska nya binären returneras och skickas tillbaka till enheten.

Steg 6: Lägg till kod i skissen för att begära en uppdatering

Skissen måste ha följande kod inkluderad i den så att den uppdateras automatiskt nästa gång du ökar versionsnumret:

#omfatta

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE ställs in tidigare beroende på olika kompileringstidsdefinitioner // som så småningom definierar hw-typen, t.ex. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // detta är min hallon Pi-server, 1880 är standard NODE-RED-port // /uppdatering är webbadressen jag valde för servern att "lyssna" efter, följt av enhetstypen … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); if (sketch) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Detta är raden som "gör affären"} annars {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

återvända sant; } annat {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Uppgradering misslyckades");

}}} returnera false; }

Steg 7: Slutligen, initiera uppdateringen

Vid starttid, eller kanske som svar på ett MQTT -meddelande (som jag gör) kör följande kod:

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

// eller för SPIFFS …

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

Enheten uppdaterar sig själv och startar om med den senaste koden från servern. Det är mycket enklare för mig än att manuellt uppdatera 33 enheter!

Mycket mer användbar information om Hemautomation, IOT och programmering av ESP8266 finns på Min blogg

Rekommenderad: