.Net Core/.net 6/.Net 8 实现Mqtt客户端

news/2024/7/27 9:03:04/文章来源:https://blog.csdn.net/weixin_42199478/article/details/136561418

.Net Core/.net 6/.Net 8 实现Mqtt客户端

  • 客户端代码
  • 调用

直接上代码
nuget引用
MQTTnet

客户端代码


using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Packets;
using System.Text;namespace Code.Mqtt
{/// <summary>/// Mqtt客户端/// </summary>public class MqttClientBase{/// <summary>/// 客户端/// </summary>public IMqttClient client;/// <summary>/// 订阅主题列表/// </summary>public List<string> Topics=new List<string>();public MqttClientOptions options;public MqttClientBaseOptions _opt;/// <summary>/// 主动断开连接/// </summary>public bool off = false;public bool isconn = false;/// <summary>/// 创建mqtt客户端,并值接传入初始参数/// </summary>/// <param name="opt"></param>public MqttClientBase(MqttClientBaseOptions opt){this._opt = opt;//创建客户端client = new MqttFactory().CreateMqttClient();options =new MqttClientOptions() { ClientId=_opt.clientId,ChannelOptions=new MqttClientTcpOptions(){Server=_opt.server,Port=_opt.port,},Credentials=new MqttClientCredentials(_opt.username,Encoding.UTF8.GetBytes(_opt.password)),//清理会话CleanSession=false,//设置心跳KeepAlivePeriod = TimeSpan.FromSeconds(30)};}/// <summary>/// 创建mqtt客户端,不传参数,/// 必须在调用 Connect之前调用过SetOption方法/// </summary>public MqttClientBase(){//创建客户端client = new MqttFactory().CreateMqttClient();}/// <summary>/// 设置参数/// </summary>/// <param name="opt"></param>public void SetOption(MqttClientBaseOptions opt){options = new MqttClientOptions(){ClientId = _opt.clientId,ChannelOptions = new MqttClientTcpOptions(){Server = _opt.server,Port = _opt.port,},Credentials = new MqttClientCredentials(_opt.username, Encoding.UTF8.GetBytes(_opt.password)),//清理会话CleanSession = false,//设置心跳KeepAlivePeriod = TimeSpan.FromSeconds(30)};}/// <summary>/// 连接服务器/// </summary>/// <param name="action">连接成功后执行</param>/// <param name="ConnectedAsync">连接成功事件</param>public void Connect(Action<MqttClientConnectedEventArgs> ConnectedAsync=null){client.ConnectAsync(options);if(ConnectedAsync != null){//连接成功事件client.ConnectedAsync += (args) =>{ConnectedAsync(args);return Task.CompletedTask;};}}/// <summary>/// 重连服务器/// 在连接断开事件中调用,即可实现无限轮询/// </summary>/// <param name="t">是否重复尝试重连</param>/// <param name="i">尝试次数</param>public void ReConnect(){try{client.ConnectAsync(options).Wait();}catch (Exception ex){Console.WriteLine(ex.Message);}}public async Task AddTopic(string topic){//更新订阅client.SubscribeAsync(new MqttClientSubscribeOptions(){TopicFilters = new List<MqttTopicFilter>() {new MqttTopicFilter { Topic = topic }}});//将主题名称加入列表Topics.Add(topic);}/// <summary>/// 取消订阅/// </summary>/// <param name="topic"></param>/// <returns></returns>public async Task DeleteTopic(string topic){client.UnsubscribeAsync(new MqttClientUnsubscribeOptions(){TopicFilters = new List<string> { topic }});Topics.Remove(topic);}/// <summary>/// 发布消息/// </summary>/// <param name="topic">主题</param>/// <param name="content">内容</param>/// <returns></returns>public async Task Publish(string topic, string content){if(client.IsConnected){client.PublishAsync(new MqttApplicationMessage(){Topic = topic,Payload = Encoding.UTF8.GetBytes(content)});}}/// <summary>/// 主动断开连接/// </summary>public void Disconnect(){off = true;client.DisconnectAsync();}/// <summary>/// 断开连接事件/// </summary>/// <param name="action"></param>/// <returns></returns>public async Task DisconnectedAsync(Action<MqttClientDisconnectedEventArgs> action){client.DisconnectedAsync += (args) => {action(args);return Task.CompletedTask;};}/// <summary>/// 接收消息事件/// </summary>/// <param name="action"></param>/// <returns></returns>public async Task Message(Action<string,string> action) {client.ApplicationMessageReceivedAsync += (args) =>{var topic = args.ApplicationMessage.Topic;var msg = args.ApplicationMessage.Payload.BToString();action(topic, msg);return Task.CompletedTask;};}}
}

调用

我这里是控制台项目

//初始化
var mqtt = new MqttClientBase(new MqttClientBaseOptions() { clientId="client-1",username="username",password="password",server="127.0.0.1",port=10883
});//断开连接事件
mqtt.DisconnectedAsync((e) => {Console.WriteLine("连接断开");//重连服务器mqtt.ReConnect();
});//连接服务器
mqtt.Connect((args) => {/* 连接成功事件 */Console.WriteLine("连接成功");// 添加主题订阅,建议写到 连接成功事件 里面,这样重连后可以重新订阅主题mqtt.AddTopic("topic-1").Wait();mqtt.AddTopic("topic-2").Wait();mqtt.AddTopic("topic-3").Wait();// 取消主题订阅mqtt.DeleteTopic("topic-3").Wait();// 向指定主题推送消息mqtt.Publish("topic-1", "666666666").Wait();});// 收到来自服务器的消息 topic:主题  msg:消息内容
mqtt.Message((topic,msg) => { Console.WriteLine($"收到消息:{topic}:{msg}");
});// 这里暂停三秒,看三秒后主动断开连接效果
// Task.Delay(3000).Wait();// 主动断开连接
//mqtt.Disconnect();while (true)
{// 向指定主题推送消息mqtt.Publish("topic-1", Console.ReadLine());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_999109.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter学习9 - http 中 get/post 请求示例

1、配置 http pubspec.yaml dependencies:http: ^0.13.4flutter:sdk: flutterhttp 库最新插件版本查看&#xff1a;https://pub.dev/packages/http不一定要用最新版本 http&#xff0c;要使用项目所能支持的版本 .dart import package:http/http.dart as http;2、示例 &a…

VsCode中使用Anaconda中的python环境

1、今天在新的电脑上安装了VsCode和Anaconda&#xff0c;但是在VsCode却选择不了python的环境&#xff0c;期望结果是下面这样的 2、接着在网上百度&#xff0c;找到了方法&#xff0c;具体方法如下&#xff1a; 2.1需要先在Extensions中安装python 2.2再使用ctrlshiftP后使用…

分布式数据库 GaiaDB-X 金融应用实践

1 银行新一代核心系统建设背景及架构 在银行的 IT 建设历程中&#xff0c;尤其是中大行&#xff0c;大多都基于大型机和小型机来构建核心系统。随着银行业务的快速发展&#xff0c;这样的系统对业务的支持越来越举步维艰&#xff0c;主要体现在以下四个方面&#xff1a; 首先是…

日韩媒体宣传案例分析:CloudNEO 为您提供海外媒体宣传最佳途径

近年来&#xff0c;随着互联网的迅速发展和全球化的加速推进&#xff0c;海外市场对于企业的重要性日益凸显。尤其是在亚洲地区&#xff0c;日本和韩国作为亚洲最具活力和潜力的市场之一&#xff0c;成为众多企业争相开拓的目标。在这个过程中&#xff0c;媒体宣传不仅是企业推…

K8S实现零宕机实践

越来越多的大厂都在上云、上容器、上K8S编排&#xff0c;K8S和容器云确实帮助我们解决了很多问题。但是&#xff0c;带来方便的同时&#xff0c;也让我们的架构变得更复杂了&#xff0c;更难于依靠“老经验”来解决问题了。虽然我们不用再费力考虑一层的问题&#xff0c;怎么实…

链表习题-力扣oj (附加思路版)

LCR 140. 训练计划 IIhttps://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 思路&#xff1a;双指针&#xff0c;快指针先走cnt…

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv&#xff0c;双击LiteEnv &#xff0c;在右侧选择对应系统的env文件&#xff0c;我的是win64系统&#xff0c;所以文件名为win64.env 再双击 win64.env &#xff0c;关闭当前窗口&…

Redis冲冲冲——redis数据类型及对应的数据结构

目录 引出redis数据类型及对应的数据结构Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户…

HarmonyOS NEXT应用开发案例——自定义TabBar

介绍 本示例主要介绍了TabBar中间页面如何实现有一圈圆弧外轮廓以及TabBar页签被点击之后会改变图标显示&#xff0c;并有一小段动画效果。 效果图预览 使用说明&#xff1a; 依次点击tabBar页面&#xff0c;除了社区图标之外&#xff0c;其它图标往上移动一小段距离。 实现…

uniapp 手写 简易 时间轴 组件

一、案例如图 该案例设计条件&#xff1a; 左侧时间 和竖线、点、内容都是居中对其的&#xff0c;上下时间点中间要有一段距离 二、编写逻辑 1. 布局结构&#xff1a;一共三个元素&#xff0c;左侧是时间和黑点&#xff0c;中间是线条&#xff0c;右侧是内容 2. 样式难点&#…

换手机后日记不见了怎么恢复?换手机日记内容同步方法

曾经&#xff0c;我使用的是一款苹果手机&#xff0c;这部手机陪伴了我整整3年。随着时间的推移&#xff0c;手机内存不够用成为了我面临的一个大问题&#xff0c;因此我决定更换一部新手机——这次我选择了OPPO品牌。在更换手机的过程中&#xff0c;我利用手机搬家软件一键同步…

Flutter使用auto_updater实现windows/mac桌面应用版本升级功能

因为windows应用一般大家都是从网上下载的&#xff0c;后期版本肯定会更新&#xff0c;那用flutter开发windows应用&#xff0c;怎么实现应用内版本更新功能了&#xff1f;可以使用auto_updater库&#xff0c; 这个插件允许 Flutter 桌面 应用自动更新自己 (基于 sparkle 和 wi…

【三维重建】VastGaussian:用于大场景重建的大3D Gaussian(CVPR 2024)

题目&#xff1a;VastGaussian: Vast 3D Gaussians for Large Scene Reconstruction 来源&#xff1a;清华大学&#xff1b;华为诺亚&#xff1b;中国科学院 链接&#xff1a;https://vastgaussian.github.io/ 总结&#xff1a;VastGaussian&#xff1a;基于3D GS的分块优化重…

mysql数据库(下)

目录 约束 约束的概念和分类 1、约束的概念&#xff1a; 2、约束的分类 1、主键约束 2、默认约束 3、非空约束 4、唯一约束 5、外键约束 约束 约束的概念和分类 1、约束的概念&#xff1a; 约束时作用于表中列上的规则&#xff0c;用于限制加入表的数据约束的存在保证…

【网站项目】105校园车辆管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

SHARE 100M PRO:航测领域的多面手

在无人机航测领域&#xff0c;SHARE 100M PRO单镜头航测相机以其1.02亿像素的中画幅传感器和创新技术&#xff0c;正在重塑倾斜摄影的精度和效率。这款相机不仅在城市规划和土地管理中发挥着重要作用&#xff0c;还在环境监测、基础设施建设、农业管理等多个航测领域展现出其卓…

自编C++题目——几点了.easy ver

题目难度 入门 题目描述 一个老外用一口不流利的中文问你&#xff1a;“Xian zai ji dian le?”你看了一眼表&#xff0c;知道了现在是&#xff0c;你准备用这样的形式写在纸上&#xff1a; Now is m past/to h. 如果你看不懂&#xff0c;举个例子&#xff1a; 当h10&#…

treeview控件的应用

1.分类 treeview控件的基本应用&#xff0c;可以用于商品分类、文件分类等等。 2.辅助决策 treeview可以组成决策树&#xff0c;用来帮助人们做选择。比如说今天中午吃什么菜&#xff1f; 如果我来选择的话&#xff0c;那就是&#xff1a;不吃辣-鲁菜-糖醋鲤鱼。 3.求解算…

C# OpenCvSharp DNN Yolov8-OBB 旋转目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN Yolov8-OBB 旋转目标检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-26T08:38:44.171849 description&#xff1a;Ultralytics YOLOv8s-obb model trained on runs/DOT…

【MySQL系列 05】Schema 与数据类型优化

良好的数据库 schema 设计和合理的数据类型选择是 SQL 获得高性能的基石。 一、选择优化的数据类型 MySQL 支持的数据类型非常多&#xff0c;选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据&#xff0c;下面几个简单的原则都有助于做出更好的选择。 1. …