Taula de continguts:

Configureu un servidor d'actualitzacions automàtiques ESP8266: 7 passos
Configureu un servidor d'actualitzacions automàtiques ESP8266: 7 passos

Vídeo: Configureu un servidor d'actualitzacions automàtiques ESP8266: 7 passos

Vídeo: Configureu un servidor d'actualitzacions automàtiques ESP8266: 7 passos
Vídeo: Zero to Hero ControlNet Tutorial: Stable Diffusion Web UI Extension | Complete Feature Guide 2024, De novembre
Anonim
Configureu un servidor d'actualitzacions automàtiques ESP8266
Configureu un servidor d'actualitzacions automàtiques ESP8266

Ara hi ha molta gent que utilitza l’ESP8266 en diverses formes (ESP-01S, Wemos D1, NodeMCU, Sonoff, etc.) per a sistemes domòtics. Si escriviu el vostre propi codi (igual que jo), actualitzar cadascun d’aquests per separat fins i tot mitjançant OTA (per antena) esdevé una mica tediós.

El meu propi sistema, per exemple, té 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV i un NodeMCU que comparteixen una base de codi comuna, de manera que s’actualitzen 33 dispositius quan faig un codi senzill. canvi.

Però hi ha una manera més senzilla: un "servidor d'actualitzacions". L’excel·lent nucli Arduino IDE + ESP8266 té una biblioteca per fer la major part del treball (ESP8266httpUpdate), però heu de saber com configurar el vostre propi servidor perquè funcioni.

Aquest instructiu us mostra com utilitzar un servidor NODE-RED, però la mateixa lògica s'aplica a qualsevol tecnologia de servidor que vulgueu, per exemple. Apache + PHP, etc.

Pas 1: el que necessiteu

  1. IDE Arduino
  2. Nucli ESP8266
  3. Qualsevol placa de desenvolupament ESP8266 amb memòria flash de 1M o més
  4. Un servidor web (fins i tot un humil gerd Pi farà - és el que faig servir jo)
  5. (opcional) eina mkspiffs si voleu actualitzar automàticament una imatge del sistema de fitxers SPIFFS

Pas 2: creeu un dipòsit per contenir firmware binari

Creeu un dipòsit per contenir firmware binari
Creeu un dipòsit per contenir firmware binari

Al meu servidor, tinc una carpeta anomenada / home / pi / trucFirmware que conté els diversos firmware del dispositiu i les imatges SPIFFS

Mantinc un binari separat per a cada tipus de maquinari (d’un únic fitxer font amb uns quants #defines) i quan estigui llesta una nova versió, faig servir l’ordre de menú Arduino IDE "esbós / exportació binària compilada" per a cada dispositiu de destinació. Tingueu en compte que fins i tot tot i que hi ha cinc tipus de maquinari diferents, només hi ha dos binaris SPIFFS: una versió 1M i una versió 4M, construïda amb l'eina mkspiffs, ja que tots els dispositius tenen flash 1M o 4M.

Pas 3: creeu els fitxers binaris

Mitjançant l’opció de menú Arduino IDE sketch / Export Compiled Binary, creeu el firmware que es carregarà al dispositiu quan ho sol·liciti al servidor d’actualització.

Si necessiteu un binari SPIFFS, haureu d’instal·lar l’eina mkspiffs.

Un cop el tingueu, crear el binari SPIFFS és senzill. Tinc un fitxer per lots d'una línia per a la versió 1M que pren el número de versió com a paràmetre (% 1)

mkspiffs -c data / spiffs_% 1_1M.bin

i un altre per a la versió 4M:

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

Després copio tots els fitxers binaris compilats i els fitxers.binary SPIFFS al dipòsit

Pas 4: creeu el flux de servidor

Creeu el flux de servidor
Creeu el flux de servidor

Estic fent servir NODE-RED, però la lògica simple serà la mateixa en qualsevol idioma o tecnologia de servidor.

a) Definiu una URL que escoltarà la sol·licitud ESP8266httpUpdate. El meu raspberryPi serevr és a 192.168.1.4 i escolta / actualitza el port 1880 amb el tipus de maquinari afegit. Per tant, si vull sol·licitar un binari per a un Wemos D1 Mini, l'URL acabarà com:

192.168.1.4:1880/update/d1_mini

b) Creeu codi per gestionar la lògica següent:

ESP8266: "Hola, estic executant la versió de firmware a.b.c, teniu una versió més recent?" Servidor: "Feu-me veure … ah sí, tinc a.b.d - aquí arriba …"

Si existeix una versió més recent, el servidor només l'envia com a càrrega de dades binàries a la resposta http. La classe ESP8266httpUpdate fa la part complicada de copiar el binari a la memòria, canviant l'adreça d'arrencada del firmware al nou codi que (si se sol·licita) reiniciar el dispositiu per executar el nou codi.

Si per contra no hi ha cap versió superior, respon amb un error http 304 que diu efectivament: "No tinc res per a tu" i el teu codi continua funcionant amb normalitat.

Pas 5: afegiu la lògica del servidor

El primer node del flux "escolta" una sol·licitud http a la URL https://192.168.1.4:1880/update amb el tipus de dispositiu afegit. Passa això al node de funció "Construeix ruta de cerca" que té el codi javascript següent:

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;

Això simplement configura el camí d'accés adequat amb comodí per a la funció sys que segueix, que simplement s'executa

ls - r

La sortida s'alimenta al node de funció "Compare versions":

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

if (msg.mode == "esbós") {

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

if (msg.version <f) {

node.warn ("cal actualitzar");

node.warn ("retornarà" + msg.filename); retorn msg; } node.warn ("sense actualització"); msg.statusCode = 304; msg.payload = ;

retorn msg;

A continuació, el node de commutació assegura que s'envia el missatge 304 "no necessita actualització" o que es torna el binari nou que es torna al dispositiu.

Pas 6: afegiu codi a l'esbós per sol·licitar una actualització

Cal que l’esbós inclogui el codi següent perquè s’actualitzi automàticament la propera vegada que augmenteu el número de versió:

#incloure

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE s’estableix anteriorment en funció de diverses definicions en temps de compilació // que finalment defineixen el tipus hw, p. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // aquest és el meu servidor de raspberry Pi, el 1880 és el port NODE-RED predeterminat // / update és l’URL que he escollit perquè el servidor escolti, seguit del tipus de dispositiu … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (fals); if (sketch) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Aquesta és la línia que "fa el negoci"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("ACTUALITZACIÓ REALITZADA");

tornar cert; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Ha fallat l'actualització");

}}} retornar fals; }

Pas 7: Finalment, inicieu l'actualització

A l’hora d’arrencada, o potser en resposta a un missatge MQTT (com ho faig), executeu el codi següent:

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

// o per SPIFFS …

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

El dispositiu s'actualitzarà i reiniciarà executant l'últim codi del servidor. Per a mi és molt més senzill que actualitzar 33 dispositius manualment.

Podeu trobar molta més informació útil sobre domòtica, IOT i programació de l’ESP8266 al meu bloc

Recomanat: