Ir al contenido

← Todas las funcionalidades

Monitorización geotécnica de taludESP32 PLC 14 (×4, Ethernet)HTTPResiliencia / OTA

Actualizaciones OTA de firmware remotas por Ethernet

Cuatro estaciones de monitorización en un talud, cada una con su caminata para llegar con el portátil — actualizar el firmware por cable no escala. Este ejemplo da a cada estación ESP32 PLC Ethernet dos endpoints HTTP: GET /status devuelve el estado de los sensores en JSON en tiempo real y POST /update acepta un binario de firmware nuevo a través de la red. Usamos exactamente este patrón para mantener una flota de estaciones de monitorización geotécnica sin visitas a campo.

Pull y push, ambos

El Node-RED central consulta /status cuando quiere, pero cada estación también envía su estado cada 60 s. El push es el watchdog: si una estación enmudece, el concentrador lo detecta en menos de un minuto — el silencio es en sí mismo una alarma.

OTA con herramientas HTTP estándar

No hace falta un actualizador a medida: curl -F "[email protected]" http://10.10.10.31/update flashea una estación. El handler vuelca la subida en la partición OTA y reinicia si todo va bien. La versión se publica en /status, así que el estado de firmware de la flota siempre es visible.

Escalar a N estaciones

Las estaciones son idénticas salvo STATION_ID y la IP. El concentrador guarda un .bin por revisión de hardware y una lista de IPs — actualizar toda la flota es un bucle for.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el ESP32 PLC 14 (×4, Ethernet) — cópialo libremente:

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < NPINS; i++) pinMode(pins[i], INPUT);

  ETH.begin();
  ETH.config(ip, gw, mask);

  // --- GET /status: the concentrator (or a browser) queries the station
  server.on("/status", HTTP_GET, [] {
    server.send(200, "application/json", statusJson());
  });

  // --- POST /update: OTA — upload the new .bin from Node-RED or curl:
  //     curl -F "[email protected]" http://10.10.10.31/update
  server.on("/update", HTTP_POST,
    [] {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", Update.hasError() ? "FAIL" : "OK");
      delay(1000);
      ESP.restart();                          // boots with the new firmware
    },
    [] {
      HTTPUpload &up = server.upload();
      if (up.status == UPLOAD_FILE_START) {
        Serial.printf("OTA: %s\n", up.filename.c_str());
        Update.begin(UPDATE_SIZE_UNKNOWN);
      } else if (up.status == UPLOAD_FILE_WRITE) {
        Update.write(up.buf, up.currentSize);
      } else if (up.status == UPLOAD_FILE_END) {
        if (Update.end(true)) Serial.printf("OTA OK: %u bytes\n", up.totalSize);
      }
    });

  server.begin();
  Serial.printf("Station %d at http://%s\n", STATION_ID, ETH.localIP().toString().c_str());
}

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Es seguro exponer el endpoint OTA?

Mantenlo en una red OT aislada o detrás del concentrador. Para más protección, añade autenticación HTTP basic y una comprobación de firma del firmware antes de Update.end().

¿Qué pasa si la subida falla a medias?

Update.end() informa del error y el PLC sigue ejecutando el firmware antiguo — el esquema de particiones OTA hace inofensivas las subidas a medio escribir.

¿Puedo hacerlo por WiFi en lugar de Ethernet?

Sí, el código de WebServer/Update es idéntico; en estaciones fijas se prefiere Ethernet por fiabilidad y por el cableado con protección frente a rayos.

Funcionalidades relacionadas