Sisällysluettelo:

ESP8266 -automaattisen päivityspalvelimen määrittäminen: 7 vaihetta
ESP8266 -automaattisen päivityspalvelimen määrittäminen: 7 vaihetta

Video: ESP8266 -automaattisen päivityspalvelimen määrittäminen: 7 vaihetta

Video: ESP8266 -automaattisen päivityspalvelimen määrittäminen: 7 vaihetta
Video: Criminals are Using Home Networks 2024, Marraskuu
Anonim
Määritä ESP8266 -automaattinen päivityspalvelin
Määritä ESP8266 -automaattinen päivityspalvelin

Monet ihmiset käyttävät nyt ESP8266: ta monissa muodoissaan (ESP-01S, Wemos D1, NodeMCU, Sonoff jne.) Kotiautomaatiojärjestelmiin. Jos kirjoitat oman koodisi (kuten minäkin), näiden päivittäminen erikseen jopa OTA: n kautta (langattomasti) tulee hieman työlääksi.

Esimerkiksi omassa järjestelmässäni on 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV ja NodeMCU, joilla on yhteinen koodikanta, joten päivitettäviä laitteita on yhteensä 33 muuttaa.

Mutta on olemassa helpompi tapa: "päivityspalvelin". Erinomaisessa Arduino IDE + ESP8266 -ytimessä on kirjasto, joka suorittaa suurimman osan työstä (ESP8266httpUpdate), mutta sinun on tiedettävä, kuinka perustaa oma palvelin, jotta se toimisi.

Tämä opas näyttää kuinka NODE-RED-palvelinta käytetään, mutta sama logiikka koskee mitä tahansa valitsemasi palvelintekniikkaa, esim. Apache + PHP jne

Vaihe 1: Mitä tarvitset

  1. Arduino IDE
  2. ESP8266 ydin
  3. Mikä tahansa ESP8266 -kehityskortti, jossa on 1M tai enemmän flash -muistia
  4. Verkkopalvelin (jopa nöyrä vadelma Pi tekee - sitä käytän)
  5. (valinnainen) mkspiffs-työkalu, jos haluat päivittää SPIFFS-tiedostojärjestelmän kuvan automaattisesti

Vaihe 2: Luo arkisto binääristen laiteohjelmistojen säilyttämiseksi

Luo arkisto binaariohjelmistojen säilyttämiseksi
Luo arkisto binaariohjelmistojen säilyttämiseksi

Palvelimessani on kansio/home/pi/trucFirmware, joka sisältää erilaisia laiteohjelmistoja ja SPIFFS -kuvia

Ylläpidän erillistä binääriä kullekin laitteistotyypille (yhdestä lähdetiedostosta, jossa on muutama #defines) ja kun uusi julkaisu on valmis, käytän Arduino IDE "sketch/Export compiled Binary" -valikkokomentoa kullekin kohdelaitteelle. Huomaa, että jopa vaikka on olemassa 5 erilaista laitteistotyyppiä, on vain kaksi SPIFFS -binääriä: 1M- ja 4M -versio, joka on rakennettu mkspiffs -työkalulla - koska kaikissa laitteissa on joko 1M- tai 4M -salama.

Vaihe 3: Luo binääritiedostot

Luo laiteohjelmisto, joka ladataan laitteelle, kun se pyytää sitä päivityspalvelimelta, käyttämällä Arduino IDE -valikkoluonnosta/Vie käännetty binääri.

Jos tarvitset SPIFFS -binaarin, sinun on asennettava mkspiffs -työkalu.

Kun olet saanut sen, SPIFFS -binaarin rakentaminen on yksinkertaista. Minulla on yksirivinen erätiedosto 1M-versiolle, joka ottaa versionumeron parametriksi (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

ja toinen 4M -versiolle:

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

Kopioin sitten kaikki kootut binääritiedostot ja SPIFFS.binaaritiedostot arkistoon

Vaihe 4: Luo palvelinvirta

Luo palvelinvirta
Luo palvelinvirta

Käytän NODE-REDia, mutta yksinkertainen logiikka on sama kaikilla palvelintekniikoilla / kielillä.

a) Määritä URL -osoite, joka kuuntelee ESP8266httpUpdate -pyyntöä. RaspberryPi serevr on 192.168.1.4 ja kuuntelee porttia 1880 for /update ja laitteistotyyppi on liitetty. Joten jos aion pyytää binääriä Wemos D1 Minille, URL -osoite päättyy seuraavasti:

192.168.1.4:1880/update/d1_mini

b) Luo koodi seuraavan logiikan käsittelemiseksi:

