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 级别0WriteLog($"\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.mzph.cn/news/791348.shtml

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

相关文章

SQL server 查询数据库中所有的表名及行数

SQL server 查询数据库中所有的表名及行数 select a.name,b.rows from sysobjects as ainner join sysindexes as bon a.id b.id where (a.type u)and (b.indid in (0, 1)) and b.rows<50 and b.rows>20 order by a.name, b.rows desc;

Express框架搭建项目 node.js

文章目录 引言Express框架介绍express安装环境准备写一个简单的项目展示 文章总结 引言 Express是一个基于Node.js平台的轻量级Web应用框架&#xff0c;它提供了简洁的API和丰富的功能&#xff0c;使得开发者能够快速地构建Web服务器和API。本文将带领大家从零开始&#xff0c…

GDAL源码剖析(六)之GDAL开发及其调试

GDAL源码剖析&#xff08;六&#xff09;之GDAL开发及其调试-CSDN博客 一、简单的调用 关于GDAL的使用&#xff0c;网上的资料都很多&#xff0c;主要还是要熟悉GDAL的组织结构&#xff0c;类以及类的函数等&#xff0c;熟悉了&#xff0c;使用GDAL就不在话下了。最常用的就是…

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况&#xff0c;用苹果手表Apple Watch录音&#xff0c;有的录1个多小时&#xff0c;有的录了3、4小时&#xff0c;甚至更长时间&#xff0c;因为手表没电&#xff0c;忘记保存等原因造成录音损坏&#xff0c;都是只能播放4秒&#xff0c;同步到手机也一样&…

ESTAN:用于乳腺超声图像分割的增强型小肿瘤感知网络

ESTAN&#xff1a;用于乳腺超声图像分割的增强型小肿瘤感知网络 摘要引言 ESTAN Enhanced Small Tumor-Aware Network for Breast Ultrasound Image Segmentation 摘要 乳腺肿瘤分割是用于乳腺癌检测的计算机辅助诊断&#xff08;CAD&#xff09;系统中的关键任务&#xff0c;…

让php开发更优雅-Laravel篇

前言 随着开发经验的增加&#xff0c;也伴随团队开发的积累&#xff0c;规范开发显得越来越重要&#xff0c;本文给大家提供一些laravel开发的进阶思路和经验&#xff0c;让大家开发更加统一规范&#xff0c;代码看起来更加优雅。 1.更多使用第三方库。团队开发的时候&#xf…

Claude-3全解析:图片问答,专业写作能力显著领先GPT-4

人工智能技术的飞速发展正在深刻改变着我们的工作和生活方式。作为一名资深的技术爱好者&#xff0c;我最近有幸体验了备受瞩目的AI助手Claude-3。这款由Anthropic公司推出的新一代智能工具展现出了非凡的实力&#xff0c;尤其在图像识别和专业写作领域的表现更是让人眼前一亮&…

JavaScript基础代码练习之冒泡排序

一、要求对一个数组进行冒泡排序&#xff0c;并将排序后的结果输出到控制台。在代码中&#xff0c;数组 arr 包含了一组数字&#xff0c;然后使用嵌套的循环来进行冒泡排序。 二、编写代码 <!DOCTYPE html> <html lang"en"><head><meta chars…

【记录】海康相机(SDK)二次开发时的错误码

海康相机&#xff08;SDK&#xff09;二次开发时的错误码 在进行海康sdk二次开发的时候&#xff0c;经常碰到各种错误&#xff0c;遂结合官方文档和广大网友的一些经验&#xff0c;把这些错误码记录一下&#xff0c;方便查找。笔者使用的SDK版本是HCNetSDKV6.1.9.4。 错误类型…

软件测试用例(2)

具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…

Flink SQL系列之:基于Flink SQL查询Topic中序列化的Debezium数据格式字段

Flink SQL系列之:基于Flink SQL查询Topic中序列化的Debezium数据格式字段 一、表结构二、查询Topic中表的数据三、反序列化字段一、表结构 CREATE TABLE IF NOT EXISTS record_rt (id decimal(20,0) COMMENT "主键",follow_entity_type <

深挖苹果Find My技术,伦茨科技ST17H6x芯片赋予产品功能

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

fastadmin学习08-查询数据渲染到前端

index.php查询&#xff0c;这个是前台的index.php public function index() {$slideImgs Db::name("slideimg")->where("status",,normal)->limit(5)->order(sort,desc)->select();$productList Db::name("product")->where(…

python的垃圾回收

引用计数器为主&#xff0c;标记清除和分代回收为辅 1 引用计数器 在python程序运行时&#xff0c;会根据数据类型的不同找到其对应的结构体&#xff0c;根据结构体中的字段来进行创建相关的数据&#xff0c;然后将对象添加到refchain双像链表中&#xff0c;每个对象中的ob_re…

Java中生成JWT令牌

1. 在pom.xml中引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> 2. 使用Jwts的相关方法生成令牌 import io.jsonwebtoken.Jwts; import io.…

计算机应用 1.4网络分类

一、计算机网络的分类 1.按距离分 ①局域网&#xff1a;范围小、传输速率高、误码率低、网络延迟小。 ②广域网&#xff1a;范围广、传输速率低、误码率高、网络延迟大。 ③城域网&#xff1a;特点位于上面两者之间。 2.按拓扑结构分 ①星型网&#xff1b;②环型网&#…

【单片机家电产品学习记录--蜂鸣器】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–蜂鸣器 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1电子电路学习笔记&#xff08;17&#xff09;——蜂鸣器 蜂鸣器种类和原理 2疑…

虹科Pico汽车示波器 | 免拆诊断案例 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平…

20.安全性测试与评估

每年都会涉及&#xff1b;可能会考大题&#xff1b;多记&#xff01;&#xff01;&#xff01; 典型考点&#xff1a;sql注入、xss&#xff1b; 从2个方面记&#xff1a; 1、测试对象的功能、性能&#xff1b; 2、相关设备的工作原理&#xff1b; 如防火墙&#xff0c;要了解防…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…