摘要:MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。它广泛应用于物联网(IoT)、智能家居、工业自动化等领域。
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。它广泛应用于物联网(IoT)、智能家居、工业自动化等领域。
核心特点• 轻量级:占用极少的带宽和资源,适合嵌入式设备。
• 发布/订阅模型:基于主题的消息传递机制,支持一对多通信。
• QoS机制:提供三种服务质量级别(QoS 0、QoS 1、QoS 2),确保消息传递的可靠性。
• 跨平台:支持多种编程语言和操作系统。
MQTTnet是一个功能强大且易于使用的C#库,用于在.NET平台上实现MQTT协议。它支持多种MQTT版本(如3.1.1和5.0),并且提供了丰富的API来简化开发过程。
核心概念• Broker:消息代理,负责接收所有消息并将其分发给适当的订阅者。
• Publisher:发布者,向特定主题发送消息。
• Subscriber:订阅者,从特定主题接收消息。
• Topic:消息的主题,类似于邮件地址,用于标识消息的类别或目标。
安装通过 NuGet 安装:dotnet add package MQTTnet --version 3.0.15主题通配符• +:匹配单个层级的主题。例如,sensor/+匹配sensor/temperature。
• #:匹配多个层级的主题。例如,sensor/#匹配sensor/temperature/humidity。
3.1 发布消息using MQTTnet;using MQTTnet.Client;
using System;
using System.Text;
using System.Threading.Tasks;
classProgram
{
static async TaskMain(string args)
{
// 创建 MQTT 客户端
var mqttFactory = new MqttFactory;
var mqttClient = mqttFactory.CreateMqttClient;
// 配置代理地址
var options = new MqttClientOptionsBuilder
.WithTcpServer("mqtt.code.com",1883) // 替换为你的代理地址和端口
.Build;
// 连接到代理
await mqttClient.ConnectAsync(options);
// 准备要发布的消息
var topic = "sensor/temperature/room1";
var message = "25.5";
var mqttApplicationMessage = new MqttApplicationMessageBuilder
.WithTopic(topic)
.WithPayload(message)
.WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce) // QoS 1
.WithRetainFlag(false) // 不保留消息
.Build;
// 发布消息
await mqttClient.PublishAsync(mqttApplicationMessage);
Console.WriteLine($"Published message '{message}' to topic '{topic}'.");
// 断开连接
await mqttClient.DisconnectAsync;
}
}3.2 订阅消息using MQTTnet;
using MQTTnet.Client;
using System;
using System.Text;
using System.Threading.Tasks;
classProgram
{
static IMqttClient _mqttClient;
static async TaskMain(string args)
{
// 创建 MQTT 客户端
var mqttFactory = new MqttFactory;
_mqttClient = mqttFactory.CreateMqttClient;
// 配置代理地址
var options = new MqttClientOptionsBuilder
.WithTcpServer("mqtt.example.com",1883) // 替换为你的代理地址和端口
.Build;
// 设置消息接收回调
_mqttClient.UseConnectedHandler(async e =>
{
// 订阅主题
var topicFilter = new MQTTnet.Protocol.TopicFilterBuilder
.WithTopic("sensor/temperature/room1") // 替换为你要订阅的主题
.WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce) // QoS 1
.Build;
await _mqttClient.SubscribeAsync(topicFilter);
Console.WriteLine("Subscribed to topic.");
});
_mqttClient.UseApplicationMessageReceivedHandler(e =>
{
// 接收消息时触发
var topic = e.ApplicationMessage.Topic;
var payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
Console.WriteLine($"Received message '{payload}' from topic '{topic}'.");
});
// 连接到代理
await _mqttClient.ConnectAsync(options);
Console.WriteLine("Connected to broker.");
// 程序保持运行以持续接收消息
Console.ReadLine;
// 断开连接
await _mqttClient.DisconnectAsync;
}
}4.1 连接代理
• 使用 MqttClientOptionsBuilder配置代理地址和端口。
• 调用 ConnectAsync方法连接到代理。
4.2 消息发布• 使用 MqttApplicationMessageBuilder构建要发布的消息。
• 设置主题、负载、QoS 级别和是否保留消息。
• 调用 PublishAsync方法发布消息。
4.3 消息订阅• 使用 TopicFilterBuilder定义订阅的主题和 QoS 级别。
• 调用 SubscribeAsync方法订阅主题。
• 设置 UseApplicationMessageReceivedHandler回调函数,处理接收到的消息。
4.4 QoS 级别• QoS 0:最多一次,消息可能丢失。
• QoS 1:至少一次,消息可能会重复。
• QoS 2:仅一次,确保消息传递且无重复。
4.5 保留消息• 如果希望消息被代理保存以便新订阅者立即获取,可以设置 WithRetainFlag(true)。
MQTT 协议以其轻量级、可靠性和灵活性,成为物联网领域的重要通信协议。通过本文的介绍,可以掌握如何在 C# 中实现 MQTT 的消息发布和订阅功能。
来源:opendotnet