目录
什么是MQTT协议?
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。它广泛应用于物联网(IoT)、智能家居、工业自动化等领域。
核心特点
-
• 轻量级:占用极少的带宽和资源,适合嵌入式设备。
-
• 发布/订阅模型:基于主题的消息传递机制,支持一对多通信。
-
• QoS机制:提供三种服务质量级别(QoS 0、QoS 1、QoS 2),确保消息传递的可靠性。
-
• 跨平台:支持多种编程语言和操作系统。
MQTTnet库
MQTTnet是一个功能强大且易于使用的C#库,用于在.NET平台上实现MQTT协议。它支持多种MQTT版本(如3.1.1和5.0),并且提供了丰富的API来简化开发过程。
核心概念
-
• Broker:消息代理,负责接收所有消息并将其分发给适当的订阅者。
-
• Publisher:发布者,向特定主题发送消息。
-
• Subscriber:订阅者,从特定主题接收消息。
-
• Topic:消息的主题,类似于邮件地址,用于标识消息的类别或目标。
安装
通过 NuGet 安装 MQTTnet:
dotnet add package MQTTnet --version 3.0.15
主题通配符
-
•
+:匹配单个层级的主题。例如,sensor/+匹配sensor/temperature。 -
•
#:匹配多个层级的主题。例如,sensor/#匹配sensor/temperature/humidity。
3. 发布与订阅
3.1 发布消息
using MQTTnet;
using MQTTnet.Client;
using System;
using System.Text;
using System.Threading.Tasks;
classProgram
{
static async Task Main(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 Task Main(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. 关键点解析
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)。
5. 总结
MQTT 协议以其轻量级、可靠性和灵活性,成为物联网领域的重要通信协议。通过本文的介绍,可以掌握如何在 C# 中实现 MQTT 的消息发布和订阅功能。


2万+

被折叠的 条评论
为什么被折叠?



