首页 > 其他分享 >MQTTnet3.1.2 服务端

MQTTnet3.1.2 服务端

时间:2022-09-29 08:44:05浏览次数:54  
标签:Console public using new MQTTnet3.1 mqttServer 服务端 客户端

using MQTT;
using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet;
using MQTTnet.Server;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Client.Receiving;

namespace MQTT
{
    internal class Program
    {
        static void Main(string[] args)
        {
            MqttServerClass serverClass = new MqttServerClass();
            serverClass.StartMqttServer().Wait();
            Console.ReadLine();
        }
    }
    public static class Config
    {
        public static int Port { get; set; } = 1883;
        public static string UserName { get; set; } = "cyw";
        public static string Password { get; set; } = "123456";

    }
    public class UserInstance
    {
        public string ClientId { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
    }
    public class MqttServerClass
    {
        private IMqttServer mqttServer;
        private List<MqttApplicationMessage> messages = new List<MqttApplicationMessage>();
        public async Task StartMqttServer()
        {
            try
            {
                if (mqttServer == null)
                {
                    var optionsBuilder = new MqttServerOptionsBuilder()
                        .WithDefaultEndpoint()
                        .WithDefaultEndpointPort(Config.Port)
                        .WithConnectionValidator(
                         c =>
                         {
                             var flag = c.Username == Config.UserName && c.Password == Config.Password;
                             if (!flag)
                             {
                                 c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
                                 return;
                             }
                             //设置代码为 Success
                             c.ReasonCode = MqttConnectReasonCode.Success;
                             //instances.Add(new UserInstance()  //缓存到内存的List集合当中
                             //{
                             //    ClientId = c.ClientId,
                             //    UserName = c.Username,
                             //    Password = c.Password
                             //});
                         })
                        //订阅拦截器
                        .WithSubscriptionInterceptor(
                                        c =>
                                        {
                                            if (c == null) return;
                                            c.AcceptSubscription = true;
                                        })
                        //应用程序消息拦截器
                        .WithApplicationMessageInterceptor(
                                        c =>
                                        {
                                            if (c == null) return;
                                            c.AcceptPublish = true;
                                        })
                        //clean sesison是否生效
                        .WithPersistentSessions();
                    mqttServer = new MqttFactory().CreateMqttServer();

                    //客户端断开连接拦截器
                    //mqttServer.UseClientDisconnectedHandler(c =>
                    //{
                    //    //var user = instances.FirstOrDefault(t => t.ClientId == c.ClientId);
                    //    //if (user != null)
                    //    //{
                    //    //    instances.Remove(user);
                    //    //}
                    //});

                    //服务开始
                    mqttServer.StartedHandler = new MqttServerStartedHandlerDelegate(OnMqttServerStarted);
                    //服务停止
                    mqttServer.StoppedHandler = new MqttServerStoppedHandlerDelegate(OnMqttServerStopped);
                    //客户端连接
                    mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(OnMqttServerClientConnected);
                    //客户端断开连接(此事件会覆盖拦截器)
                    mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(OnMqttServerClientDisconnected);
                    //客户端订阅
                    mqttServer.ClientSubscribedTopicHandler = new MqttServerClientSubscribedTopicHandlerDelegate(OnMqttServerClientSubscribedTopic);
                    //客户端取消订阅
                    mqttServer.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(OnMqttServerClientUnsubscribedTopic);
                    //服务端收到消息
                    mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnMqttServerApplicationMessageReceived);

                    await mqttServer.StartAsync(optionsBuilder.Build());

                    //主动发送消息到客户端
                    //await mqttServer.PublishAsync(new
                    //     MqttApplicationMessage
                    //{
                    //    Topic = "testtopic",
                    //    Payload = Encoding.UTF8.GetBytes("dsdsd")
                    //});
                    //mqttServer.GetClientStatusAsync();
                    //mqttServer.GetRetainedApplicationMessagesAsync();
                    //mqttServer.GetSessionStatusAsync();

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"MQTT Server start fail.>{ex.Message}");
            }
        }
        private void OnMqttServerStarted(EventArgs e)
        {
            if (mqttServer.IsStarted)
            {
                Console.WriteLine("MQTT服务启动完成!");
            }
        }
        private void OnMqttServerStopped(EventArgs e)
        {
            if (!mqttServer.IsStarted)
            {
                Console.WriteLine("MQTT服务停止完成!");
            }
        }
        private void OnMqttServerClientConnected(MqttServerClientConnectedEventArgs e)
        {
            Console.WriteLine($"客户端[{e.ClientId}]已连接");
        }
        private void OnMqttServerClientDisconnected(MqttServerClientDisconnectedEventArgs e)
        {
            Console.WriteLine($"客户端[{e.ClientId}]已断开连接!");
        }
        private void OnMqttServerClientSubscribedTopic(MqttServerClientSubscribedTopicEventArgs e)
        {
            Console.WriteLine($"客户端[{e.ClientId}]已成功订阅主题[{e.TopicFilter}]!");
        }
        private void OnMqttServerClientUnsubscribedTopic(MqttServerClientUnsubscribedTopicEventArgs e)
        {
            Console.WriteLine($"客户端[{e.ClientId}]已成功取消订阅主题[{e.TopicFilter}]!");
        }
        private void OnMqttServerApplicationMessageReceived(MqttApplicationMessageReceivedEventArgs e)
        {
            messages.Add(e.ApplicationMessage);
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
            Console.WriteLine($"客户端[{e.ClientId}]>> Topic[{e.ApplicationMessage.Topic}] Payload[{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[] { })}] Qos[{e.ApplicationMessage.QualityOfServiceLevel}] Retain[{e.ApplicationMessage.Retain}]");
        }
    }
}

 

