C#编写MQTT客户端软件

news2024/10/10 14:25:01

        主要参考C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客

        但由于使用的.NET版本和MQTT库版本存在差异,因此有些不同。

        MQTT协议内容在此不做描述,仅介绍VS使用C#的实现过程。本次使用VS2015,.netframwork4.6。

        C#语言本身没有MQTT的库,当然你也可以利用TCP自行完成MQTT协议实现,一般我们采用第三方的mqtt库。

        新建一个winform项目,在解决方案资源管理器的“引用”右键,选择“管理Nuget程序包”,找到下面两个包并安装。注意,我这里用的版本是V3.0.0。

        接下来根据需要绘制窗体,添加控件。这里有两个按钮,一个连接MQTT服务器,一个是断开,然后就是订阅和发布相关的输入框和按钮。除此以外,我这边需要测试发布几条指令,做到下方的按钮里了,省的手动输入。

        接下来是代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime;
using System.Windows.Forms;
using System.Threading.Tasks;


using MQTTnet.Protocol;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Extensions.ManagedClient;
using MQTTnet;


namespace MQTT
{
	public partial class Form1: Form
	{
        private IManagedMqttClient mqttClient;
        private bool conFlag = false;
        private int timeout = 0;
        public Form1()
		{
			InitializeComponent();
		}

        private async void button1_Click(object sender, EventArgs e)
        {
            var mqttclientOptions = new MqttClientOptionsBuilder()
                .WithClientId("mushike")
                .WithTcpServer("39.105.165.228", 1883)
                .WithCredentials("admin", "admin");

            var options = new ManagedMqttClientOptionsBuilder()
                        .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                        .WithClientOptions(mqttclientOptions.Build())
                        .Build();
            //开启
            await mqttClient.StartAsync(options);
            timer1.Enabled = true;
            timeout = 0;
        }

        private async void button2_Click(object sender, EventArgs e)
        {
            if (mqttClient != null)
            {
                if (mqttClient.IsStarted)
                {
                    await mqttClient.StopAsync();
                }
                timer1.Enabled = false;
                button1.BackColor = SystemColors.Control;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var factory = new MqttFactory();
            mqttClient = factory.CreateManagedMqttClient();//创建客户端对象

            //绑定断开事件
            mqttClient.UseDisconnectedHandler(async ee =>
            {               
                // 等待 5s 时间
                await Task.Delay(TimeSpan.FromMilliseconds(500));
                WriteLog("\r\n与服务器之间的连接断开");
                conFlag = false;
            });

            //绑定接收事件
            mqttClient.UseApplicationMessageReceivedHandler(aa =>
            {
                try
                {
                    string msg = aa.ApplicationMessage.ConvertPayloadToString();
                    WriteLog("\r\n>> 收到主题:" + aa.ApplicationMessage.Topic  
                        +  ",\r\n内容为:" + msg);
                    //WriteLog(">>> 消息:" + msg + ",QoS =" + aa.ApplicationMessage.QualityOfServiceLevel + ",客户端=" + aa.ClientId + ",主题:" + aa.ApplicationMessage.Topic);
                }
                catch (Exception ex)
                {
                    WriteLog($"\r\n+ 消息 = " + ex.Message);
                }
            });

            //绑定连接事件
            mqttClient.UseConnectedHandler(ee =>
            {
                WriteLog("\r\n>> 连接到服务器成功");
                conFlag = true;
            });
        }
        private void WriteLog(string message)
        {
            if(textBox1.InvokeRequired)
            {
                textBox1.Invoke(new Action(() =>
                {
                    textBox1.AppendText(message);
                }));
            }
            else
            {
                textBox1.AppendText(message);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (conFlag == false)
                return;
            string topic = textBox2.Text;
            string message = textBox3.Text;
            mqtt_publish(topic, message);
        }

        private async void button4_Click(object sender, EventArgs e)
        {
            if (conFlag == false)
                return;
            string topic = textBox4.Text;
            if (string.IsNullOrWhiteSpace(topic))
            {
                WriteLog("\r\n>> 请输入主题");
                return;
            }
            await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic(topic).WithAtMostOnceQoS().Build());//最多一次, QoS 级别0
            WriteLog($"\r\n>> 成功订阅");

        }


        private async void mqtt_publish(string topic,string message)
        {
            if (conFlag == false)
                return;
            if (string.IsNullOrWhiteSpace(topic))
            {
                WriteLog("\r\n>> 请输入主题");
                return;
            }
            var result = await mqttClient.PublishAsync(
                topic,
                message,
                MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce);//恰好一次, QoS 级别1  
            WriteLog($"\r\n>> 主题:{topic},\r\n消息:{message},\r\n结果: {result.ReasonCode}");
        }

        private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.textBox1.Text = "";
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            timeout++;
            if (conFlag == true)
            {
                button1.BackColor = Color.Green;
                timer1.Enabled = false;
            }
            else
            {
                if (timeout > 30)
                {
                    timeout = 0;
                    timer1.Enabled = false;
                    WriteLog("\r\n>> 连接服务器失败");
                }
            }
        }

        private void button11_Click(object sender, EventArgs e)
        {
            string topic = "test111";
            string message = "#01R00\r";
            mqtt_publish(topic, message);
        }

        private void button10_Click(object sender, EventArgs e)
        {
            string topic = "test111";
            string message = "#01R01\r";
            mqtt_publish(topic, message);
        }

        private void button5_MouseDown(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000100000000E4";
            mqtt_publish(topic, message);
        }

        private void button5_MouseUp(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000000000E5";
            mqtt_publish(topic, message);
        }

        private void button6_MouseDown(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000200000000E3";
            mqtt_publish(topic, message);
        }

        private void button6_MouseUp(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000000000E5";
            mqtt_publish(topic, message);
        }

        private void button8_MouseDown(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000020000E3";
            mqtt_publish(topic, message);
        }

        private void button8_MouseUp(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000000000E5";
            mqtt_publish(topic, message);
        }

        private void button7_MouseDown(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000040000E1";
            mqtt_publish(topic, message);

        }

        private void button7_MouseUp(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000000000E5";
            mqtt_publish(topic, message);
        }

        private void button9_MouseDown(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000020000000C5";
            mqtt_publish(topic, message);
        }

        private void button9_MouseUp(object sender, MouseEventArgs e)
        {
            string topic = "test333";
            string message = "F10209100000000000000000E5";
            mqtt_publish(topic, message);
        }
    }
}

         本次参照 C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客 编写MQTT相关的代码时,报了一堆错,本质原因还是版本不一致导致,比如使用参考博客的MQTTNet V3.0.15就用不了。因此需要特别注意,本次使用的环境为VS2015+.Net 4.6+MQTTNet V3.0.0。

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

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

相关文章

从零到一:基于 K3s 快速搭建本地化 kubeflow AI 机器学习平台

背景 Kubeflow 是一种开源的 Kubernetes 原生框架,可用于开发、管理和运行机器学习工作负载,支持诸如 PyTorch、TensorFlow 等众多优秀的机器学习框架,本文介绍如何在 Mac 上搭建本地化的 kubeflow 机器学习平台。 注意:本文以 …

STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005M+TA1005M)

资料下载地址:STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005MTA1005M) 1、摘要 5、基于STM32F103单片机智能电表交流电压电流设计 本设计由STM32单片机核心板电路交流电压电流检测模块电路WIFI模块电路指示灯电路组成。 1、通过电压互感器TV100…

【Canavs与艺术】绘制蓝白绶带大卫之星勋章

【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用Canvas绘制蓝白绶带大卫之星勋章</title><style type&quo…

计算机网络—TCP协议详解:特性、应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

我愿把这个网站成为全球最强AI网站!弄100多个AI伺候你??

家人们&#xff0c;你们猜我发现了什么牛逼的AI网站&#xff1f;&#xff1f; 直接上图&#xff1a; 这个网站&#xff0c;聚合了国内外100多个顶尖的AI&#xff0c;包括了OpenAI家的GPT3.5、GPT4、GPT4V、GPT4.5系列&#xff0c;以及Anthropic家的Claude3 Opus、Claude3 Sone…

Spark-Scala语言实战(11)

在之前的文章中&#xff0c;我们学习了如何在spark中使用RDD中的cartesian,subtract最终两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scal…

如何系统地自学Python

1、如何系统地自学Python 小白的话可以快速过一下某马&#xff0c;某谷。 主要关注Python有什么集合&#xff0c;里面的集合怎么使用 然后再找一个Python爬虫实战视频&#xff0c;先跟着视频敲一遍代码&#xff0c;然后再尝试自己做一遍 然后再找一个Python服务开发视频&am…

redis乱码\xac\xed\x00\x05t\x00H解决

