首页 > 其他分享 >.net6操作mqtt

.net6操作mqtt

时间:2023-07-17 15:01:38浏览次数:49  
标签:mqttClient Task mqtt 消息 arg net6 操作 服务端 客户端

.net6操作mqtt

客户端

using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SendMessageMqttClinet
{
    public class MqttService
    {
        private IMqttClient _mqttClient = null ;

        public IMqttClient MqttServiceCreate(string host, int port, string clientId)
        {

            if (_mqttClient == null)
            {
                MqttClientStart(host, port, clientId);
            }
            else
            {
                return _mqttClient;
            }
            return null;
        }

        public async Task<IMqttClient> MqttClientStart(string host,int port,string clientId)
        {
            var optionsBuilder = new MqttClientOptionsBuilder()
                .WithTcpServer(host, port) // 要访问的mqtt服务端的 ip 和 端口号
                //.WithCredentials("admin", "123456") // 要访问的mqtt服务端的用户名和密码
                .WithClientId(clientId) // 设置客户端id
                .WithCleanSession()
                .WithTls(new MqttClientOptionsBuilderTlsParameters
                {
                    UseTls = false  // 是否使用 tls加密
                });

            var clientOptions = optionsBuilder.Build();
            _mqttClient = new MqttFactory().CreateMqttClient();

            _mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync; // 客户端连接成功事件
            _mqttClient.DisconnectedAsync += _mqttClient_DisconnectedAsync; // 客户端连接关闭事件
            _mqttClient.ApplicationMessageReceivedAsync += _mqttClient_ApplicationMessageReceivedAsync; // 收到消息事件

            await _mqttClient.ConnectAsync(clientOptions);

            return _mqttClient;
        }

        /// <summary>
        /// 客户端连接关闭事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
        {
            Console.WriteLine($"客户端已断开与服务端的连接……");
            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端连接成功事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg)
        {
            Console.WriteLine($"客户端已连接服务端……");

            // 订阅消息主题
            // MqttQualityOfServiceLevel: (QoS):  0 最多一次,接收者不确认收到消息,并且消息不被发送者存储和重新发送提供与底层 TCP 协议相同的保证。
            // 1: 保证一条消息至少有一次会传递给接收方。发送方存储消息,直到它从接收方收到确认收到消息的数据包。一条消息可以多次发送或传递。
            // 2: 保证每条消息仅由预期的收件人接收一次。级别2是最安全和最慢的服务质量级别,保证由发送方和接收方之间的至少两个请求/响应(四次握手)。
            _mqttClient.SubscribeAsync("topic_02", MqttQualityOfServiceLevel.AtLeastOnce);

            return Task.CompletedTask;
        }

        /// <summary>
        /// 收到消息事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
        {
            Console.WriteLine($"ApplicationMessageReceivedAsync:客户端ID=【{arg.ClientId}】接收到消息。 Topic主题=【{arg.ApplicationMessage.Topic}】 消息=【{Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}】 qos等级=【{arg.ApplicationMessage.QualityOfServiceLevel}】");
            return Task.CompletedTask;
        }

        public void Publish(string topic,string data)
        {
            var message = new MqttApplicationMessage
            {
                Topic = topic,
                Payload = Encoding.Default.GetBytes(data),
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
                Retain = false  // 服务端是否保留消息。true为保留,如果有新的订阅者连接,就会立马收到该消息。
            };
            _mqttClient.PublishAsync(message);
        }
    }
}

服务端

public class MqttClientService
    {
        public static IMqttClient _mqttClient;
        public void MqttClientStart()
        {
            var optionsBuilder = new MqttClientOptionsBuilder()
                .WithTcpServer("127.0.0.1", 10086) // 要访问的mqtt服务端的 ip 和 端口号
                .WithCredentials("admin", "123456") // 要访问的mqtt服务端的用户名和密码
                .WithClientId("testclient02") // 设置客户端id
                .WithCleanSession()
                .WithTls(new MqttClientOptionsBuilderTlsParameters
                {
                    UseTls = false  // 是否使用 tls加密
                });

            var clientOptions = optionsBuilder.Build();
            _mqttClient = new MqttFactory().CreateMqttClient();

            _mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync; // 客户端连接成功事件
            _mqttClient.DisconnectedAsync += _mqttClient_DisconnectedAsync; // 客户端连接关闭事件
            _mqttClient.ApplicationMessageReceivedAsync += _mqttClient_ApplicationMessageReceivedAsync; // 收到消息事件

            _mqttClient.ConnectAsync(clientOptions);


        }

        /// <summary>
        /// 客户端连接关闭事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
        {
            Console.WriteLine($"客户端已断开与服务端的连接……");
            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端连接成功事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg)
        {
            Console.WriteLine($"客户端已连接服务端……");

            // 订阅消息主题
            // MqttQualityOfServiceLevel: (QoS):  0 最多一次,接收者不确认收到消息,并且消息不被发送者存储和重新发送提供与底层 TCP 协议相同的保证。
            // 1: 保证一条消息至少有一次会传递给接收方。发送方存储消息,直到它从接收方收到确认收到消息的数据包。一条消息可以多次发送或传递。
            // 2: 保证每条消息仅由预期的收件人接收一次。级别2是最安全和最慢的服务质量级别,保证由发送方和接收方之间的至少两个请求/响应(四次握手)。
            _mqttClient.SubscribeAsync("topic_02", MqttQualityOfServiceLevel.AtLeastOnce);

            return Task.CompletedTask;
        }

        /// <summary>
        /// 收到消息事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
        {
            Console.WriteLine($"ApplicationMessageReceivedAsync:客户端ID=【{arg.ClientId}】接收到消息。 Topic主题=【{arg.ApplicationMessage.Topic}】 消息=【{Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}】 qos等级=【{arg.ApplicationMessage.QualityOfServiceLevel}】");
            return Task.CompletedTask;
        }

        public void Publish(string data)
        {
            var message = new MqttApplicationMessage
            {
                Topic = "topic_02",
                Payload = Encoding.Default.GetBytes(data),
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
                Retain = true  // 服务端是否保留消息。true为保留,如果有新的订阅者连接,就会立马收到该消息。
            };
            _mqttClient.PublishAsync(message);
        }
    }