ESP8266: "Hei, minulla on laiteohjelmistoversio a.b.c, onko sinulla uudempi versio?" Palvelin: "Anna minun nähdä … ah kyllä, minulla on a.b.d - tässä se tulee …"

Jos uudempi versio on olemassa, palvelin lähettää sen vain binaaridatan kuormana http -vastauksessa. ESP8266httpUpdate -luokka tekee vaikean osan binaarin kopioimisesta muistiin ja muuttaa laiteohjelmiston käynnistysosoitteen uuteen koodiin kuin (pyydettäessä) laitteen uudelleenkäynnistys uuden koodin suorittamiseksi.

Jos toisaalta ei ole korkeampaa versiota, se vastaa http 304 -virheellä, joka sanoo käytännössä: "Minulla ei ole sinulle mitään" ja koodisi toimii edelleen normaalisti.

Vaihe 5: Lisää palvelinlogiikka

Vuon ensimmäinen solmu "kuuntelee" http -pyyntöä URL -osoitteeseen https://192.168.1.4:1880/update laitetyypin kanssa. Se välittää tämän "Rakenna hakupolku" -funktiosolmuun, jolla on seuraava javascript -koodi:

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-size']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } palauta viesti;

Tämä vain määrittää sopivan polun, jossa on jokerimerkki seuraavaa sys -toimintoa varten, joka yksinkertaisesti suoritetaan

ls - r

Tulos syötetään sitten "Vertaa versioita" -toimintasolmuun:

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

jos (msg.mode == "luonnos") {

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

jos (msg.version <f) {

node.warn ("päivitys vaaditaan");

node.warn ("palauttaa"+viesti.tiedostonimi); palauta viesti; } node.warn ("ei päivitystä"); msg.statusCode = 304; msg.payload = ;

palauta viesti;

Kytkinsolmu varmistaa sitten, että joko 304 "päivitystä ei tarvita" -viesti lähetetään tai varsinainen uusi binääri palautetaan ja lähetetään takaisin laitteelle.

Vaihe 6: Lisää koodi luonnokseen päivityksen pyytämiseksi

Luonnoksessa on oltava seuraava koodi, jotta se päivittyy automaattisesti seuraavan kerran, kun lisäät versionumeroa:

#sisältää

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// TÄMÄ_LAITE asetetaan aikaisemmin riippuen eri kääntämisajan määritelmistä //, jotka lopulta määrittävät hw-tyypin, esim. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // tämä on minun vadelma Pi-palvelimeni, 1880 on NODE-RED-oletusportti // /päivitys on URL-osoite, jonka valitsin palvelimelle "kuunneltavaksi", ja sen jälkeen laitetyyppi … bool factUpdate (bool sketch = false) {Merkkijonoviesti; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (epätosi); if (luonnos) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Tämä on rivi, joka "tekee liiketoimintaa"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } jos (ret! = HTTP_UPDATE_NO_UPDATES) {jos (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

palaa tosi; } muu {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Päivitys epäonnistui");

}}} return false; }

Vaihe 7: Aloita lopuksi päivitys

Käynnistyshetkellä tai ehkä vastauksena MQTT -viestiin (kuten minäkin) suorita seuraava koodi:

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

// tai SPIFFS…

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

Laite päivittää itsensä ja käynnistää uusimman koodin palvelimelta. Se on minulle paljon yksinkertaisempaa kuin 33 laitteen manuaalinen päivittäminen!

Paljon enemmän hyödyllistä tietoa kodin automaatiosta, IOT: sta ja ESP8266: n ohjelmoinnista löytyy Omasta blogistani

Suositeltava: