基于开源库编写MQTT通讯

news2025/3/4 20:12:20

目录

  • 1. MQTT是什么?
  • 2. 开发交互UI
  • 3. 服务器核心代码
  • 4. 客户端核心代码
  • 5. 消息订阅与发布
  • 6. 通讯测试
  • 7. MQTT与PLC通讯
  • 最后. 核心总结


1. MQTT是什么?

MQTT(Message Queuing Terlemetry Transport)消息队列遥测协议;是一种轻量级的发布/订阅消息传输协议,专为IOT、低带宽、高延迟的网络环境设计,具有高效、低耗、海量设备连接特性。

1.通讯原理

  • 发布(Publisher):发布消息到特定主题(Topic)
  • 订阅(Subscriber):订阅主题接收消息
  • 代理(Broker):消息路由管理,接收发布的消息,颁发给所有订阅者

示例:传感器(Publisher)发送消息到主题(Topic),代理(Broker)接收消息并检查该主题的所有客户端,订阅者(Subscriber)实时接收消息

2.消息结构

  • 主题(topic)+负载(payload)

3.必要条件

  • MQTT Broker: 消息代理服务器
  • 客户端库: 设备或应用需集成MQTT客户端
  • 端口: 默认非加密端口 1883,加密端口 8883(TLS/SSL)
  • 连接认证: 支持用户名/密码、客户端证书等认证方式
  • QoS服务质量/策略
QoS等级描述适用场景
0最多一次(无确认)实时性高,允许丢数据
1至少一次(需确认)数据需可靠但不重复
2精确一次(握手确认)关键数据,严格不重复

4. 关键特性
遗嘱消息(Last Will)

  • 设备异常断开时,Broker 自动发布预设消息(如“设备离线”),通知其他客户端。

保留消息(Retained)

  • Broker 保存主题的最新消息,新订阅者首次连接时立即获取。

