C#中MQTT的使用小结

 更新时间:2025年12月12日 09:28:11   作者:wangnaisheng  
本文主要介绍了C#中MQTT的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、MQTT:物联网通信协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的通信协议,专为物联网(IoT)设计,作用是:

轻量级通信:协议头极小(固定头部仅2字节),适合低带宽、低功耗设备发布/订阅模式:设备无需直接通信,通过中间代理(Broker)传递消息多种QoS级别:支持QoS 0/1/2,确保消息可靠传递 适合场景:智能家居、工业自动化、车联网、智慧城市等物联网应用

典型应用:智能灯泡通过主题home/light/control接收开关指令,土壤传感器将湿度数据发布到farm/section1/moisture,灌溉系统订阅该主题并自动控制水泵。

1.1 核心模型:发布/订阅模式

MQTT的使用模型最核心的就是发布/订阅模式,它由三个关键角色组成:

1.2 工作流程(简单版)

1.3 详细工作流程

  1. 建立连接:客户端与代理(Broker)建立TCP连接(可选加密,端口1883或8883)
  2. 订阅主题:客户端向代理发送订阅请求,如home/light/control
  3. 发布消息:发布者向指定主题发布消息,如home/light/control,内容为{"status": "on"}
  4. 消息分发:代理将消息转发给所有订阅了该主题的客户端
  5. 接收消息:订阅者接收并处理消息

