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.pswp.cn/news/900439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900439.shtml
英文地址,請注明出處:http://en.pswp.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…