Tartalomjegyzék:

Az ESP8266 automatikus frissítő szerver beállítása: 7 lépés
Az ESP8266 automatikus frissítő szerver beállítása: 7 lépés

Videó: Az ESP8266 automatikus frissítő szerver beállítása: 7 lépés

Videó: Az ESP8266 automatikus frissítő szerver beállítása: 7 lépés
Videó: 7. IQRF Gateways and Cloud 2024, November
Anonim
Állítson be egy ESP8266 automatikus frissítő szervert
Állítson be egy ESP8266 automatikus frissítő szervert

Sokan használják az ESP8266-ot sokféle formában (ESP-01S, Wemos D1, NodeMCU, Sonoff stb.) Otthoni automatizálási rendszerekhez. Ha saját kódot ír (ahogy én is), ezek mindegyikének külön frissítése még az OTA -n keresztül is (univerzálisan) kissé unalmassá válik.

A saját rendszerem például 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV és NodeMCU közös kódbázissal rendelkezik, így összesen 33 eszköz frissíthető, ha egyszerű kódot készítek változás.

De van egy egyszerűbb módszer is: „Frissítési szerver”. A kiváló Arduino IDE + ESP8266 mag rendelkezik egy könyvtárral, amely elvégzi a munka nagy részét (ESP8266httpUpdate), de tudnia kell, hogyan kell beállítani saját szerverét, hogy működjön.

Ez az utasítás bemutatja, hogyan kell használni a NODE-RED szervert, de ugyanez a logika vonatkozik bármely tetszőleges kiszolgálótechnológiára, pl. Apache + PHP stb

1. lépés: Amire szüksége van

  1. Arduino IDE
  2. ESP8266 mag
  3. Bármely ESP8266 fejlesztői kártya 1M vagy több flash RAM -mal
  4. Webszerver (még egy szerény málna Pi is megteszi - ezt használom)
  5. (opcionális) mkspiffs eszköz, ha automatikusan frissíteni szeretné a SPIFFS fájlrendszerképet

2. lépés: Hozzon létre egy lerakatot a bináris firmware -k tárolására

Hozzon létre egy lerakatot a bináris firmware -k tárolására
Hozzon létre egy lerakatot a bináris firmware -k tárolására

A szerveren van egy/home/pi/trucFirmware nevű mappa, amely tartalmazza a különböző eszközszoftvereket és SPIFFS képeket

Minden hardvertípushoz külön bináris fájlt tartok fenn (egyetlen forrásfájlból néhány #defines -el), és amikor egy új kiadás kész, az Arduino IDE "sketch/Export compiled Binary" menüparancsát használom minden céleszközhöz. bár 5 különböző hardvertípus létezik, csak két SPIFFS bináris fájl létezik: az 1M és a 4M verzió - az mkspiffs eszközzel készült -, mivel minden eszköz rendelkezik 1M vagy 4M vakuval.

3. lépés: Hozza létre a bináris fájlokat

Az Arduino IDE menüopció vázlatával/Összeállított bináris exportálása használatával hozza létre azt a firmware -t, amelyet akkor tölt fel az eszközre, amikor azt a frissítési kiszolgálótól kéri.

Ha SPIFFS binárisra van szüksége, telepítenie kell az mkspiffs eszközt.

Ha megvan, a SPIFFS bináris létrehozása egyszerű. Van egy egysoros kötegelt fájlom az 1M verzióhoz, amely a verziószámot veszi paraméterként (%1)

mkspiffs -c adatok/ spiffs_%1_1M.bin

és egy másik a 4M verzióhoz:

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

Ezután az összes lefordított bináris fájlt és a SPIFFS.binary fájlokat átmásolom a lerakatba

4. lépés: Hozza létre a szerverfolyamatot

Hozza létre a szerverfolyamatot
Hozza létre a szerverfolyamatot

NODE-RED-et használok, de az egyszerű logika ugyanaz lesz minden szerver technológián / nyelven.

a) Adjon meg egy URL -t, amely meghallgatja az ESP8266httpUpdate kérést. A raspberryPi serevr 192.168.1.4 rendszeren van, és az 1880 -as porton hallgatja a /update frissítést a hozzá tartozó hardvertípussal. Tehát ha bináris programot fogok kérni egy Wemos D1 Mini készülékhez, az URL a következőképpen végződik:

192.168.1.4:1880/update/d1_mini

b) Hozzon létre kódot a következő logika kezelésére:

ESP8266: "Szia, a firmware a.b.c verzióját futtatom, van újabb verziója?" Szerver: "Hadd lássam … ah igen, van egy a.b.d - itt van …"

Ha létezik újabb verzió, akkor a szerver csak bináris adatrakományként küldi el a http -válaszban. Az ESP8266httpUpdate osztály elvégzi a bináris memóriába való másolás trükkös részét, megváltoztatja a firmware rendszerindítási címét az új kódra, mint (ha szükséges) újraindítja az eszközt az új kód futtatásához.

Ha viszont nincs magasabb verzió, akkor a válasz egy http 304 -es hibával válaszol, amely gyakorlatilag azt mondja: "Nincs semmi számomra", és a kód továbbra is a szokásos módon fut.

5. lépés: Adja hozzá a szerverlogikát

A folyamat első csomópontja "meghallgatja" a http -kérést a https://192.168.1.4:1880/uplate URL -re a hozzáfűzött eszköztípussal. Ezt továbbítja a "Keresési útvonal létrehozása" függvénycsomópontnak, amely a következő javascript kóddal rendelkezik:

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"; } return msg;

Ez csak beállítja a megfelelő utat helyettesítő karakterrel a következő sys funkcióhoz, amely egyszerűen fut

ls - r

A kimenet ezután a "Verziók összehasonlítása" funkciócsomópontba kerül:

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

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

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

if (msg.version <f) {

node.warn ("frissítés szükséges");

node.warn ("visszatér"+msg.filename); vissza üzenet; } node.warn ("nincs frissítés"); msg.statusCode = 304; msg.payload = ;

vissza üzenet;

A kapcsoló csomópont ezután biztosítja, hogy vagy a 304 "nincs frissítés szükséges" üzenetet küldi, vagy a tényleges új bináris számot visszaküldi és visszaküldi az eszközre.

6. lépés: Kód hozzáadása a vázlathoz frissítés kéréséhez

A vázlatnak tartalmaznia kell a következő kódot, hogy automatikusan frissüljön a következő verziószám növelésekor:

#befoglalni

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// A THIS_DEVICE korábban van beállítva a különböző fordítási idődefinícióktól függően //, amelyek végül meghatározzák a hw típust, pl. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // ez az én málna Pi szerverem, az 1880 az alapértelmezett NODE-RED port // /a frissítés az az URL, amelyet a szervernek "hallgatni" választottam, majd az eszköztípus… bool ténylegesUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (hamis); if (vázlat) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Ez a sor "végzi az üzletet"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

return true; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Sikertelen frissítés");

}}} return false; }

7. lépés: Végül kezdeményezze a frissítést

Indításkor, vagy talán egy MQTT üzenetre válaszul (ahogy én is) futtassa a következő kódot:

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

// vagy SPIFFS esetén…

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

Az eszköz frissíti magát, és újraindítja a legfrissebb kódot a szerverről. Számomra sokkal egyszerűbb, mint 33 eszköz manuális frissítése!

Még sok hasznos információ található az otthoni automatizálásról, az IOT -ról és az ESP8266 programozásáról a Saját blogomban

Ajánlott: