Hablar de vendor lock-in en MQTT parece una contradicción, porque MQTT es un estándar abierto de OASIS. Sin embargo, muchos equipos IoT descubren que llevar sus dispositivos a otro proveedor supondría reescribir el firmware. Este artículo explica de dónde viene realmente la dependencia, qué extensiones propietarias la crean y las reglas de diseño concretas que mantienen tus dispositivos portables entre cualquier broker MQTT 3.1.1/5.0 estándar.
El protocolo es abierto; lo que lo rodea, no
MQTT se define en las especificaciones MQTT 3.1.1 y 5.0 de OASIS, publicadas en mqtt.org. Cualquier cliente que cumpla el estándar puede hablar con cualquier broker que también lo cumpla: conexión, publicación, suscripción, QoS, retained messages, mensajes de última voluntad (will) y, en MQTT 5, propiedades como la caducidad de sesión, la caducidad de mensajes, los topic aliases y los response topics.
El lock-in se cuela a través de todo lo que rodea al protocolo:
- Topics reservados definidos por la plataforma que los dispositivos deben usar.
- Flujos de autenticación propietarios que solo entiende una plataforma.
- SDK de dispositivo del proveedor que envuelven MQTT en conceptos propios de la plataforma.
- Lógica del lado del servidor, como reglas, rutas o transformaciones escritas en el lenguaje propio de una plataforma.
- Servicios de estado de la plataforma, como shadows o twins, de los que dependen los dispositivos.
- Convenciones de payload no estándar que solo pueden decodificar las herramientas de la plataforma.
Cada una de estas puede ser una buena función. El problema aparece cuando tu firmware depende de ellas sin una capa de abstracción.
Fuentes habituales de vendor lock-in en MQTT
| Fuente | Patrón de ejemplo | Por qué te ata | Alternativa portable |
|---|---|---|---|
| Topics reservados | Topics de shadow o de eventos de la plataforma con un prefijo del proveedor | El firmware fija rutas que solo entiende un servicio | Tu propia jerarquía, p. ej. site/area/line/device/telemetry |
| Modelos solo de dispositivo a nube | Topics fijos de telemetría y comandos por dispositivo | Los dispositivos no pueden suscribirse entre sí ni a topics compartidos | Publicación/suscripción estándar con wildcards |
| Autenticación propietaria | Tokens firmados generados por un SDK del proveedor | Cada dispositivo necesita nueva lógica de credenciales para migrar | Usuario/contraseña o X.509 sobre TLS estándar |
| SDK del proveedor | Librerías cliente de la plataforma para shadows, jobs, aprovisionamiento | El código de la aplicación llama a API de la plataforma, no a MQTT | Paho, MQTT.js, PubSubClient, ESP-MQTT |
| Reglas dentro del broker | Lógica de enrutamiento en un lenguaje de reglas de la plataforma | La lógica de negocio debe reescribirse para migrar | Suscriptores externos, Node-RED o procesamiento de streams bajo tu control |
| Servicios de estado de la plataforma | Documentos de shadow o twin | Modelo de estado ligado a una API | Retained messages en topics de estado |
Las funciones de las plataformas no son malas. AWS, Azure y otros proveedores las ofrecen porque ahorran trabajo real. Se trata de que adoptarlas sea una decisión consciente y no un accidente, y de mantenerlas fuera del firmware de los dispositivos, donde los cambios son más caros.
Siete reglas para sistemas MQTT portables
- Sé dueño de tu espacio de nombres de topics. Diseña una jerarquía que describa tu negocio, como una de estilo ISA-95
enterprise/site/area/line/cell/device. Evita prefijos del proveedor en los topics de los dispositivos. - Usa librerías cliente estándar. Paho, MQTT.js, PubSubClient, AsyncMqttClient o ESP-MQTT funcionan con cualquier broker.
- Guarda los ajustes de conexión en la configuración. Host, puerto, ajustes TLS, credenciales y client ID deben venir de un archivo de configuración, del almacenamiento NVS o del aprovisionamiento, nunca de constantes dispersas por el código.
- Usa autenticación estándar. Usuario y contraseña sobre TLS, o certificados de cliente, los entiende cualquier broker serio.
- Representa el estado con retained messages. El estado notificado y el deseado en topics retenidos se comportan igual en todas partes.
- Saca la lógica de integración del broker. Un flujo de Node-RED, un agente de Telegraf o un pequeño servicio suscriptor se conecta al broker como un cliente normal y puede acompañarte a cualquier proveedor.
- Documenta tus contratos de payload. Los esquemas JSON y Sparkplug B son abiertos; los formatos binarios sin documentar son un lock-in que te creas tú mismo.
Ejemplo: conexiones basadas en configuración
La técnica más sencilla contra el lock-in es guardar los detalles del broker en un único archivo de configuración. Aquí tienes un archivo YAML y un cargador en Python con paho-mqtt 2.x:
# broker.yaml - change this file, not your code, to switch providers
host: broker.connectmq.com
port: 8883
tls: true
username: YOUR_USERNAME
password: YOUR_PASSWORD
client_id: YOUR_CLIENT_ID
topic_root: acme/plant1/packaging/line2
# pip install paho-mqtt pyyaml
import json
import ssl
import time
import yaml
import paho.mqtt.client as mqtt
with open("broker.yaml", encoding="utf-8") as f:
cfg = yaml.safe_load(f)
root = cfg["topic_root"]
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(f"{root}/+/cmd", qos=1)
def on_message(client, userdata, msg):
print("Command:", msg.topic, msg.payload.decode())
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=cfg["client_id"],
protocol=mqtt.MQTTv5,
)
if cfg.get("username"):
client.username_pw_set(cfg["username"], cfg.get("password"))
if cfg.get("tls"):
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.on_connect = on_connect
client.on_message = on_message
client.connect(cfg["host"], cfg["port"], keepalive=60)
client.loop_start()
try:
while True:
reading = {"speed": 118.5, "ts": int(time.time())}
client.publish(f"{root}/filler1/telemetry", json.dumps(reading), qos=1)
client.publish(f"{root}/filler1/state/reported",
json.dumps({"mode": "running"}), qos=1, retain=True)
time.sleep(10)
except KeyboardInterrupt:
client.loop_stop()
client.disconnect()
Nada en la lógica de la aplicación sabe con qué proveedor está hablando. Cambiar de broker consiste en editar cinco líneas de YAML.
El lock-in más allá del dispositivo
El firmware es el lugar más caro en el que quedar atado, porque cambiarlo implica tocar todos los dispositivos instalados. Pero no es el único.
Los consumidores del back end a menudo dependen del mecanismo de entrega de un proveedor, por ejemplo un stream de eventos propietario que solo existe en una plataforma. Si tu historiador, tus dashboards y tus alertas se suscriben al broker por MQTT, se mueven contigo.
El conocimiento operativo es una forma más silenciosa de lock-in. Los runbooks, los umbrales de alerta y los hábitos de depuración crecen alrededor de una consola. Dejar por escrito qué señales vigilas, como el número de conexiones, las tasas de mensajes y ciertos topics concretos, hace que sea fácil recrearlas en otro sitio.
Las condiciones comerciales también importan. Los compromisos largos, los costes de salida de datos y la estructura de los planes pueden encarecer el cambio aunque la tecnología sea portable. Revísalas con el mismo cuidado que el diseño técnico.
Un broker MQTT gestionado como ConnectMQ se encarga de la infraestructura por ti, mientras que dispositivos, consumidores y dashboards hablan MQTT sin más. Esa combinación te da la comodidad de un servicio sin que sea difícil abandonarlo.
Haz una prueba de portabilidad antes de necesitarla
La mejor prueba de portabilidad es ejecutar realmente tu stack contra un segundo broker. Basta con un broker privado gratuito o con el servidor MQTT público gratuito, que sirve para pruebas como esta pero no para datos de producción:
# Point a subscriber at the second broker and replay your test suite
mosquitto_sub -h broker.connectmq.com -p 1883 -i porttest-5d1e \
-t "connectmq/demo/5d1e/#" -v
Pon topic_root en connectmq/demo/5d1e en una copia de broker.yaml, desactiva TLS y las credenciales para el servidor público y ejecuta el mismo programa. Si funciona sin cambios, el código de tus dispositivos es portable. Si falla, los errores señalan exactamente el lock-in que tienes que eliminar.
Honestidad con todos los proveedores, incluidos nosotros
Ningún broker MQTT gestionado es perfectamente neutral. ConnectMQ es un broker MQTT 3.1.1/5.0 basado en estándares, y tus dispositivos se conectan con clientes corrientes y autenticación por usuario y contraseña. Algunas comodidades del portal, como la republicación de Sparkplug B en topics bajo el prefijo connectmq/, las alertas por umbral o la vista de dispositivos ISA-95, son específicas de este servicio. Úsalas con libertad para operaciones y dashboards, pero haz que el firmware de los dispositivos publique en tu propio árbol de topics para poder llevarlo a otro sitio. El mismo consejo vale para los extras de cualquier otro proveedor.
Lista de comprobación para un plan de salida
Escríbelo una vez y revísalo cada año:
- ¿Dónde se guardan el host, el puerto y las credenciales del broker para cada tipo de dispositivo?
- ¿Pueden los dispositivos recibir nuevos ajustes de conexión de forma remota?
- ¿Qué funciones habría que reconstruir en otro sitio (reglas, alertas, dashboards)?
- ¿Qué topics o formatos de payload son propios del proveedor?
- ¿Cómo ejecutarías el broker antiguo y el nuevo en paralelo durante la migración, por ejemplo con un bridge?
La comparativa entre broker MQTT autoalojado vs gestionado y el artículo sobre plataforma IoT vs broker MQTT te ayudan a decidir qué capa quieres externalizar realmente.
Construye sobre un broker basado en estándares
Si la portabilidad te importa, empieza con un broker que no se interponga en tu firmware. Crea un broker Serverless gratuito sin tarjeta de crédito, ejecuta el cliente basado en YAML anterior y conserva el control total del diseño de tus topics. Para una visión más amplia, lee la guía del broker MQTT en la nube, descubre qué hace un broker MQTT o visita ConnectMQ.
Preguntas frecuentes
¿Puede haber lock-in con un protocolo abierto como MQTT?
Sí. El protocolo es portable, pero los topics reservados, la autenticación propietaria, los SDK del proveedor y la lógica dentro del broker pueden atar los dispositivos a un proveedor.
¿Usar el rules engine de una plataforma siempre supone lock-in?
Crea dependencia, pero puede ser una contrapartida aceptable. Mantén esa lógica fuera del firmware de los dispositivos para que un cambio posterior solo afecte al back end.
¿Cuál es la forma más rápida de comprobar si mis dispositivos son portables?
Apunta un dispositivo de prueba a un segundo broker basado en estándares cambiando solo su configuración. Todo lo que falle revela una dependencia.
¿Provoca Sparkplug B vendor lock-in?
No. Sparkplug B es una especificación abierta de Eclipse compatible con muchas herramientas y brokers, así que es una opción portable para payloads industriales.