标签:Console,public,using,new,MQTTnet3.1,mqttServer,服务端,客户端
From: https://www.cnblogs.com/5ishare/p/16740199.html

相关文章

  • 关于文件下载时服务端http header的设置
    最近想要实现通过浏览器下载html文件时直接打开,而不是下载的功能,了解了下这方面相关的几个header设置项,简单记录下。主要是content-type和content-disposition这两项,这两......
  • gitlab 服务端 hook, 拦截糟糕的提交到仓库
    点击上方关注我们背景当我们接收一份新的代码,代码拿到手要做的第一件事就是gitlog,看看这份代码的提交记录,最近提交的情况,做了些什么。但往往看到的gitlog杂乱无章,不知......
  • 14、Android Studio通过http向C++服务端传递base64图片,然后对图片处理(写入本地)返回数
    基本思想:最近做了一个项目需要使用将androidstudio中抓取的视频帧和一些数据上传服务器处理,然后将处理结果返回给androidstudio手机端一、因为不太会写通信,着实补充了一......
  • node 服务端口占用解决方法
    如果你的前端项目平时启动都好好的,突然有一天启动时报错,提示端口被占用了,可以使用如下方法试试这里不是要说去找哪个端口占用,然后停掉这个进程,因为亲身经历,有时候找不到占......
  • wazuh服务端安装
    wazuh简介Wazuh是一个免费、开源和企业级的安全监控解决方案,用于威胁检测、完整性监控、事件响应和合规性。官网地址:https://wazuh.com/对于wazuh与其他开源安全产品......
  • 当API服务端options.Authority ="http://localhost:5001" 报错误
      //验证传入的令牌以确保它来自受信任的颁发者//验证令牌是否可以与此api一起使用(又名受众)//将身份验证服务添加到DI(依赖注入)并将身份验证中间件添加到管道bu......
  • Redis服务端事件处理流程分析
    一、事件处理1.1什么是事件Redis为什么运行得比较快?原因之一就是它的服务端处理程序用了事件驱动的处理方式。那什么叫事件处理?就是把处理程序当成一个一个的事件处......
  • Linux主机安装VNC服务端
    yuminstalltigervnctigervnc-servervi/etc/sysconfig/vncservers#VNCSERVERS="1:vncuser2:john"#usethemethodformoreuserVNCSERVERS="0:root1:viewer"#VN......
  • 客户端通过gethostbyname获取服务端IP地址
    #include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#include<string.h>#include......
  • 安装 UrBackup服务端
    安装UrBackup服务器配置固定IP:https://www.cnblogs.com/congcongdi/p/10149925.html1.1安装urbackupserver系统。cd/etc/yum.repos.d/wgethttps://download.ope......