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

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

直接上代码

nuget引用

MQTTnet

客户端代码

csharp 复制代码
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;
            };
        }



    }
}

调用

我这里是控制台项目

csharp 复制代码
//初始化
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());
}
相关推荐
菜鸟特工0073 小时前
javax.net.ssl.SSLPeerUnverifiedException 异常如何处理
网络协议·.net·ssl
疯狂敲代码的老刘4 小时前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
牧马人win4 小时前
Dapper轻量级扩展库SmartDapper
.net·dapper
吹牛不交税5 小时前
安装Framework4.0时提示:Microsoft .NET Framework 4 已是此操作系统的一部分。不需要安装 .NET Framework
microsoft·.net
love530love5 小时前
Windows 下 GCC 编译器安装与排错实录
人工智能·windows·python·gcc·msys2·gtk·msys2 mingw 64
猫头虎6 小时前
OpenClaw开源汉化发行版:介绍、下载、安装、配置教程
运维·windows·开源·aigc·ai编程·agi·csdn
luffy54596 小时前
windows下通过docker-desktop创建redis实例
windows·redis·docker·容器
大尚来也6 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
postgresql·sqlite·.netcore
程序员敲代码吗6 小时前
Windows组策略限制规避指南:深入解析与实际操作
windows
无风听海6 小时前
.NET10之ASP.NET Core的Filter管线
java·asp.net·.net