1.4 超轻量级(最突出的特点!)

  • 固定报文头最小仅2字节,比HTTP协议的报文小多了
  • 控制报文只有几个字节,开发人员可以很快理解和实现
  • 网络开销极低,特别适合带宽有限的设备
  • 拥有多语言客户端(Java、Python、C#、Go等)
  • 支持多种连接方式:TCP、SSL/TLS、WebSocket等
  • 开源实现丰富,社区支持好

二、基础使用示例

C#中主要用两个库:

  1. MQTTnet(推荐!)- 轻量级、功能全,最新版已经支持MQTT 5.0
  2. M2Mqtt - 老牌库,适合简单场景

小贴士:MQTTnet 4.3.7+版本是目前主流选择,功能更丰富,社区支持也更好

1.安装库(NuGet)

使用NuGet安装 Install-Package MQTTnet

2.简单客户端连接示例

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;

// 创建MQTT工厂
var factory = new MqttFactory();

// 配置连接选项
var options = new MqttClientOptionsBuilder()
    .WithClientId("CSharpClient")
    .WithTcpServer("broker.hivemq.com", 1883) // 替换为你的MQTT服务器地址
    .WithCleanSession()
    .Build();

// 创建并连接客户端
var mqttClient = factory.CreateMqttClient();
var connectResult = await mqttClient.ConnectAsync(options);

if (connectResult.ResultCode == MqttClientConnectResultCode.Success)
{
    Console.WriteLine("已成功连接到MQTT服务器!");
    
    // 发布消息
    var message = new MqttApplicationMessageBuilder()
        .WithTopic("test/topic")
        .WithPayload("Hello from C# MQTT!")
        .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce) // QoS 1
        .Build();
        
    await mqttClient.PublishAsync(message);
    
    // 订阅主题
    await mqttClient.SubscribeAsync("test/topic");
    
    // 处理收到的消息
    mqttClient.ApplicationMessageReceivedAsync += (e) => 
    {
        Console.WriteLine($"收到消息: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
        return Task.CompletedTask;
    };
}

3.断开重连机制(重要!)

在实际项目中会遇到网络波动问题,MQTTnet自带了重连机制:

// 配置自动重连
var options = new MqttClientOptionsBuilder()
    .WithClientId("CSharpClient")
    .WithTcpServer("your-broker-address", 1883)
    .WithKeepAlivePeriod(TimeSpan.FromSeconds(30))
    .WithConnectionRetryInterval(TimeSpan.FromSeconds(5)) // 重连间隔
    .Build();

// 连接时处理重连
mqttClient.ConnectAsync(options);
mqttClient.DisconnectedAsync += (e) => 
{
    Console.WriteLine("连接已断开,正在尝试重连...");
    return Task.CompletedTask;
};

三、QoS级别选择指南

选择QoS级别是MQTT使用中的关键决策:

  • QoS 0:最多一次,适合不重要的数据(如传感器状态)
  • QoS 1:至少一次,适合一般重要数据(如设备控制指令)
  • QoS 2:只有一次,适合关键数据(如订单确认、支付信息)

在物联网场景中,QoS 1是最佳平衡点,既保证可靠性又不会过度消耗资源

四、实际应用场景

4.1 物联网数据上传

// 模拟传感器数据
var sensorData = new { Temperature = 25.5, Humidity = 60 };
var json = JsonConvert.SerializeObject(sensorData);

// 发布到MQTT
var message = new MqttApplicationMessageBuilder()
    .WithTopic("sensors/room1")
    .WithPayload(json)
    .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
    .Build();
    
await mqttClient.PublishAsync(message);

4.2 MQTT到ModbusRTU数据转发(工业场景)

// 从MQTT接收数据,转发到Modbus设备
private void HandleReceivedMessage(MqttApplicationMessageReceivedEventArgs e)
{
    var payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
    
    // 解析数据并写入Modbus设备
    ModbusWriter.WriteToDevice(payload);
}

五、专业建议

  • 使用异步编程:MQTT操作都是I/O密集型,务必使用async/await,避免阻塞主线程
  • 错误处理:不要只检查连接状态,要处理所有可能的异常
try
{
    await mqttClient.ConnectAsync(options);
}
catch (Exception ex)
{
    // 记录错误并尝试重连
    Console.WriteLine($"连接失败: {ex.Message}");
}
  • 会话管理:根据需求设置WithCleanSession(),持久会话适合需要恢复订阅的场景
  • 安全考虑:生产环境务必使用SSL/TLS加密
.WithTls()
.WithTlsVersion(TlsVersion.Tls12)

安全性

  • 传输加密:使用 TLS/SSL(端口 8883)加密通信,防止中间人攻击。
  • 身份认证
    • 用户名/密码认证(推荐强密码)。
    • 更高级方案:客户端证书(mTLS)、OAuth 2.0(部分 Broker 支持)。
  • 访问控制(ACL):配置 Broker 的 ACL 规则,限制客户端对主题的发布/订阅权限。
  • 避免明文敏感数据:即使使用 TLS,也建议对 payload 进行加密或脱敏。

资源与性能优化

  • 消息大小控制:MQTT 不适合传输大文件,建议 payload 控制在 KB 级别。
  • 心跳与超时:合理设置 keepAlive 和 broker 的 session expiry。
  • Broker 选型与部署:根据并发量选择合适 Broker(如 Mosquitto、EMQX、HiveMQ),并做好集群与监控。

六、与MQTT类似的协议对比

七、协议选择建议

  1. 如果你的设备资源极其有限(电池寿命要求高)→ 选CoAP
  2. 你需要高可靠性和复杂路由 → 选AMQP
  3. 你想要简单易用的文本协议 → 选STOMP
  4. 你需要实时交互和扩展性 → 选XMPP
  5. 你主要是管理设备 → 选LwM2M

到此这篇关于C#中MQTT的使用小结的文章就介绍到这了,更多相关C# MQTT使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C#实现Word文档批量添加水印

    基于C#实现Word文档批量添加水印

    在数字化浪潮席卷的今天,企业和个人对文档安全与版权保护的需求达到了前所未有的高度,传统的Word文档水印添加方式,往往依赖手动操作,不仅效率低下,容易遗漏,更无法应对批量处理的场景,所以本文将深入探讨如何利用C#编程语言实现Word文档的自动化水印插入
    2026-01-01
  • WPF如何绘制光滑连续贝塞尔曲线示例代码

    WPF如何绘制光滑连续贝塞尔曲线示例代码

    贝塞尔曲线,又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,下面这篇文章主要给大家介绍了关于WPF如何绘制光滑连续贝塞尔曲线的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-04-04
  • C#实现读取txt文件生成Word文档

    C#实现读取txt文件生成Word文档

    大家好,本篇文章主要讲的是C#实现读取txt文件生成Word文档,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 使用C#表达式树实现对象的深克隆(实例详解)

    使用C#表达式树实现对象的深克隆(实例详解)

    C# 的表达式树提供了一个强大的机制,可以将代码以数据结构的形式表示出来,使得代码可以在运行时进行检查、修改或执行,这为动态查询生成、代码优化和动态编程提供了很多可能性,这篇文章主要介绍了使用C#强大的表达式树实现对象的深克隆,需要的朋友可以参考下
    2024-05-05
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结
    2016-05-05
  • C#中Dictionary泛型集合7种常见的用法

    C#中Dictionary泛型集合7种常见的用法

    本文主要介绍了Dictionary集合的7种最基础的用法,包括创建、添加、查找、遍历、删除等方法,程序都是由简入繁,希望能通过阅读简单的示例,给大家一些启发。
    2016-03-03
  • 深度解析C# 弃元模式从语法糖到性能利器

    深度解析C# 弃元模式从语法糖到性能利器

    在C#的语法演进中,弃元(Discard)以一个简单的下划线 _ 成为了既提升代码可读性,又优化性能的双料特性,本文给大家介绍C#弃元模式从语法糖到性能利器,本文将从使用场景、核心优势、性能验证到底层实现,全面解析弃元模式的价值,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • C#基本概念列举详解

    C#基本概念列举详解

    这篇文章主要介绍了C#基本概念列举,需要的朋友可以参考下
    2014-02-02
  • C#实现一键清空控件值的示例代码

    C#实现一键清空控件值的示例代码

    这篇文章主要为大家详细介绍了如何利用C#语言实现一键清空控件值的功能,文中的示例代码讲解详细,对我们学习C#有一定帮助,需要的可以参考一下
    2022-09-09
  • C#实现word和pdf格式互转

    C#实现word和pdf格式互转

    这篇文章主要为大家详细介绍了如何通过C#实现word和pdf格式互转功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10

最新评论