主题层级(Topic Hierarchy)

  • 支持多级通配符(+ 单层,# 多层)
  • 例如:home/floor1/temperature; home/+/status(匹配所有楼层状态)

5.应用场景

  • 移动设备远程监控(AGV状态上报)
  • 跨厂区数据汇聚(通过云平台中转)

2. 开发交互UI

创建WindowsFormAPP项目,NuGet安装MQTTnet开源库(项目-属性-框架;需与程序包的依赖项一致<否则安装错误>:PM> NuGet\Install-Package MQTTnet -Version 2.8.2

控件

  • label、TextBox、ComboBox、Button
  • ListView(Dock=停靠<视图=Details;小Imagelist=Imagelist1;编辑列=Infoname、Content>)

容器

  • SplitContainer(Orienting=垂直;SplitterWith=1;BorderStyle=边框)

组件

  • Imagelist(添加图像)
  • timer(Enabled=true、Interval=1000)

状态

  • StatusStrip(系统时间、连接数量、版本说明)

Server端

  • 窗体设置(Text=标题、Font=字体、StartPosition=位置、FormBoardStyle=边框)
  • 给定服务IP,固定端口号,设置开始、停止服务、快捷打开客户端按钮
  • 设置日志消息显示窗口;设置状态栏

在这里插入图片描述

Client端

  • 技巧:复制FrmServer(修改窗口、Designer代码)
  • 容器:在SP1的Panel2添加SplitContainer2(Listview放在SP2的Panel1中);
  • 设置SP1的FixedPanel的Panel1不动;设置SP2的FixedPanel的Panel2不动
  • 客户端可发布主题消息
  • 设置连接、订阅、取消订阅、发布主题按钮;
  • 主题信息、给定QoS策略

在这里插入图片描述在这里插入图片描述


3. 服务器核心代码

初始化-public FrmServer(){…}

  • 获取IP集合(Dns.GetHostAddresses)
  • 绑定控件(cmb_iplist.DataSource、.SelectedIndex)

创建服务器对象(IMqttServer)(->服务启动按钮点击事件)

  • 创建服务器配置 _ var optionsBuilder = new MqttServerOptionsBuilder()
    – 验证用户密码_ .WithConnectionValidator(c =>...
  • 实例化服务对象_mqttServer = new MqttFactory().CreateMqttServer();
  • 创建MQTT事件方法_mqttServer.ClientConnected += MqttServer_ClientConnected;
    – 方法日志显示_this.AddLog(0, "MQTT客户端已连接" + "ClietID:" + e.ClientId.Length);
  • 启动服务_mqttServer.StartAsync(optionsBuilder.Build());

日志对象

  • 创建委托_public delegate void AddlogDelegate(int index, string info);
  • 委托方法_private void AddlogMothod(int index, string info){...}
  • 委托对象_private AddlogDelegate AddLog;
  • 对象绑定方法 _this.AddLog = this.AddlogMothod;
  • 对象应用eg:_ this.AddLog(0, "MQTT服务端已停止");

状态栏

  • 系统时间_this.tss_time.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  • 连接个数(连接/断开事件更新)_this.tss_connnum.Text = mqttServer.GetClientSessionsStatusAsync().Result.Count.ToString();

其他

  • 停止服务_mqttServer.StopAsync();
  • 清空日志_this.lst_info.Items.Clear();
  • 打开客户端(注意“重新生成解决方案”)_new FrmClient().Show();
  • 当前时间_DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  • 关闭窗体停止服务

4. 客户端核心代码

初始化

  • 获取IP集合(Dns.GetHostAddresses)
  • 绑定控件(cmb_iplist.DataSource、.SelectedIndex)

快捷打开客户端,ServerIP、Port自动填写

  • 创建带参数的初始化构造方法_ public FrmClient(string ip, string port)

创建客户端对象(IMqttClient)(->客户端连接按钮点击事件)

  • 创建客户端配置_ var option = new MqttClientOptions() { ClientId = Guid.NewGuid().ToString("D") };
  • 创建通道配置_ option.ChannelOptions = new MqttClientTcpOptions()
  • 是否启用账户_ if (this.chk_isuserpwd.Checked)
  • 创建会话配置_option.CleanSession = true;
  • 创建客户端对象_mqttClient = new MqttFactory().CreateMqttClient();
  • 连接服务器_ mqttClient.ConnectAsync(option);
  • 绑定事件方法(添加日志)_ mqttClient.Connected += mqttClient_Connected;

日志显示

  • 创建委托方法_与服务端一致
  • 创建委托对象_与服务端一致
  • 初始化对象绑定方法_与服务端一致
  • 对象引用eg_与服务端一致

其他

  • 断开连接_mqttClient.DisconnectAsync();

5. 消息订阅与发布

客户端可以正确连接后,只有订阅与发布消息,才算真正进行数据通讯;消息的订阅和发布均在客户端进行,服务端只需提供一个服务供客户连接(桥梁的作用);小节解释消息订阅发布的核心代码。
QoS服务策略(下拉框获取)

  • QoS服务策略(枚举类型)_this.cmb_qos_pub.DataSource = Enum.GetNames(typeof(MqttQualityOfServiceLevel));

消息订阅

  • 订阅主题_mqttClient.SubscribeAsync(new List<TopicFilter>(){...});1

消息取消订阅

  • 取消订阅_mqttClient.UnsubscribeAsync(this.txt_topic_sub.Text);

消息发布

  • 创建消息对象_ var msg = new MqttApplicationMessage(){...} 2
  • 发布消息_mqttClient.PublishAsync(msg);

6. 通讯测试

在这里插入图片描述


7. MQTT与PLC通讯

将msg对象中的Payload更改为PLC的寄存器即可
自动发布

  • 添加定时器timer1_设置频率,事件(消息内容,自动发布)
  • 连接成功时启动定时器_ this.timer1.Enabled = true;

消息内容

  • 添加引用(西门子通讯库)
  • 创建PLC对象
  • 读取PLC变量
  • 添加到msg中的Payload中_Payload = Encoding.UTF8.GetBytes(plcmsg),

在这里插入图片描述


最后. 核心总结

1. 开发实现
服务端:

  • 功能:IP/端口配置、启动/停止服务、连接监控
  • 初始化 MqttServer 对象
  • 处理连接/断开事件(日志记录、状态更新)

客户端:

  • 功能:连接/断开、订阅/取消主题、消息发布
  • 配置 MqttClient(IP、端口、认证)
  • 实现订阅 (SubscribeAsync) /发布 (PublishAsync)

2. 进阶应用

PLC 集成:

  • 自动发布:定时器读取 PLC 数据并推送
  • 数据格式:Payload 封装寄存器值(如 Siemens PLC 数据)

异常测试:

  • 基础测试:服务端启停、客户端连接/断开
  • 消息流验证:订阅发布功能、QoS 策略生效
  • 异常测试:网络断开重连、遗嘱消息触发

附:关键代码片段
服务端启动:

var options = new MqttServerOptionsBuilder().WithDefaultPort(1883).Build();
mqttServer = new MqttFactory().CreateMqttServer();
mqttServer.StartAsync(options);

客户端发布消息:

var msg = new MqttApplicationMessage {
    Topic = "sensor/temp",
    Payload = Encoding.UTF8.GetBytes("25℃"),
    QoS = MqttQualityOfServiceLevel.AtLeastOnce
};
client.PublishAsync(msg);

PLC 数据读取:

var plcValue = SiemensPLC.Read("DB1.DBD0"); // 读取浮点数
var payload = $"{{\"temperature\": {plcValue}}}";

源码链接


  1. 创建TopicFilter对象_new TopicFilter(this.txt_topic_sub.Text, (MqttQualityOfServiceLevel)Enum.Parse(typeof(MqttQualityOfServiceLevel),this.cmb_qos_sub.Text)) ↩︎

  2. 消息对象赋值_ Topic = this.txt_topic_pub.Text, QualityOfServiceLevel =(MqttQualityOfServiceLevel)Enum.Parse(typeof(MqttQualityOfServiceLevel), this.cmb_qos_pub.Text), Payload = Encoding.UTF8.GetBytes(this.txt_msg_pub.Text), Retain = false, ↩︎

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

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

相关文章

基于springboot+vue美食与健康分享推广网站

目录 项目介绍 图片展示 运行环境 项目介绍 管理员&#xff1a; 个人中心&#xff1a;修改个人信息、修改密码 美食分类管理&#xff1a;增删改查美食分类 商品分类管理&#xff1a;增删改查商品分类 热门美事管理&#xff1a;增删改查热门美食、以及查看评论、预览视频 在线…

计算机毕业设计SpringBoot+Vue.js装饰工程管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

从波士顿动力到Figure AI:探寻人工智能驱动的机器人智能化

一、引言 1.1 研究背景与意义 在科技飞速发展的当下,机器人智能化已成为全球科技竞争的关键领域,深刻影响着人类社会的生产与生活方式。从工业制造到日常生活服务,从医疗保健到探索未知领域,机器人正逐步渗透进各个行业,展现出巨大的发展潜力与应用价值。其智能化水平的…

华为 VRP 系统简介配置SSH,TELNET远程登录

华为 VRP 系统简介&配置TELNET远程登录 1.华为 VRP 系统概述 1.1 什么是 VRP VRP&#xff08;Versatile Routing Platform 华为数通设备操作系统&#xff09;是华为公司数据通信产品的通用操作系统平台&#xff0c;从低端到核心的全系列路由器、以太网交换机、业务网关等…

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术&#xff0c;多个主机形成…

Lumoz Chain正式上线:AI 时代的新算力破局者

新的叙事和技术突破永远是推动行业前行的核心动力。当下&#xff0c;AI Agent无疑是最炙手可热的赛道之一。 当加密世界将目光投向AI领域时&#xff0c;大多数项目仍停留在以AI为工具或应用场景的层面&#xff0c;试图通过集成AI模型或优化链上功能来吸引用户。然而&#xff0…

sql调优:优化响应时间(优化sql) ; 优化吞吐量

Sql性能调优的目的 1.优化响应时间>>优化sql 经过调优后&#xff0c;执行查询、更新等操作的时候&#xff0c;数据库的反应速度更快&#xff0c;花费的时间更少。 2.优化吞吐量 即“并发”, 就是“同时处理请求”的能力。 优化sql 尽量将多条SQL语句压缩到一句>…

2020最新Java面试题

2020最新Java面试题 序Java基础JVMRedis 序 研发了这么多年&#xff0c;每天都在搬砖&#xff0c;斗转星移&#xff0c;从一个被面试者&#xff0c;成为了一个面试者。总感觉自己在面试的时候提出的问题没有一个由浅入深的感觉&#xff0c;总是东一个问题&#xff0c;西一个…

批量设置 Word 样式,如字体信息、段落距离、行距、页边距等信息

在 Word 文档中&#xff0c;我们可以做各种样式的处理。比如设置 Word 文档的字体样式、设置 Word 文档的段落样式以及设置 Word 文档的页面样式。我们通常可以在 Office 中完成这些操作&#xff0c;相信绝大部分场景我们也是这样完成的。但是如果我们手上有 1000 个 Word 文档…

win本地vscode通过代理远程链接linux服务器

时间&#xff1a;2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…

EVOAGENT: Towards Automatic Multi-Agent Generation via Evolutionary Algorithms

题目 EVOAGENT:通过进化算法实现多智能体自动生成 论文地址&#xff1a;https://openreview.net/pdf?id05bBTmRj9s 项目地址&#xff1a;https://evo-agent.github.io/ 摘要 强大的大型语言模型(LLM)的出现激发了一种新的趋势&#xff0c;即构建基于LLM的自治代理来解决复杂的…

Linux虚拟机网络配置-桥接网络配置

简介 本文档旨在指导用户如何在虚拟环境中配置Linux系统的桥接网络&#xff0c;以实现虚拟机与物理主机以及外部网络的直接通信。桥接网络允许虚拟机如同一台独立的物理机一样直接连接到物理网络&#xff0c;从而可以被分配一个独立的IP地址&#xff0c;并能够与网络中的其他设…

【UI设计——视频播放界面分享】

视频播放界面设计分享 在本次设计分享中&#xff0c;带来一个视频播放界面的设计作品。 此界面采用了简洁直观的布局。顶部是导航栏&#xff0c;包含主页、播放、搜索框等常见功能&#xff0c;方便用户快速找到所需操作。搜索框旁输入 “萌宠成长记”&#xff0c;体现了对特定内…

SyntaxError: positional argument follows keyword argument

命令行里面日常练手爬虫不注意遇到的问题&#xff0c;报错说参数位置不正确 修改代码后&#xff0c;运行如下图&#xff1a; 结果&#xff1a; 希望各位也能顺利解决问题&#xff0c;祝你好运&#xff01;

使用vue3+element plus 的table自制的穿梭框(支持多列数据)

目录 一、效果图 二、介绍 三、代码区 一、效果图 话不多说&#xff0c;先上图 二、介绍 项目需要&#xff1a;通过穿梭框选择人员信息&#xff0c;可以根据部门、岗位进行筛选&#xff0c;需要显示多列&#xff08;不光显示姓名&#xff0c;还包括人员的一些基础信息&…

Java【多线程】(2)线程属性与线程安全

目录 1.前言 2.正文 2.1线程的进阶实现 2.2线程的核心属性 2.3线程安全 2.3.1线程安全问题的原因 2.3.2加锁和互斥 2.3.3可重入&#xff08;如何自己实现可重入锁&#xff09; 2.4.4死锁&#xff08;三种情况&#xff09; 2.4.4.1第一种情况 2.4.4.2第二种情况 2.4…

vue These dependencies were not found

These dependencies were not found: * vxe-table in ./src/main.js * vxe-table/lib/style.css in ./src/main.js To install them, you can run: npm install --save vxe-table vxe-table/lib/style.css 解决&#xff1a; nodejs执行以下语句 npm install --save vxe-t…

Yak 在 AI 浪潮中应该如何存活?

MCP 是 Claude 发起的一个协议&#xff0c;在2024年10月左右发布&#xff0c;在2025年2月开始逐步有大批量的 AI 应用体开始支持这个协议。这个协议目的是让 AI 同时可以感知有什么工具可以用&#xff0c;如果要调用这些工具的话&#xff0c;应该是用什么样的方式。 这个 MCP 协…

AI是否能真正理解人类情感?从语音助手到情感机器人

引言&#xff1a;AI与情感的交集 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;的发展速度令人惊叹&#xff0c;从简单的语音识别到如今的深度学习和情感计算&#xff0c;AI已经深入到我们生活的方方面面。尤其是在语音助手和情感机器人领域&#xff0c;AI不…

大语言模型学习--本地部署DeepSeek

本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型&#xff08;LLM&#xff09;本地化部署与管理工具&#xff0c;旨在简化在本地计算机上运行和管理大语言模型…