在C#/Net中使用Mqtt

net中MQTT的应用场景

c#常用来开发上位机程序,或者其他一些跟设备打交道比较多的系统,所以会经常作为拥有数据的终端,可以用来采集上传数据,而MQTT也是物联网常用的协议,所以下面介绍在C#开发中使用MQTT。

安装MQTTnet

在c#开发中使用MQTTnet包,在nuget管理器中搜索MQTTnet,然后安装

MQTT使用

添加命名空间

csharp 复制代码
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;

创建一个MqttClient

csharp 复制代码
 Console.WriteLine("Hello, World!");
 MqttClientOptionsBuilder optionsBuilder = new MqttClientOptionsBuilder()
     .WithTcpServer("127.0.0.1", 1883)
     .WithClientId("testClient1");

 var clientOptions = optionsBuilder.Build();

 IMqttClient _mqttClient = new MqttFactory().CreateMqttClient();

创建连接

csharp 复制代码
  _mqttClient.ConnectAsync(clientOptions);

发送消息

先创建一个mqtt消息,填入主题(Topic),消息内容(PayloadSegment),然后使用PublishAsync方法发送

csharp 复制代码
 var message = new MqttApplicationMessage
 {
     Topic = "testtopic/topic1",//主题
     PayloadSegment = Encoding.Default.GetBytes("test Message"),
     QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
     Retain = true // 服务端是否保留消息。true为保留,如果有新的订阅者连接,就会立马收到该消息。
 };
 _mqttClient.PublishAsync(message);

在mqttx中订阅对应主题,就能收到

订阅主题中#,表示通配符,说明该分类下testtpoic/的主题都会订阅。

订阅一个主题

csharp 复制代码
    _mqttClient.SubscribeAsync("topic1", MqttQualityOfServiceLevel.AtLeastOnce); 

添加各种事件订阅

IMqttClient有下面这些事件可以使用

常用事件的添加:

csharp 复制代码
// 客户端连接成功事件
_mqttClient.ConnectedAsync += MqttClient_ConnectedAsync;
// 客户端连接关闭事件
_mqttClient.DisconnectedAsync += MqttClient_DisconnectedAsync;
// 收到消息事件
_mqttClient.ApplicationMessageReceivedAsync +=
    MqttClient_ApplicationMessageReceivedAsync;
      
      
 private static Task MqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg)
{
    Console.WriteLine("客户端已断开与服务端的连接......");
    return Task.CompletedTask;
}

private static Task MqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
{
    Console.WriteLine($"客户端已断开与服务端的连接......");
    return Task.CompletedTask;
}

private static Task MqttClient_ApplicationMessageReceivedAsync(
    MqttApplicationMessageReceivedEventArgs arg
)
{
    Console.WriteLine(
        $"ApplicationMessageReceivedAsync:客户端ID=【{arg.ClientId}】接收到消息。 Topic主题=【{arg.ApplicationMessage.Topic}】 消息=【{Encoding.UTF8.GetString(arg.ApplicationMessage.PayloadSegment)}】 qos等级=【{arg.ApplicationMessage.QualityOfServiceLevel}】"
    );
    return Task.CompletedTask;
}

关注可获取更多资料,源码和使用和说明文档↓↓

相关推荐
小灰灰搞电子1 小时前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
数字新视界2 小时前
2026模块化机房选型指南:行业市场发展趋势、占有率与竞争梯队分析报告解析
大数据·人工智能·物联网·数据中心·微模块机房·模块化机房·冷通道
传奇开心果编程3 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马3 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob3 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
Fibocom广和通3 小时前
MiFi选型的轻量化新解:广和通推出超紧凑5G RedCap MiFi PCBA
物联网·5g·redcap·wi-fi 6·mru3a0-cn·mifi
淡海水4 小时前
08-03-不可变-ImmutableDictionary-TKey-TValue-与ImmutableHashSet-T-持久化哈希树
数据结构·算法·c#·哈希算法·dictionary·immutable
白山编程大哥4 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
shmily麻瓜小菜鸡5 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
七夜zippoe5 小时前
为什么 2026 年每个 Java 团队都该懂 AI Agent
java·开发语言·人工智能