Tabla de contenido:

Configurar un servidor de actualización automática ESP8266: 7 pasos
Configurar un servidor de actualización automática ESP8266: 7 pasos

Video: Configurar un servidor de actualización automática ESP8266: 7 pasos

Video: Configurar un servidor de actualización automática ESP8266: 7 pasos
Video: 🖥️ Servidor Web en Arduino ESP32 y ESP8266 (🤩 Guiá Completa) 2024, Noviembre
Anonim
Configurar un servidor de actualización automática ESP8266
Configurar un servidor de actualización automática ESP8266

Mucha gente ahora está usando el ESP8266 en sus muchas formas (ESP-01S, Wemos D1, NodeMCU, Sonoff, etc.) para sistemas de automatización del hogar. Si escribe su propio código (como yo), actualizar cada uno de estos por separado incluso a través de OTA (por aire) se vuelve un poco tedioso.

Mi propio sistema, por ejemplo, tiene 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV y un NodeMCU que comparten una base de código común, por lo que son 33 dispositivos en total para actualizar cuando hago un código simple cambio.

Pero hay una forma más sencilla: un "servidor de actualización". El excelente núcleo Arduino IDE + ESP8266 tiene una biblioteca para hacer la mayor parte del trabajo (ESP8266httpUpdate), pero necesita saber cómo configurar su propio servidor para que funcione.

Este Instructable le muestra cómo usar un servidor NODE-RED, pero la misma lógica se aplica a cualquier tecnología de servidor de su elección, p. Apache + PHP, etc.

Paso 1: lo que necesita

  1. IDE de Arduino
  2. Núcleo ESP8266
  3. Cualquier placa de desarrollo ESP8266 con 1M o más de RAM flash
  4. Un servidor web (incluso una humilde Raspberry Pi servirá; es lo que yo uso)
  5. (opcional) herramienta mkspiffs si desea actualizar automáticamente una imagen del sistema de archivos SPIFFS

Paso 2: crear un repositorio para almacenar firmware binario

Crear un repositorio para almacenar firmware binario
Crear un repositorio para almacenar firmware binario

En mi servidor, tengo una carpeta llamada / home / pi / trucFirmware que contiene los distintos firmwares del dispositivo y las imágenes SPIFFS

Mantengo un binario separado para cada tipo de hardware (de un solo archivo fuente con algunas #defines) y cuando una nueva versión está lista, uso el comando de menú Arduino IDE "sketch / Export compiled Binary" para cada dispositivo de destino. aunque hay 5 tipos de hardware diferentes, solo hay dos binarios SPIFFS: una versión 1M y una 4M, construida con la herramienta mkspiffs, ya que todos los dispositivos tienen flash 1M o 4M.

Paso 3: crea los binarios

Usando la opción de menú Arduino IDE sketch / Export Compiled Binary, cree el firmware que se cargará en el dispositivo cuando lo solicite desde el servidor de actualización.

Si necesita un binario SPIFFS, deberá instalar la herramienta mkspiffs.

Una vez que lo tenga, construir el binario SPIFFS es simple. Tengo un archivo por lotes de una línea para la versión 1M que toma el número de versión como parámetro (% 1)

mkspiffs -c datos / spiffs_% 1_1M.bin

y otro para la versión 4M:

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

Luego copio todos los binarios compilados y los archivos.binary SPIFFS en el repositorio

Paso 4: crear el flujo del servidor

Crear el flujo del servidor
Crear el flujo del servidor

Estoy usando NODE-RED, pero la lógica simple será la misma en cualquier tecnología / lenguaje de servidor.

a) Defina una URL que escuchará la solicitud ESP8266httpUpdate. Mi servidor raspberryPi está en 192.168.1.4 y escucha en el puerto 1880 para / actualizar con el tipo de hardware adjunto. Entonces, si voy a solicitar un binario para un Wemos D1 Mini, la URL termina como:

192.168.1.4:1880/update/d1_mini

b) Cree código para manejar la siguiente lógica:

ESP8266: "Hola, estoy ejecutando la versión de firmware a.b.c, ¿tienes una versión más reciente?" Servidor: "Déjame ver … ah, sí, tengo a.b.d - aquí viene …"

Si existe una versión más nueva, el servidor simplemente la envía como una carga de datos binarios en la respuesta http. La clase ESP8266httpUpdate hace la parte complicada de copiar el binario en la memoria, cambiar la dirección de arranque del firmware al nuevo código que (si se solicita) reiniciar el dispositivo para ejecutar el nuevo código.

Si, por otro lado, no hay una versión superior, responde con un error http 304 que efectivamente dice: "No tengo nada para ti" y tu código continúa ejecutándose normalmente.

Paso 5: agregue la lógica del servidor

El primer nodo del flujo "escucha" una solicitud http a la URL https://192.168.1.4:1880/update con el tipo de dispositivo adjunto. Pasa esto al nodo de función "Construir ruta de búsqueda" que tiene el siguiente código javascript:

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 = "/ inicio / pi / trucFirmware / spiffs _ * _" + (sz / 1048576) + "M.bin"; } return msg;

Esto simplemente configura la ruta apropiada con comodines para la función sys que sigue, que simplemente se ejecuta

ls - r

A continuación, la salida se envía al nodo de función "Comparar versiones":

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

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

f = f.replace ("/ inicio / 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 ("requiere actualización");

node.warn ("devolverá" + msg.filename); return msg; } node.warn ("sin actualización"); msg.statusCode = 304; msg.payload = ;

return msg;

El nodo de conmutación asegura entonces que se envía el mensaje 304 "no se necesita actualización" o que se devuelve el nuevo binario real y se envía de vuelta al dispositivo.

Paso 6: agregue código al boceto para solicitar una actualización

El boceto debe tener el siguiente código incluido para que se actualice automáticamente la próxima vez que aumente el número de versión:

#incluir

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE se establece antes dependiendo de varias definiciones de tiempo de compilación // que finalmente definen el tipo de hw, p. Ej. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // este es mi servidor Raspberry Pi, el 1880 es el puerto NODE-RED predeterminado // / update es la URL que elegí para que el servidor "escuche", seguida del tipo de dispositivo … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (falso); if (bosquejo) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Esta es la línea que "hace el negocio"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("ACTUALIZACIÓN EXITOSA");

devuelve verdadero; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Actualización fallida");

} } } falso retorno; }

Paso 7: finalmente, inicie la actualización

En el momento del arranque, o quizás en respuesta a un mensaje MQTT (como yo) ejecute el siguiente código:

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

// o para SPIFFS…

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

El dispositivo se actualizará y se reiniciará ejecutando el último código del servidor. ¡Es mucho más simple para mí que actualizar manualmente 33 dispositivos!

Puede encontrar mucha más información útil sobre domótica, IOT y programación del ESP8266 en Mi Blog

Recomendado: