Skip to content

Contrato MQTT — Mush2 ​

Este contrato define las obligaciones formales entre los actores del sistema Mush2 respecto a la comunicación MQTT. Es vinculante para firmware, backend y cualquier cliente MQTT integrado.


1. Actores ​

ActorRolResponsabilidades
Firmware (ESP8266)Dispositivo de campoPublicar telemetría, ejecutar comandos, publicar ACK, reportar estado
Backend (Node.js)Controlador centralPublicar comandos, recibir telemetría, persistir datos, emitir SSE
Broker MQTT (Mosquitto/HiveMQ)MensajeríaRutear mensajes, mantener sesiones, entregar LWT, persistir retains
Frontend (React)Interfaz de usuarioNo habla MQTT directamente (usa REST + SSE)

2. Configuración del Broker ​

2.1 Conectividad ​

ParámetroValorNotas
ProtocoloMQTT 3.1.1TCP/IP, no WebSocket
Puerto1883Sin TLS (desarrollo), 8883 (producción)
Keep Alive30 segundosConfigurable en firmware
Clean SessiontrueFirmware no necesita sesión persistente
Tamaño máximo de payload2048 bytesSuficiente para JSON de telemetría

2.2 Autenticación (producción) ​

ParámetroValor
Usernamemush2_{deviceId}
PasswordJWT corto o API key (por definir en hardening)

3. Calidad de Servicio (QoS) ​

3.1 Por tipo de mensaje ​

Tipo de MensajeQoS PublicaciónQoS SuscripciónJustificación
Telemetría sensoresQoS 1QoS 1Tolerante a duplicados, intolerante a pérdida
Estado actuadoresQoS 1 (retain)QoS 1Último valor conocido siempre disponible
Comandos actuadorQoS 1QoS 1PubSubClient no maneja QoS 2 en ESP8266 de forma confiable
Comandos configuraciónQoS 1QoS 1PubSubClient no maneja QoS 2 en ESP8266 de forma confiable
Evento bootQoS 1QoS 1Notificación de arranque
ACKQoS 1QoS 1Confirmación de comando
AlarmasQoS 1QoS 1Tolerante a pérdida ocasional
LWTQoS 1 (retain)QoS 1Última voluntad

3.2 Reglas de QoS ​

  • El broker entrega con el mínimo QoS entre la QoS de publicación y la QoS de suscripción.
  • Firmware publica siempre con la QoS especificada, independientemente de la suscripción.
  • Backend se suscribe con QoS igual o superior a la de publicación esperada.

4. Retained Messages ​

4.1 Mensajes con retain ​

TópicoPropósitoActualización
mush2/state/{deviceId}/onlineEstado de conexiónAl conectar (ONLINE) y vía LWT (OFFLINE)
mush2/telemetry/{deviceId}/stateÚltimo estado actuadoresCada ciclo de telemetría

4.2 Reglas de retain ​

  • Solo los tópicos listados arriba usan retain.
  • Al conectar, el backend lee los retains de todos sus dispositivos para reconstruir estado.
  • Firmware publica retain ONLINE en cada boot y retain del estado de actuadores.
  • Si un dispositivo no reporta por más de 5 minutos, backend considera estado incierto.

5. Last Will and Testament (LWT) ​

5.1 Configuración LWT del firmware ​

ParámetroValor
Tópicomush2/state/{deviceId}/online
Payload{"deviceId":"{deviceId}","status":"OFFLINE","ts":<epoch>,"reason":"unexpected"}
QoS1
Retaintrue

5.2 Comportamiento esperado ​

  • Broker publica LWT cuando detecta conexión perdida (keep alive expirado).
  • Backend recibe LWT y marca dispositivo como OFFLINE en DB.
  • Backend emite evento SSE device:offline al frontend.
  • Firmware, al reconectar, publica retain ONLINE para sobrescribir.

6. Suscripciones ​

6.1 Backend ​

mush2/telemetry/+/sensors    → QoS 1 (telemetría de todos los dispositivos)
mush2/telemetry/+/state      → QoS 1 (estado de todos los dispositivos)
mush2/event/+/boot           → QoS 1 (boot de cualquier dispositivo)
mush2/event/+/ack            → QoS 1 (ACK de cualquier dispositivo)
mush2/event/+/alarm          → QoS 1 (alarmas de cualquier dispositivo)
mush2/state/+/online         → QoS 1 (cambios de estado online)

6.2 Firmware ​

mush2/cmd/{deviceId}/actuator   → QoS 1 (comandos para este dispositivo)
mush2/cmd/{deviceId}/config     → QoS 1 (cambios de configuración)
mush2/cmd/{deviceId}/ota        → QoS 1 (comandos OTA)

El firmware NO debe suscribirse a # ni a tópicos de otros dispositivos.

6.3 Frontend ​

El frontend NO se suscribe directamente a MQTT. Recibe eventos en tiempo real vía Server-Sent Events desde el backend.

7. Formato de Payload ​

7.1 Reglas generales ​

  • Todo payload es JSON codificado en UTF-8.
  • Todo mensaje debe incluir el campo "protocol" con la versión del protocolo.
  • Todo mensaje debe incluir el campo "ts" con timestamp Unix en segundos.
  • Todo mensaje debe incluir el campo "deviceId" con el identificador del dispositivo.
  • Los campos adicionales son específicos del tipo de mensaje (ver protocol-v1.md).

7.2 Validación de payload ​

CondiciónAcción
Payload no es JSON válidoDescartar, log de error
Falta campo protocolDescartar, log de advertencia
Protocolo no soportadoDescartar, log de error
Falta campo deviceIdDescartar
deviceId no coincide con tópicoDescartar (seguridad)

8. Reconexión y Degradado ​

8.1 Firmware ​

CondiciónComportamiento
WiFi desconectadoReintentar cada 5s, rotar entre redes
Broker MQTT caídoReintentar cada 10s, rotar entre brokers
Sin conexión MQTTOperar en modo LOCAL con reglas de histéresis
Reconexión exitosaPublicar retain ONLINE + estado actual actuadores
Buffer de mensajesNo hay buffer — los mensajes no enviados se pierden (telemetría es idempotente)

8.2 Backend ​

CondiciónComportamiento
Conexión MQTT perdidaReintentar con exponential backoff (1s, 2s, 4s, ... 60s max)
Backend reiniciadoLeer retains de todos los dispositivos para reconstruir estado
Mensaje duplicado (QoS 1)Detección por cmdId duplicado, ignorar segundo
Payload inválidoLog de error + reporte de monitoreo

9. Seguridad ​

9.1 Restricciones de tópicos ​

  • El firmware SOLO publica en tópicos que comienzan con mush2/telemetry/{deviceId}/, mush2/event/{deviceId}/ y mush2/state/{deviceId}/.
  • El firmware SOLO se suscribe a tópicos que comienzan con mush2/cmd/{deviceId}/.
  • El backend puede publicar en cualquier tópico mush2/cmd/*.
  • El backend se suscribe a mush2/telemetry/+/, mush2/event/+/, mush2/state/+/.

9.2 ACLs recomendadas (producción) ​

# Firmware device-001
topic write mush2/telemetry/device-001/+
topic write mush2/event/device-001/+
topic write mush2/state/device-001/+
topic read  mush2/cmd/device-001/+

# Backend
topic read  mush2/telemetry/+/+
topic read  mush2/event/+/+
topic read  mush2/state/+/+
topic write mush2/cmd/+/+

10. Monitoreo del Contrato ​

MétricaUmbralAcción
Mensajes inválidos recibidos> 1% del totalRevisar firmware, alertar
Tiempo sin telemetría por dispositivo> 5 minutosMarcar OFFLINE, notificar
Comandos sin ACK> 3 por horaRevisar conectividad del dispositivo
Reconexiones frecuentes> 10 por horaRevisar calidad de WiFi
Payloads malformados> 5 por horaRevisar versión de firmware

Mush2 — Sistema IoT de control ambiental