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.