发现数据库乱码&#xff1a; 这数据库是来自rdids队列list实现的一个简单队列&#xff0c;停止使用该list的服务&#xff0c;查看里面的值&#xff0c;发现 乱码\xac\xed\x00\x05t\x00H&#xff0c;如下图&#xff1a; 很明发送数据端的问题&#xff0c;检查代码&#xff1a; …

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

【python】python新闻内容zhua取分析词云可视化(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Redis的基础操作

目录 一、Redis命令工具 1.redis-cli 命令行工具 2.redis-benchmark测试工具 3.Redis数据库五大类型 1、String 2、List 3、Hash&#xff08;散列类型&#xff09; 4、set无序集合 5、sorted set 二、Redis数据库常用命令 1、set与get的使用 2.查看数据库中键的情况…

深度学习:神经网络模型的剪枝和压缩简述

深度学习的神经网路的剪枝和压缩&#xff0c;大致的简述&#xff0c; 主要采用&#xff1a; network slimming&#xff0c;瘦身网络... 深度学习网络&#xff0c;压缩的主要方式&#xff1a; 1.剪枝&#xff0c;nerwork pruing&#xff0c; 2.稀疏表示&#xff0c;sparse rep…

基于向量数据库搭建自己的搜索引擎

前言【基于chatbot】 厌倦了商业搜索引擎搜索引擎没完没了的广告&#xff0c;很多时候&#xff0c;只是需要精准高效地检索信息&#xff0c;而不是和商业广告“斗智斗勇”。以前主要是借助爬虫工具&#xff0c;而随着技术的进步&#xff0c;现在有了更多更方便的解决方案&…

2024-HW --->SSRF

这不是马上准备就要护网了嘛&#xff0c;如火如荼的报名ing&#xff01;&#xff01;&#xff01;那么小编就来查缺补漏一下以前的web漏洞&#xff0c;也顺便去收录一波poc&#xff01;&#xff01;&#xff01;&#xff01; 今天讲的主人公呢就是SSRF&#xff0c;以前学的时候…

QA测试开发工程师面试题满分问答5: 内存溢出和内存泄漏问题

概念阐述 内存溢出&#xff08;Memory Overflow&#xff09;和内存泄漏&#xff08;Memory Leak&#xff09;是与计算机程序中的内存管理相关的问题&#xff0c;它们描述了不同的情况。 内存溢出是指程序在申请内存时&#xff0c;要求的内存超出了系统所能提供的可用内存资源…

不到2000字,轻松带你搞懂STM32中GPIO的8种工作模式

大家好&#xff0c;我是知微&#xff01; 学习过单片机的小伙伴对GPIO肯定不陌生&#xff0c;GPIO &#xff08;general purpose input output&#xff09;是通用输入输出端口的简称&#xff0c;通俗来讲就是单片机上的引脚。 在STM32中&#xff0c;GPIO的工作模式被细分为8种…

N1912A安捷伦N1912A功率计

181/2461/8938产品概述&#xff1a; 安捷伦N1912A双通道P系列宽带功率传感器为R&D和制造工程师提供精确和可重复的功率测量&#xff0c;应用市场包括航空航天和国防&#xff08;雷达&#xff09;、无线通信和无线802.11a/b/g网络。该仪表/传感器组合提供的测量包括峰值功率…

XXLJob中GLUE模式实现在线编写java/shell/python/php/nodejs/powerShell---SpringCloud工作笔记202

1.起因: 之前就一直想实现类似的功能,今天总于找到有可以参考的东西了,这个思路可以帮助实现这种功能. 2.获得灵感 就是:我想实现通过在线编写代码,来扩展我们平台的能力,这样随着业务的扩展,不用我们每次都修改了代码,再去部署,这样就比较麻烦,今天偶尔发现,对于xxljob来说.有…

React 入门

一、官网地址 英文官网: https://reactjs.org/中文官网: https://react.docschina.org/ 二、React 特点 声明式编码组件化编码React Native 编写原生应用高效&#xff08;优秀的 Diffing 算法&#xff09;高效的原因&#xff1a;1.使用虚拟DOM&#xff0c;不总是直接操作页面…

从 Redis 开源协议变更到 ES 国产化:一次技术自主的机遇

引言 近日&#xff0c;Redis Labs 宣布其主导的开源项目 Redis 将采用双重源代码可用许可证&#xff08;RSALv2&#xff09;和服务器端公共许可证&#xff08;SSPLv1&#xff09;。这一重大决策标志着 Redis 从传统的 BSD 许可证向更加严格的控制权转变&#xff0c;同时也引发…