INHOUDSOPGAWE:

Stel 'n ESP8266 outomatiese opdateringsbediener op: 7 stappe
Stel 'n ESP8266 outomatiese opdateringsbediener op: 7 stappe

Video: Stel 'n ESP8266 outomatiese opdateringsbediener op: 7 stappe

Video: Stel 'n ESP8266 outomatiese opdateringsbediener op: 7 stappe
Video: Как использовать 4-канальное реле для управления нагрузкой переменного тока с помощью кода Arduino 2024, November
Anonim
Stel 'n ESP8266 outomatiese opdateringsbediener op
Stel 'n ESP8266 outomatiese opdateringsbediener op

Baie mense gebruik nou die ESP8266 in sy vele gedaante (ESP-01S, Wemos D1, NodeMCU, Sonoff, ens.) Vir tuisautomatiseringstelsels. As u u eie kode skryf (net soos ek), word die opdatering daarvan elkeen afsonderlik, selfs via OTA (oor die lug), 'n bietjie vervelig.

My eie stelsel het byvoorbeeld 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV en 'n NodeMCU wat 'n gemeenskaplike kodebasis deel, dus dit is altesaam 33 toestelle om by te werk wanneer ek 'n eenvoudige kode maak verander.

Maar daar is 'n makliker manier: 'n 'opdateringsbediener'. Die uitstekende Arduino IDE + ESP8266 -kern het 'n biblioteek om die meeste werk te doen (ESP8266httpUpdate), maar u moet weet hoe u u eie bediener kan instel om dit te laat werk.

Hierdie instruksie wys u hoe u 'n NODE-RED-bediener gebruik, maar dieselfde logika geld vir enige bedienertegnologie van u keuse, bv. Apache + PHP ens

Stap 1: wat u benodig

  1. Arduino IDE
  2. ESP8266 kern
  3. Enige ESP8266 dev -bord met 1M of meer flitsgeheue
  4. 'N Webbediener (selfs 'n nederige framboos Pi sal doen - dit is wat ek gebruik)
  5. (opsioneel) mkspiffs-hulpmiddel as u 'n SPIFFS-lêerstelselbeeld outomaties wil opdateer

Stap 2: Skep 'n bewaarplek om binêre Firmwares te hou

Skep 'n bewaarplek om binêre Firmwares te hou
Skep 'n bewaarplek om binêre Firmwares te hou

Op my bediener het ek 'n vouer genaamd/home/pi/trucFirmware wat die verskillende toestelle se firmware en SPIFFS -beelde bevat

Ek onderhou 'n aparte binêre vir elke hardeware tipe (uit 'n enkele bron lêer met 'n paar #defines) en as 'n nuwe weergawe gereed is, gebruik ek die Arduino IDE "sketch/Export compiled Binary" spyskaartopdrag vir elke teikenapparaat. Let daarop dat selfs Alhoewel daar 5 verskillende hardeware -tipes is, is daar slegs twee SPIFFS -binaries: 'n 1M- en 'n 4M -weergawe - saamgestel met die mkspiffs -instrument - aangesien al die toestelle 1M of 4M flits het.

Stap 3: Skep die binaries

Gebruik die Arduino IDE -keuselysskets/Uitvoer saamgestelde binêre en skep die firmware wat na die toestel opgelaai sal word wanneer dit van die opdateringsbediener versoek word.

As u 'n SPIFFS -binêre benodig, moet u die mkspiffs -instrument installeer.

As u dit eers het, is die bou van die SPIFFS -binêre eenvoudig. Ek het 'n bondel lêer met een reël vir die 1M weergawe wat die weergawe nommer as 'n parameter (%1) neem

mkspiffs -c data/ spiffs_%1_1M.bin

en nog een vir die 4M weergawe:

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

Ek kopieer dan al die saamgestelde binaries en die SPIFFS.binêre lêers na die bewaarplek

Stap 4: Skep die bedienervloei

Skep die bedienervloei
Skep die bedienervloei

Ek gebruik NODE-RED, maar die eenvoudige logika sal dieselfde wees vir enige bedienertegnologie / taal.

a) Definieer 'n url wat sal luister na die ESP8266httpUpdate -versoek. My raspberryPi serevr is op 192.168.1.4 en luister op poort 1880 vir /opdatering met die bygevoegde hardeware tipe. As ek dus 'n binêre vir 'n Wemos D1 Mini gaan aanvra, eindig die url as:

192.168.1.4:1880/update/d1_mini

b) Skep kode om die volgende logika te hanteer:

ESP8266: "Hallo, ek gebruik firmware -weergawe a.b.c, het u 'n nuwer weergawe?" Bediener: "Laat ek sien … ah ja, ek het a.b.d - hier kom dit …"

As daar 'n nuwer weergawe bestaan, stuur die bediener dit net as 'n vrag binêre data in die http -antwoord. Die ESP8266httpUpdate -klas doen die moeilike taak om die binêre na die geheue te kopieer, en verander die opstartadres van die firmware na die nuwe kode as (indien versoek) om die toestel weer te begin om die nuwe kode uit te voer.

As daar aan die ander kant geen hoër weergawe is nie, antwoord dit met 'n http 304 -fout wat effektief sê: "Ek het niks vir u nie" en u kode werk normaalweg.

Stap 5: Voeg die bedienerlogika by

Die eerste node in die stroom "luister" na 'n http -versoek om https://192.168.1.4:1880/update aan te gaan met die bygevoegde toesteltipe. Dit gee dit deur na die funksieknooppunt "Konstrueer soekpad" wat die volgende javascript -kode het:

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

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

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

Dit stel net die regte pad met 'n jokerteken in vir die sys -funksie wat volg, wat eenvoudig loop

ls - r

Die uitset word dan na die funksie -knoop "Vergelyk weergawes" gevoer:

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

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

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

as (msg.version <f) {

node.warn ("opgradering benodig");

node.warn ("sal terugkeer"+msg.filnaam); terugkeer msg; } node.warn ("geen opgradering"); msg.statusCode = 304; msg.payload = ;

terugkeer msg;

Die skakelknooppunt verseker dan dat die 304 "geen opdatering nodig" -boodskap gestuur word of dat die werklike nuwe binêre teruggestuur word en na die toestel teruggestuur word.

Stap 6: Voeg kode by die skets om 'n opdatering aan te vra

Die skets moet die volgende kode bevat, sodat dit outomaties opdateer die volgende keer as u die weergawenommer verhoog:

#insluit

#definieer TRUC_VERSION "0_4_99"

#definieer SPIFFS_VERSION "0_5_0"

// HIERDIE_TOESTEL word vroeër ingestel, afhangende van verskillende kompileringstyd-definisies // wat uiteindelik die hw-tipe definieer, bv. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // dit is my framboos Pi-bediener, die 1880 is die standaard NODE-RED-poort // /update is die url waarvoor ek die bediener gekies het om te "luister", gevolg deur die tipe toestel … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (vals); as (skets) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Dit is die reël wat "sake doen"} anders {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

terugkeer waar; } anders {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Opgradering misluk");

}}} vals teruggee; }

Stap 7: Laastens, begin die opdatering

Voer die volgende kode uit tydens opstart, of miskien in reaksie op 'n MQTT -boodskap (soos ek doen):

as (_actualUpdate (waar)) ESP.start ();

// of vir SPIFFS …

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

Die toestel sal homself opdateer en herlaai met die nuutste kode vanaf die bediener. Dit is vir my baie makliker as om 33 toestelle handmatig op te dateer!

Baie meer nuttige inligting oor tuismotorisering, IOT en programmering van die ESP8266 kan op My Blog gevind word

Aanbeveel: