Sisällysluettelo:
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
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
- Arduino IDE
- ESP8266 ydin
- Mikä tahansa ESP8266 -kehityskortti, jossa on 1M tai enemmän flash -muistia
- Verkkopalvelin (jopa nöyrä vadelma Pi tekee - sitä käytän)
- (valinnainen) mkspiffs-työkalu, jos haluat päivittää SPIFFS-tiedostojärjestelmän kuvan automaattisesti
Vaihe 2: Luo arkisto binääristen laiteohjelmistojen 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
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