MQTTnet: 实战 MQTT 应用程序开发

目录

什么是MQTT协议?

核心特点

MQTTnet库

核心概念

安装

主题通配符

3. 发布与订阅

3.1 发布消息

3.2 订阅消息

4. 关键点解析

4.1 连接代理

4.2 消息发布

4.3 消息订阅

4.4 QoS 级别

4.5 保留消息

5. 总结


 

什么是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 的消息发布和订阅功能。

引入地址 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值