参考:https://www.cnblogs.com/weskynet/p/16441219.html

标签:mqttClient,Task,mqtt,消息,arg,net6,操作,服务端,客户端
From: https://www.cnblogs.com/OneSeting/p/17560128.html

相关文章

  • MySQL中对JSON数据操作(较全)
    MySQL对JSON数据操作链接:(160条消息)【MySQL】对JSON数据操作(全网最全)_mysqljson_0世界和平0的博客-CSDN博客创建json格式字段CREATETABLE`dept`(`id`int(11)NOTNULL,`dept`varchar(255)DEFAULTNULL,`json_value`jsonDEFAULTNULL,PRIMARYKEY(`id......
  • python操作mongodb实现读写分离
    读写分离默认情况下,MongoClient实例将查询发送到副本集的主要成员。要使用副节点作为查询,以实现读写分离,我们必须更改读取首选项:读取首选项在模块pymongo.ReadPreference下:PRIMARY:从主节点中读取(默认)PRIMARY_PREFERRED:优先从主节点读取,如果不可用则从副节点读取、SECOND......
  • Flutter | 使用 InkResponse和 InkWell组件 实现事件操作
    可以包裹不具备事件处理的组件,实现水波纹等点击事件的效果;InkWell水波纹限制在文本组件之内;InkResponse水波纹没有限制;InkResponse和InkWell都可以指定各种响应颜色、手势等相关属性;  InkWell(radius:200.0,focusColor:Colors.red,hove......
  • python操作mongodb基本使用
    使用pymongo,具体可以参考官方文档:语法上基本和原生mongodb是一样的,所以非常容易入手...https://pymongo.readthedocs.io/en/stable/tutorial.html日常使用importpprintimportpymongofrompymongo.collectionimportCollectionfrompymongo.databaseimportDatabasei......
  • 泛微OA节点后附加操作-update数据
    1.礼品领用申请流程,到人力资源部备案节点,由人力资源部填写“实际使用数量”,在该节点后减少对应礼品的库存数量。2.节点后附加操作2.1新建DML接口动作2.2填写信息3.DML语句updateuf_jczlsetkcsl=kcsl-'{?d.sjsl}'whereid='{?d.lpmc}'......
  • Git的基本概念及操作
    Git是目前最流行的分布式版本控制系统之一,广泛应用于软件开发行业。Git具备多人协作、分支管理、版本控制等功能,并且易于学习和使用。本文将详细介绍Git的相关知识,并且用相关代码辅助解释。Git的基本概念1.仓库(Repository)仓库是Git中最重要的概念之一,它是存储代码和相关历史记录的......
  • 良心推荐!5款支持Linux系统的国产软件,兼容国产操作系统
    虽然市面上大多数用户使用的是Windows操作系统,但也有不少使用Linux系统的用户,特别是国产操作系统的崛起,让Linux系统阵营的用户越来越多。Linux不像Windows那样,有着完整的生态环境丰富的软件应用,但也逐渐在完善中,下面我将为大家推荐几款国产良心软件,不仅支持Linux系统,还兼容银河麒......
  • SqlServer基本操作
    一、创建数据库和表1、工具建库建表2、脚本建库建表USE[master]GOCREATEDATABASE[ZhaoXiEdu]CONTAINMENT=NONEONPRIMARY(NAME=N'ScoreInfo',FILENAME=N'D:\ScoreInfo.mdf',SIZE=8192KB,MAXSIZE=UNLIMITED,FILEGROWTH=65536KB)LOGON(NAME......
  • Linux操作系统
    1.1操作系统操作系统:所有硬件设备组装完成后的第一层软件,能够使用户使用硬件设备的软件即为操作系统  常见分类:桌面操作系统:windows/macoS/Linux移动端操作系统:Android(安卓)/ios(苹果)服务器操作系统:Linux/windowsServer嵌入式操作系统:Android(底层是Linux......
  • ASP.NET Core Web API中操作方法中的参数来源
    在ASP.NETCoreWebAPI中,有多种方式可以传递参数给操作方法。以下是一些常见的参数传递方式:路由参数(RouteParameters):参数值从URL的路由中提取。//Route:api/users/{id}[HttpGet("api/users/{id}")]publicIActionResultGetUserById(intid){//使用id执行操作......