Turinys:

ESP8266 automatinio naujinimo serverio nustatymas: 7 veiksmai
ESP8266 automatinio naujinimo serverio nustatymas: 7 veiksmai

Video: ESP8266 automatinio naujinimo serverio nustatymas: 7 veiksmai

Video: ESP8266 automatinio naujinimo serverio nustatymas: 7 veiksmai
Video: RTVS1 5-step fan speed controller with Modbus communication | How to install RTVS1? 2024, Liepa
Anonim
Nustatykite automatinio atnaujinimo serverį ESP8266
Nustatykite automatinio atnaujinimo serverį ESP8266

Daugelis žmonių dabar naudoja ESP8266 įvairiais būdais (ESP-01S, Wemos D1, NodeMCU, Sonoff ir kt.) Namų automatizavimo sistemoms. Jei rašote savo kodą (kaip ir aš), atnaujinti kiekvieną iš jų net per OTA (per orą) tampa šiek tiek nuobodu.

Mano sistema, pavyzdžiui, turi 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV ir NodeMCU, kurie turi bendrą kodų bazę, todėl iš viso reikia atnaujinti 33 įrenginius, kai sukuriu paprastą kodą keistis.

Tačiau yra ir paprastesnis būdas: „atnaujinimo serveris“. Puikus „Arduino IDE + ESP8266“branduolys turi biblioteką, skirtą daugumai darbų atlikti (ESP8266httpUpdate), tačiau jūs turite žinoti, kaip nustatyti savo serverį, kad jis veiktų.

Ši instrukcija parodo, kaip naudotis NODE-RED serveriu, tačiau ta pati logika galioja bet kuriai jūsų pasirinktai serverio technologijai, pvz. „Apache“+ PHP ir kt

1 žingsnis: ko jums reikia

  1. „Arduino IDE“
  2. ESP8266 šerdis
  3. Bet kuri ESP8266 dev plokštė su 1M ar daugiau „flash“RAM
  4. Žiniatinklio serveris (net kuklus „Raspberry Pi“tiks - tai aš naudoju)
  5. (neprivaloma) „mkspiffs“įrankis, jei norite automatiškai atnaujinti SPIFFS failų sistemos vaizdą

2 žingsnis: sukurkite saugyklą dvejetainei programinei įrangai laikyti

Sukurkite saugyklą dvejetainei programinei įrangai laikyti
Sukurkite saugyklą dvejetainei programinei įrangai laikyti

Mano serveryje turiu aplanką/home/pi/trucFirmware, kuriame yra įvairių įrenginių programinės įrangos ir SPIFFS vaizdų

Kiekvienam aparatinės įrangos tipui prižiūriu atskirą dvejetainę versiją (iš vieno šaltinio failo su keliais #defines), o kai nauja versija yra paruošta, kiekvienam tiksliniam įrenginiui naudoju „Arduino IDE“eskizo/eksporto sudarytą dvejetainį meniu komandą. Atkreipkite dėmesį, kad net nors yra 5 skirtingi aparatūros tipai, yra tik du SPIFFS dvejetainiai failai: 1M ir 4M versija, sukurta naudojant „mkspiffs“įrankį, nes visi įrenginiai turi 1M arba 4M blykstę.

3 žingsnis: sukurkite dvejetainius failus

Naudodami „Arduino IDE“meniu parinkties eskizą/Eksportuoti sudarytą dvejetainį failą, sukurkite programinę -aparatinę įrangą, kuri bus įkelta į įrenginį, kai jis paprašys atnaujinimo serverio.

Jei jums reikia dvejetainio SPIFFS, turėsite įdiegti „mkspiffs“įrankį.

Kai turėsite, sukurti SPIFFS dvejetainį failą yra paprasta. Turiu 1 eilutės vienos eilutės paketinį failą, kurio versijos numeris laikomas parametru (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

ir dar viena 4M versija:

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

Tada nukopijuoju visus surinktus dvejetainius failus ir SPIFFS.binary failus į saugyklą

4 veiksmas: sukurkite serverio srautą

Sukurkite serverio srautą
Sukurkite serverio srautą

Aš naudoju NODE-RED, bet paprasta logika bus ta pati bet kokiose serverio technologijose / kalbose.

a) Nustatykite URL, kuris klausys ESP8266httpUpdate užklausos. Mano „raspberryPi serevr“yra 192.168.1.4 ir klausosi 1880 prievado, kuriame yra /atnaujinama, pridėjus aparatūros tipą. Taigi, jei ketinu paprašyti dvejetainės „Wemos D1 Mini“, URL baigiasi taip:

192.168.1.4:1880/update/d1_mini

b) Sukurkite kodą, kad galėtumėte valdyti šią logiką:

