Inhoudsopgave:

Een ESP8266 Automatic Update Server instellen: 7 stappen
Een ESP8266 Automatic Update Server instellen: 7 stappen

Video: Een ESP8266 Automatic Update Server instellen: 7 stappen

Video: Een ESP8266 Automatic Update Server instellen: 7 stappen
Video: Home Assistant - sluit adresband WS2812B aan via ESP8266 met WLED-firmware 2024, Juli-
Anonim
Een ESP8266 automatische updateserver instellen
Een ESP8266 automatische updateserver instellen

Veel mensen gebruiken nu de ESP8266 in zijn vele gedaanten (ESP-01S, Wemos D1, NodeMCU, Sonoff enz.) voor domoticasystemen. Als je je eigen code schrijft (zoals ik), wordt het een beetje vervelend om elk van deze afzonderlijk bij te werken, zelfs via OTA (over-the-air).

Mijn eigen systeem heeft bijvoorbeeld 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV en een NodeMCU die een gemeenschappelijke codebasis delen, dus dat zijn in totaal 33 apparaten om te updaten als ik een eenvoudige code maak verandering.

Maar er is een eenvoudigere manier: een "updateserver". De uitstekende Arduino IDE + ESP8266-kern heeft een bibliotheek om het meeste werk te doen (ESP8266httpUpdate), maar je moet weten hoe je je eigen server moet opzetten om het te laten werken.

Deze Instructable laat je zien hoe je een NODE-RED-server gebruikt, maar dezelfde logica is van toepassing op elke servertechnologie naar keuze, b.v. Apache + PHP enz

Stap 1: Wat je nodig hebt

  1. Arduino IDE
  2. ESP8266 kern
  3. Elk ESP8266-ontwikkelbord met 1M of meer flash-RAM
  4. Een webserver (zelfs een bescheiden Raspberry Pi is voldoende - dat is wat ik gebruik)
  5. (optioneel) mkspiffs-tool als u een SPIFFS-bestandssysteemkopie automatisch wilt bijwerken

Stap 2: Maak een opslagplaats voor binaire firmware

Maak een opslagplaats voor binaire firmware
Maak een opslagplaats voor binaire firmware

Op mijn server heb ik een map met de naam /home/pi/trucFirmware die de verschillende apparaatfirmwares en SPIFFS-afbeeldingen bevat

Ik onderhoud een afzonderlijk binair bestand voor elk hardwaretype (van een enkel bronbestand met een paar #defines) en wanneer een nieuwe release gereed is, gebruik ik de Arduino IDE "sketch/Export compiled Binary" menuopdracht voor elk doelapparaat. Merk op dat zelfs hoewel er 5 verschillende hardwaretypes zijn, zijn er slechts twee SPIFFS-binaire bestanden: een 1M- en een 4M-versie - geconstrueerd met de mkspiffs-tool - aangezien alle apparaten een 1M- of 4M-flitser hebben.

Stap 3: Maak de binaire bestanden

Gebruik de Arduino IDE-menuoptie Sketch/Export Compiled Binary om de firmware te maken die naar het apparaat wordt geüpload wanneer het erom vraagt van de updateserver.

Als je een SPIFFS-binary nodig hebt, moet je de tool mkspiffs installeren.

Als je het eenmaal hebt, is het bouwen van het SPIFFS-binaire bestand eenvoudig. Ik heb een batchbestand van één regel voor de 1M-versie met het versienummer als parameter (%1)

mkspiffs -c data/spiffs_%1_1M.bin

en nog een voor de 4M-versie:

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

Ik kopieer vervolgens alle gecompileerde binaire bestanden en de SPIFFS.binary-bestanden naar de repository

Stap 4: Creëer de serverstroom

De serverstroom maken
De serverstroom maken

Ik gebruik NODE-RED, maar de eenvoudige logica zal hetzelfde zijn op elke servertechnologie / taal.

a) Definieer een url die luistert naar het ESP8266httpUpdate-verzoek. Mijn raspberryPi serevr staat op 192.168.1.4 en luistert op poort 1880 naar /update met het hardwaretype toegevoegd. Dus als ik een binair bestand voor een Wemos D1 Mini ga aanvragen, eindigt de url als:

192.168.1.4:1880/update/d1_mini

b) Maak code om de volgende logica te verwerken:

ESP8266: "Hallo, ik gebruik firmwareversie a.b.c, heb je een nieuwere versie?" Server: "Laat me eens kijken … ah ja ik heb a.b.d - hier komt het…"

Als er een nieuwere versie bestaat, stuurt de server deze gewoon als een lading binaire gegevens in het http-antwoord. De ESP8266httpUpdate-klasse doet het lastige deel van het kopiëren van het binaire bestand naar het geheugen, waarbij het opstartadres van de firmware wordt gewijzigd in de nieuwe code en vervolgens (indien gevraagd) het apparaat opnieuw wordt opgestart om de nieuwe code uit te voeren.

Als er aan de andere kant geen hogere versie is, antwoordt deze met een http 304-fout die in feite zegt: "Ik heb niets voor jou" en je code blijft normaal draaien.

Stap 5: voeg de serverlogica toe

Het eerste knooppunt in de stroom "luistert" naar een http-verzoek naar de URL https://192.168.1.4:1880/update met het apparaattype toegevoegd. Het geeft dit door aan het functieknooppunt "Zoekpad samenstellen" met de volgende javascript-code:

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-grootte']; msg.payload="/home/pi/trucFirmware/spiffs_*_"+(sz/1048576)+"M.bin"; } bericht terugsturen;

Dit stelt gewoon het juiste pad in met wildcard voor de sys-functie die volgt, die eenvoudig wordt uitgevoerd

ls - r

De output wordt dan naar het functieknooppunt "Vergelijk versies" gevoerd:

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

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

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(bericht.versie <f){

node.warn("upgrade vereist");

node.warn("zal "+msg.bestandsnaam" teruggeven); bericht terugsturen; } node.warn("geen upgrade"); msg.statusCode=304; msg.payload=;

bericht terugsturen;

Het schakelknooppunt zorgt er vervolgens voor dat ofwel het 304-bericht "geen update nodig" wordt verzonden of dat het daadwerkelijke nieuwe binaire bestand wordt geretourneerd en teruggestuurd naar het apparaat.

Stap 6: Voeg code toe aan de schets om een update aan te vragen

De schets moet de volgende code bevatten, zodat deze automatisch wordt bijgewerkt de volgende keer dat u het versienummer verhoogt:

#erbij betrekken

#definieer TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE wordt eerder ingesteld, afhankelijk van verschillende compile-time-definities // die uiteindelijk het hw-type definiëren, b.v. #define THIS_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"THIS_DEVICE; // dit is mijn Raspberry Pi-server, de 1880 is de standaard NODE-RED-poort // /update is de url die ik heb gekozen voor de server om naar te "luisteren", gevolgd door het apparaattype … bool actualUpdate(bool sketch=false) { Tekenreeksbericht; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(false); if(schets){ ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** Dit is de regel die "de zaken doet" } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf("UPDATE IS GESLAAGD");

retourneer waar; } else { if(ret==HTTP_UPDATE_FAILED){

Serial.printf ("Upgrade mislukt");

} } } onwaar retourneren; }

Stap 7: Start ten slotte de update

Voer tijdens het opstarten, of misschien als reactie op een MQTT-bericht (zoals ik doe), de volgende code uit:

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

// of voor SPIFFS…

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

Het apparaat zal zichzelf updaten en opnieuw opstarten met de nieuwste code van de server. Het is voor mij een stuk eenvoudiger dan het handmatig updaten van 33 apparaten!

Veel meer nuttige informatie over domotica, IOT en het programmeren van de ESP8266 is te vinden op Mijn blog

Aanbevolen: