Winform MQTT客户端连接方式

项目中使用到Winform的数据转发服务,所以记录下使用到的方法。

一.创建单例模板

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp.Scripts
{public class SingleTon<T>where T:SingleTon<T>,new(){private static T m_instance;private static readonly object m_lockObject = new object();public static T GetInstance {get {if (m_instance==null){lock (m_lockObject){if (m_instance == null){m_instance = new T();}}}return m_instance;}}}
}

二. 创建客户端连接

using MQTTnet; 
using MQTTnet.Client; 
using MQTTnet.Extensions.ManagedClient;
using MQTTnet.Protocol;
using MQTTnet.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp.Scripts
{public class MQTTClientConnent:SingleTon<MQTTClientConnent>{private IMqttClient m_mqttClient = null;private IManagedMqttClient m_managedmqttClient;private MqttFactory Factory = new MqttFactory();/// <summary>/// 操作参数/// </summary>private MqttClientOptions Options;/// <summary>/// 消息参数/// </summary>private ManagedMqttClientOptions ManagedOptions;private string m_UDPTitleS;private string MQTTUserName;private string MQTTPWD;/// <summary>/// 客户端初始化/// </summary>public void Client_Init(){m_UDPTitleS = GetConfigurationSetting.GetInstance.GetKeyValue("UDPTitle");MQTTUserName = GetConfigurationSetting.GetInstance.GetKeyValue("MQTTUserName");MQTTPWD = GetConfigurationSetting.GetInstance.GetKeyValue("MQTTPWD");//配置初始化//配置连接参数Options = new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1", 1883).WithClientId("XWJiJuID").WithCredentials(MQTTUserName, MQTTPWD).WithWillQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)// .WithCleanSession().WithKeepAlivePeriod(TimeSpan.FromSeconds(5)).Build();//配置重连机制ManagedOptions = new ManagedMqttClientOptionsBuilder().WithAutoReconnectDelay(TimeSpan.FromSeconds(5)).WithClientOptions(Options).Build();//创建客户端m_managedmqttClient = Factory.CreateManagedMqttClient();//配置数据接收事件//  m_managedmqttClient.ApplicationMessageReceivedAsync += Receive_Event;m_managedmqttClient.ConnectedAsync += Connected_Event;m_managedmqttClient.DisconnectedAsync += Disconnected_Event;}public async Task ConnectMqttServerAsync(){Client_Init();try{//订阅主题string[] topicArray = new string[] { };if (topicArray.Length > 0){await m_managedmqttClient.SubscribeAsync(topicArray.Select(t => new MqttTopicFilterBuilder().WithTopic(t).WithAtMostOnceQoS().Build()).ToArray());}//连接服务器await m_managedmqttClient.StartAsync(ManagedOptions);}catch (Exception e){Console.WriteLine(e);}#region m_mqttClient//配置连接参数//var options = new MqttClientOptionsBuilder()//    .WithTcpServer("127.0.0.1", 1883)//    .WithClientId(Guid.NewGuid().ToString())//     .WithCleanSession()//     .WithKeepAlivePeriod(TimeSpan.FromSeconds(5))//    .Build();//if (m_mqttClient == null)//{//    m_mqttClient = new MqttFactory().CreateMqttClient();//    //  MqttServerOptions mqttServerOptions = new MqttServerOptions();//    //   mqttServer = new MqttFactory().CreateMqttServer(mqttServerOptions);//}// await m_mqttClient.ConnectAsync(options);// await m_mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("test/topic").Build());// 发布一条消息//var applicationMessage = new MqttApplicationMessageBuilder()//    .WithTopic("4001")//    .WithPayload("Hello, MQTT!")//    .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce)//    .Build();// await m_mqttClient.PublishAsync(applicationMessage);#endregionConsole.WriteLine("MQTT start-----=====");}private async Task Disconnected_Event(MqttClientDisconnectedEventArgs arg){await Task.Delay(100);Console.WriteLine("MQTT断开链接=====" + arg.ToString());}private async Task Receive_Event(MqttApplicationMessageReceivedEventArgs arg){await Task.Delay(100);}private async Task Connected_Event(MqttClientConnectedEventArgs arg){await Connected_Func(arg);}/// <summary>/// 连接服务器处理方法/// </summary>/// <param name="arg"></param>/// <returns></returns>public virtual async Task Connected_Func(MqttClientConnectedEventArgs arg){await Task.Delay(100);Console.WriteLine("MQTT连接成功====="+ arg.ToString());}//  MqttServer mqttServer;/// <summary>/// 客户端断开/// </summary>public void Disconnected(){m_managedmqttClient.StopAsync();// m_managedmqttClient.ApplicationMessageReceivedAsync -= Receive_Event;m_managedmqttClient.ConnectedAsync -= Connected_Event;m_managedmqttClient.DisconnectedAsync -= Disconnected_Event;}/// <summary>/// 发送消息/// </summary>/// <param name="topic">主题</param>/// <param name="content">内容</param>public virtual void SendMessage(string topic, string content){if (m_managedmqttClient != null && m_managedmqttClient.IsConnected)m_managedmqttClient.EnqueueAsync(m_UDPTitleS + topic, content);//   Console.WriteLine("MQTTSend=====" + m_UDPTitleS + topic + "__" + content);}}
}

三.配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup><appSettings> <add key="UDPPort" value="4001|4002|4003"/><add key="UDPTitle" value="DW"/><add key="DataStorageIP" value="192.168.1.110"/><add key="DataStoragePort" value="6666"/><add key="MQTTUserName" value="DW001"/><add key="MQTTPWD" value="123456"/></appSettings>
</configuration>

四.主程序调用

namespace ConsoleApp
{internal class Program{static void Main(string[] args){AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;Task task = MQTTClientConnent.GetInstance.ConnectMqttServerAsync();Console.ReadKey();}private static void CurrentDomain_ProcessExit(object sender, EventArgs e){Console.WriteLine("应用程序正在退出!");MQTTClientConnent.GetInstance.Disconnected();}}
}

五.解决方案生成后可以使用NSSM注册成服务

具体的使用方法可以搜索一下比较全面,计算机服务可以设置开机启动,这样的话能够自动连接MQTT服务器,进行数据的接受发送。

在这里插入图片描述

六.源码地址

源码地址

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

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

相关文章

Windows强制删除任何你想删除的文件和文件夹

Windows强制删除任何你想删除的文件和文件夹 本教程适用于 Windows 10/11 系统&#xff0c;工具和命令均经过验证。 为什么删除会失败&#xff1f; 权限不足&#xff1a;文件或文件夹可能需要管理员权限才能删除。文件被占用&#xff1a;某个程序正在使用目标文件&#xff0c…

Jmeter如何使用MD5进行加密?

在软件测试中&#xff0c;使用 JMeter 对数据进行 MD5 加密是一项常见需求&#xff0c;尤其是在模拟用户登录等涉及密码加密的场景时。下面详细介绍在 JMeter 里运用 MD5 加密的具体步骤。 1. 添加 BeanShell 预处理器 JMeter 本身没有直接的 MD5 加密功能&#xff0c;但可以…

4-c语言中的数据类型

一.C 语⾔中的常量 1.生活中的数据 整数&#xff1a; 100,200,300,400,500 小数: 11.11 22.22 33.33 字母&#xff1a; a&#xff0c;b&#xff0c;c&#xff0c;d A&#xff0c;B&#xff0c;C&#xff0c;D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…

中钧科技通过数字赋能,编织“数字互联网”助力数字化进程!

时间飞逝转眼间2025年已过去四分之一&#xff0c;作为一名95后回顾当下的生活&#xff0c;忍不住感慨10年和现在的对比。发现现在的手机支付、网上挂号、APP打车、在线学习、网络订餐、线上协同办公都以逐渐成为人们生活、工作的常态。也正是在这样的常态背景下&#xff0c;加快…

AI重塑云基础设施,亚马逊云科技打造AI定制版IaaS“样板房”

AI正在彻底重塑云基础设施。 IDC最新《2025年IDC MarketScape&#xff1a;全球公有云基础设施即服务&#xff08;IaaS&#xff09;报告》显示&#xff0c;AI正在通过多种方式重塑云基础设施&#xff0c;公有云IaaS有望继续保持快速增长&#xff0c;预计2025年全球IaaS的整体规…

高效深度学习lecture01

lecture01 零样本学习(Zero-Shot Learning, ZSL)&#xff1a; 模型可以在没有见过某种特定任务或类别的训练样本的情况下&#xff0c;直接完成对应的任务 利用知识迁移 模型在一个任务上训练时学到的知识&#xff0c;能够迁移到其他任务上比如&#xff0c;模型知道“狗”和“…

使用 iPerf 测试内网两台机器之间的传输速度

在现代网络管理中&#xff0c;确保内部网络&#xff08;内网&#xff09;的高效运行是至关重要的。为了评估和优化网络性能&#xff0c;我们需要一种可靠的方法来测试内网中不同设备间的传输速率。iPerf 作为一款广泛使用的工具&#xff0c;能够帮助我们准确测量两个节点之间的…

视频设备轨迹回放平台EasyCVR如何搭建公共娱乐场所远程视频监控系统

一、背景介绍 由于KTV、酒吧、足疗店等服务场所人员流动频繁、环境复杂&#xff0c;一直是治安管理的重点区域。为有效打击 “黄赌毒”、打架斗殴、寻衅滋事等违法犯罪的活动&#xff0c;打造安全有序的娱乐消费环境&#xff0c;我国相关部门将加大对这类场所的清查与管控力度…

vue进度条组件

<div class"global-mask" v-if"isProgress"><div class"contentBox"><div class"progresstitie">数据加载中请稍后</div><el-progress class"progressStyle" :color"customColor" tex…

Css:如何解决绝对定位子元素内容被父级元素overflow:hidden属性剪裁

一、问题描述 今天小伙伴提了一个bug&#xff0c;在点击列表项的“…”按钮应该出现的悬浮菜单显示不完整&#xff1a; 二、问题排查 一般这种问题&#xff0c;是由于悬浮菜单采用的是绝对定位&#xff0c;而父级采用了overflow:hidden属性。但需要注意的是&#xff0c;这里的…

JavaScript基础--01-JS简介

字面量&#xff1a;数字、字符串、布尔值 前言JavaScript背景Web前端有三层&#xff1a;发展历史JavaScript的发展&#xff1a;蒸蒸日上 JavaScript介绍JavaScript入门易学性JavaScript是脚本语言JavaScript的组成 JavaScript 的特点特点1&#xff1a;解释型语言特点2&#xff…

[leetcode] 面试经典 150 题——篇9:二叉树(番外:二叉树的遍历方式)

二叉树的遍历是指按照某种顺序访问二叉树中的每个节点。常见的遍历方式有四种&#xff1a;前序遍历&#xff08;Pre-order Traversal&#xff09;、中序遍历&#xff08;In-order Traversal&#xff09;、后序遍历&#xff08;Post-order Traversal&#xff09;以及层序遍历&am…

es基本概念

Elasticsearch 的架构与基本概念 Elasticsearch&#xff08;简称 ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于全文搜索、日志分析、实时数据分析等场景。以下是其架构概述及其基本概念的详细解释。 Elasticsearch 的架…

《星环之城:量子迷雾下的网络安全战记》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 序章&#xff1a;星环之陨 公元2145年&#xff0c;人类在火星轨道上建造了“星环之城”——一座由量子网络连接的太空城邦。它的中枢AI“盖娅”掌控着地球与殖民地的数据洪流&#xff…

《全栈+双客户端Turnkey方案》架构设计图

今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1&#xff1a;三种分布式部署方案:网关方案&#xff0c;超级服务器单服方案&#xff0c;直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…

打破界限:Android XML与Jetpack Compose深度互操作指南

在现有XML布局项目中逐步引入Jetpack Compose是现代Android开发的常见需求。本指南将全面介绍混合使用的最佳实践、技术细节和完整解决方案。 一、基础配置 1.1 Gradle配置 android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3…

React-narice安卓打包流程

**1. 生成签名密钥 在项目的 android/app 目录下生成签名密钥的步骤&#xff1a; 打开终端或命令提示符&#xff1a;导航到您的 React Native 项目的 android/app 目录。 运行以下命令生成密钥库文件&#xff1a; keytool -genkeypair -v -keystore my-release-key.keystor…

嵌入式AI开源生态指南:从框架到应用的全面解析

嵌入式AI开源生态指南&#xff1a;从框架到应用的全面解析 引言 随着人工智能技术的迅速发展&#xff0c;将AI能力部署到边缘设备上的需求日益增长。嵌入式AI通过在资源受限的微控制器上运行机器学习模型&#xff0c;实现了无需云连接的本地智能处理&#xff0c;大幅降低了延…

深度学习中模型量化那些事

在深度学习中模型量化可以分为3块知识点&#xff0c;数据类型、常规模型量化与大模型量化。本文主要是对这3块知识点进行浅要的介绍。其中数据类型是模型量化的基本点。常规模型量化是指对普通小模型的量化实现&#xff0c;通常止步于int8的量化&#xff0c;绝大部分推理引擎都…

Redis-list类型

这里只是介绍命令使用 列表是用来存储多个有序的字符串 可以用来充当栈和队列的角色 列表特点: 列表中的元素是有序的,可以通过索引下标来获取某个元素或者某个范围的元素 获取和删除有区别 元素可以重复 命令 LPUSH 将一个或者多个元素从左侧放入到list中(头插法) lp…