ESP8266: „Sveiki, aš naudoju programinės aparatinės įrangos versiją a.b.c, ar turite naujesnę versiją?“Serveris: „Leiskite man pamatyti … aha, aš turiu a.b.d - čia jis ateina …“

Jei egzistuoja naujesnė versija, serveris tiesiog siunčia ją kaip dvejetainių duomenų krūvą http atsakyme. ESP8266httpUpdate klasė atlieka sudėtingą dvejetainės kopijos kopiją į atmintį, pakeisdama programinės įrangos įkrovos adresą į naują kodą, nei (jei paprašoma) iš naujo paleisti įrenginį, kad būtų paleistas naujas kodas.

Kita vertus, jei nėra aukštesnės versijos, ji atsako pateikdama klaidą „http 304“, kuri iš tikrųjų sako: „Aš tau nieko neturiu“ir jūsų kodas ir toliau veikia kaip įprasta.

5 veiksmas: pridėkite serverio logiką

Pirmasis srauto mazgas „klausosi“http užklausos į URL https://192.168.1.4:1880/atnaujinti, pridėjus įrenginio tipą. Tai perduoda funkcijos mazgui „Sukurti paieškos kelią“, kuriame yra šis „JavaScript“kodas:

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 == "eskizas") {msg.payload = "/home/pi/trucFirmware/*. ino."+msg.type+". bin"; } else {var sz = h ['x-esp8266-chip-size']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } grąžinti pranešimą;

Tai tiesiog nustato atitinkamą kelią su pakaitos simboliais sekančiai sys funkcijai, kuri tiesiog veikia

ls - r

Tada išvestis tiekiama į funkcijų mazgą „Palyginti versijas“:

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

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

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

if (msg.version <f) {

node.warn ("reikalingas atnaujinimas");

node.warn ("grįš"+žinutės failo pavadinimas); grąžinti pranešimą; } node.warn ("be atnaujinimo"); msg.statusCode = 304; msg.payload = ;

grąžinti pranešimą;

Tada perjungimo mazgas užtikrina, kad būtų išsiųstas pranešimas 304 „atnaujinti nereikia“arba faktinė nauja dvejetainė dalis būtų grąžinta ir išsiųsta atgal į įrenginį.

6 veiksmas: pridėkite kodą prie eskizo ir paprašykite atnaujinimo

Eskizas turi turėti šį kodą, kad kitą kartą padidinus versijos numerį jis būtų automatiškai atnaujinamas:

#įtraukti

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE yra nustatytas anksčiau, priklausomai nuo įvairių kompiliavimo laiko apibrėžimų // kurie galiausiai apibrėžia hw tipą, pvz. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // tai mano „Raspberry Pi“serveris, 1880 yra numatytasis NODE-RED prievadas {Styginių žinutė; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (klaidinga); if (eskizas) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Tai eilutė, kuri „užsiima verslu“} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("ATNAUJINIMAS Sėkmingas");

grįžti tiesa; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf („Nepavyko atnaujinti“);

}}} return false; }

7 žingsnis: Galiausiai inicijuokite atnaujinimą

Įkrovimo metu arba galbūt atsakant į MQTT pranešimą (kaip aš) paleiskite šį kodą:

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

// arba SPIFFS…

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

Įrenginys atnaujins save ir iš naujo paleis paleidęs naujausią kodą iš serverio. Man tai daug paprasčiau nei rankiniu būdu atnaujinti 33 įrenginius!

Daug daugiau naudingos informacijos apie namų automatizavimą, IOT ir ESP8266 programavimą rasite mano tinklaraštyje

Rekomenduojamas: