En el desarrollo de ecosistemas conectados, la eficiencia en el intercambio de datos es crítica. MQTT (Message Queuing Telemetry Transport) se ha erigido como el protocolo estándar para la mensajería ligera gracias a su bajo consumo de ancho de banda y su arquitectura basada en eventos. En este artículo, exploramos el funcionamiento de MQTT y cómo implementar un cliente robusto de publicación y suscripción utilizando .NET 10 y la librería líder MQTTnet.
1. ¿Qué es MQTT y por qué usarlo?
A diferencia de HTTP, que es un protocolo de consulta-respuesta (request-response), MQTT utiliza un modelo de Publicación/Suscripción (Pub/Sub).
- Broker: El servidor central que gestiona los mensajes.
- Topic (Tema): Etiquetas (jerárquicas, como
sensores/planta1/temperatura) que categorizan los mensajes. - Publisher: Dispositivo o servicio que envía datos a un topic.
- Subscriber: Dispositivo o servicio que «escucha» en uno o varios topics.
Este desacoplamiento permite que miles de dispositivos se comuniquen sin conocer la dirección IP de los demás, ideal para entornos con conexiones inestables.
2. Configuración del Entorno en .NET 10
Para trabajar con MQTT de forma profesional en .NET, la librería de referencia es MQTTnet, conocida por su alto rendimiento y compatibilidad con las últimas versiones del framework.
Bash
dotnet add package MQTTnet
3. Implementación de un Cliente Suscriptor
El suscriptor es el componente que reacciona a los datos entrantes. En .NET 10, podemos integrarlo como un Background Service para que esté siempre a la escucha.
C#
using MQTTnet;
using MQTTnet.Client;
var mqttFactory = new MqttFactory();
var mqttClient = mqttFactory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("broker.hivemq.com") // Broker público de prueba
.Build();
mqttClient.ApplicationMessageReceivedAsync += e =>
{
var payload = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment);
Console.WriteLine($"Mensaje recibido en {e.ApplicationMessage.Topic}: {payload}");
return Task.CompletedTask;
};
await mqttClient.ConnectAsync(options);
// Suscribirse a un topic con Wildcards (p.ej. todo lo de sensores)
await mqttClient.SubscribeAsync("sensores/+/temperatura");
Console.WriteLine("Escuchando mensajes... Presiona cualquier tecla para salir.");
Console.ReadKey();
4. Implementación de un Cliente Publicador
El publicador envía información al broker. Es común que este código resida en servicios de backend que notifican cambios de estado o en dispositivos edge que reportan lecturas.
C#
public async Task PublishDataAsync(string topic, string message)
{
var mqttFactory = new MqttFactory();
using var mqttClient = mqttFactory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("broker.hivemq.com")
.Build();
await mqttClient.ConnectAsync(options);
var mqttMessage = new MqttApplicationMessageBuilder()
.WithTopic(topic)
.WithPayload(message)
.WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce)
.Build();
await mqttClient.PublishAsync(mqttMessage);
await mqttClient.DisconnectAsync();
}
5. Calidad de Servicio (QoS)
Uno de los puntos fuertes de MQTT que debemos justificar en cualquier proyecto técnico son los niveles de QoS:
- QoS 0 (At most once): El mensaje se envía una vez y no se confirma. Es el más rápido pero menos fiable.
- QoS 1 (At least once): Asegura que el mensaje llega, pero podría duplicarse.
- QoS 2 (Exactly once): El nivel más alto; garantiza que el mensaje llega exactamente una vez (ideal para transacciones financieras o comandos críticos).
Conclusión
La integración de MQTT en .NET 10 permite construir sistemas altamente escalables y reactivos. Ya sea para monitorizar activos en tiempo real o para comunicar microservicios de forma asíncrona, este patrón ofrece una robustez superior a las APIs REST tradicionales en escenarios de alta frecuencia de datos, optimizando tanto el uso de red como los recursos de computación en la nube.