C#编写MQTT客户端软件

        主要参考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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode每日一题之专题一:双指针 ——复写零

复写零OJ链接:1089. 复写零 - 力扣(LeetCode) 题目: 解法(原地复写-双指针): 算法思路: 如果「从前向后」进⾏原地复写操作的话,由于 0 的出现会复写两次,导致…

无法打开pycharm虚拟环境

问题:在pycharm的terminal中执行pip命令,但是下载的包没有安装到该项目的虚拟环境中。 激活虚拟环境,打开terminal,执行myenv\Scripts\activate,显示执行出错 无法加载文件 D:\Project\RF_Project\venv\Scripts\acti…

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/RD经费内部支出数据

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/R&D经费内部支出数据 1、时间:1999-2022年 2、来源:整理自科技年鉴 3、指标:研究与试验发展经费内部支出/R&D经费内部支出/研发经费内部支出 4、范围&#…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了,烦闷的时候,看到使用 AI 进行作图,可以使用本地话部署。刚好自己家里的电脑,之前买来玩暗黑4,配置相对来说来可以,就拿来试试。 此篇是按照 Github 上的 stable-d…

Leetcode 1143. 最长公共子序列

心路历程: 这道题还是按照之前公共子数组的角度去思考的话会超时,即考虑最后一个元素一定是公共子序列的最后一个元素。需要换一种建模思路,从而简化整个递推过程。 状态:以i, j为结尾的区间的最长公共子序列,text1[…

【HTML】简单制作一个动态3D正方体

目录 前言 开始 HTML部分 JS部分 CSS部分 效果图 总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],JS的文件名改…

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长,展览馆作为展示文化、艺术和科技成果的重要场所,其安全监控系统的智能化升级已成为当务之急。为此,旭帆科技(TSINGSEE青犀)基于视频智能分析技术推出了展览馆…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照:https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

在s390x架构机器上构建frps/frpc镜像 —— 筑梦之路

源码:GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. # 克隆代码git clone https://github.com/fatedier/frp.git# 切换目录cd frp# 构建frps服务端docker build -t frps:s390x -f …

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL? PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库,提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器,并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …

MySQL查询数据大小

在 MySQL 数据库中,有一个内置的库叫做 information_schema,该数据库中的 tables 表包含了数据库中所有表的基本信息,tables 表结构如下: 下面介绍几个主要关键字段: TABL_SCHEMA:表所属的数据库名TABLE_N…

使用deepspeed,transformers,safetensor中常见的训练精度,共享权重问题

使用deepspeed可能需要注意精度问题 混合精度,LayerNorm 虽然deepspeed有混合精度训练的功能,但是对于网络上各种奇奇怪怪的代码的DIY转化中,他还是很弱小的。它的精度问题,使用deepspeed如果模型中有部分模型使用的是half精度&a…

0基础如何进入IT行业?

前言 俗话说得好“隔行如隔山”,每个人从事自己陌生的行业都是十分艰难的。但现在网上不是流行一种这样的说法吗?360行,行行转IT。我觉得这个说的真的挺对的,因为从我身边认识的同事确实有很多大学并非是计算机科学专业的&#x…

【项目新功能开发篇】开发编码

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

练习 20 Web [HCTF 2018]admin

本题由于GitHub上的源码已经不见了,看了wp也没法复现,只用用保利破解的方式做题。 其他方法还有: Flask Session 伪造 https://blog.csdn.net/qq_46918279/article/details/121294915 暴力破解 打开后看到右上角有菜单栏 然后进入register界…

【THM】Nmap Post Port Scans(后端口扫描)-初级渗透测试

介绍 本房间是 Nmap 系列的最后一个(网络安全简介模块的一部分)。在这个房间中,我们重点关注端口扫描之后的步骤:特别是服务检测、操作系统检测、Nmap脚本引擎和保存扫描结果。 Nmap实时主机发现Nmap基本端口扫描Nmap高级端口扫描Nmap后端口扫描在本系列的第一个房间中,我…

​网络socket编程(二)——面向流的TCP编程及测试(SocketTool)、Wireshark软件使用

目录 一、书接上回(select()函数使用注意事项) 二、面向流(TCP)的socket编程 2.1 TCP服务端编程和测试 2.1.1 TCP服务器原理流程图 2.1.2 TCP服务端编程实战 2.1.3 测试 2.2 TCP客户端编程和测试 三、Wireshark抓包软件的使用 3.1 Wireshark是什…

vue 数据埋点

最近菜鸟做项目,需要做简单的数据埋点,不是企业级的,反正看渡一的视频,企业级特别复杂,包括但不限于:错误收集、点击地方、用户行为…… 菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间&a…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

在ssh 工具 Linux screen会话中使用鼠标进行上下滚动

经过几次发现 除xshell外, WindTerm finalshell MobaXterm 都是进入会话后,发现其界面无法滚动屏幕向上查看 如果想要在Linux screen会话中使用鼠标进行上下滚动。必须首先进入该screen的回滚(scrollback模式)才能进行上下滚动 第一步&#xff…