物联网通讯协议-MQTT、Modbus、OPC

引言

在物联网迅速发展的今天,设备间的通信协议扮演着至关重要的角色。它们是不同设备、系统之间实现数据交换的桥梁。本文将详细介绍三种在物联网领域广泛应用的通讯协议——MQTT、Modbus和OPC,包括它们的基础概念、特点及在C#中的实现方法。

一、MQTT协议

1. 基础概念

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,专为物联网设备通信设计 6 。它基于发布/订阅(Pub/Sub)模式,包含三个核心角色:

  • 发布者(Publisher) :发送消息的设备或应用

  • 代理(Broker) :消息的中转中心,负责接收和分发消息

  • 订阅者(Subscriber) :接收特定主题消息的设备或应用 MQTT的轻量级特性体现在:

  • 最小化报文头仅2字节,最小报文仅2字节

  • 低带宽消耗,1KB消息传输开销小于5%

  • 支持QoS(服务质量)分级保障:

    • QoS 0:至多一次(Fire and Forget)

    • QoS 1:至少一次(Acknowledged Delivery)

    • QoS 2:精确一次(Assured Delivery)

2. C#实现示例

在C#中,我们可以使用MQTTnet库来实现MQTT通信。首先通过NuGet安装:

Install-Package MQTTnet

以下是一个简单的MQTT客户端实现:

using MQTTnet;
using MQTTnet.Client;
using System.Text;
​
class MQTTClientExample
{private static async Task Main(string[] args){// 创建MQTT客户端var factory = new MqttFactory();var client = factory.CreateMqttClient();
​// 配置连接选项var options = new MqttClientOptionsBuilder().WithTcpServer("broker.hivemq.com", 1883) // 连接到公共MQTT代理.WithClientId("CsharpClient").WithCleanSession().Build();
​// 连接事件处理client.ConnectedAsync += async (e) =>{Console.WriteLine("已连接到MQTT代理");// 订阅主题await client.SubscribeAsync("iot/sensors");Console.WriteLine("已订阅主题: iot/sensors");};
​// 消息接收事件处理client.ApplicationMessageReceivedAsync += (e)=>{Console.WriteLine($"收到消息: 主题={e.ApplicationMessage.Topic}, 内容={Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");return Task.CompletedTask;};
​// 连接到MQTT代理await client.ConnectAsync(options);
​// 发布消息var message = new MqttApplicationMessageBuilder().WithTopic("iot/commands").WithPayload("{\"action\":\"read_sensors\"}").WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce).Build();
​await client.PublishAsync(message);Console.WriteLine("已发布消息到主题: iot/commands");
​// 保持程序运行Console.ReadLine();await client.DisconnectAsync();}
}

二、Modbus协议

1. 基础概念

Modbus是一种应用广泛的工业通信协议,由Modicon公司(现施耐德电气)于1979年开发 2 。它是一种主从式协议,支持以下几种主要变体:

  • Modbus RTU :基于串口(RS-232/RS-485)的二进制格式

  • Modbus ASCII :基于串口的ASCII字符格式

  • Modbus TCP :基于以太网的TCP/IP协议 Modbus协议通过寄存器地址进行数据访问,主要包含:

  • 线圈寄存器(Coils):用于开关量输出

  • 离散输入寄存器(Discrete Inputs):用于开关量输入

  • 保持寄存器(Holding Registers):用于模拟量输出和数据存储

  • 输入寄存器(Input Registers):用于模拟量输入

2. C#实现示例

在C#中,我们可以使用NModbus库来实现Modbus通信。首先通过NuGet安装:

Install-Package NModbus

以下是一个Modbus TCP客户端实现示例:

using Modbus.Data;
using Modbus.Device;
using Modbus.Utility;
using System.Net.Sockets;
​
class ModbusTcpClientExample
{private static void Main(string[] args){// 连接到Modbus TCP服务器TcpClient client = new TcpClient("127.0.0.1", 502);IModbusMaster master = ModbusIpMaster.CreateIp(client);
​// 读取保持寄存器(地址100-103)ushort startAddress = 100;ushort numRegisters = 4;ushort[] registers = master.ReadHoldingRegisters(1, startAddress, numRegisters);
​Console.WriteLine("读取保持寄存器结果:");for (int i = 0; i < registers.Length; i++){Console.WriteLine($"寄存器 {startAddress + i}: {registers[i]}");}
​// 写入单个保持寄存器ushort writeAddress = 100;ushort writeValue = 1234;master.WriteSingleRegister(1, writeAddress, writeValue);Console.WriteLine($"已写入寄存器 {writeAddress}: {writeValue}");
​// 写入多个保持寄存器ushort[] writeValues = { 5678, 9012 };master.WriteMultipleRegisters(1, 101, writeValues);Console.WriteLine("已写入多个寄存器");
​client.Close();}
}

三、OPC协议

1. 基础概念

OPC(OLE for Process Control)是工业自动化领域的通信标准,旨在实现不同厂商设备和系统之间的互操作性 3 。目前主要有两个版本:

  • OPC DA(Data Access) :基于微软COM/DCOM技术,适用于Windows平台

  • OPC UA(Unified Architecture) :平台无关、厂商无关的统一架构,支持跨平台通信 OPC UA的主要特点:

  • 平台无关:支持Windows、Linux、macOS等多种操作系统

  • 安全可靠:提供端到端的加密和认证

  • 信息建模:支持复杂的数据结构和语义

  • 可扩展性:支持分布式系统和大规模部署

2. C#实现示例

对于OPC UA,我们可以使用OPC Foundation提供的OPC UA .NET Standard库。首先通过NuGet安装:

Install-Package Opc.Ua.Client

以下是一个简单的OPC UA客户端实现:

using Opc.Ua;
using Opc.Ua.Client;
using System;
using System.Collections.Generic;
​
class OpcUaClientExample
{private static void Main(string[] args){// 创建应用程序配置ApplicationConfiguration config = new ApplicationConfiguration(){ApplicationName = "CsharpOpcUaClient",ApplicationType = ApplicationType.Client,SecurityConfiguration = new SecurityConfiguration(){ApplicationCertificate = new CertificateIdentifier() { StoreType = "Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = "CsharpOpcUaClient" },TrustedIssuerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities" },TrustedPeerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications" },RejectedCertificateStore = new CertificateTrustList { StoreType = "Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\RejectedCertificates" }}};config.Validate(ApplicationType.Client).GetAwaiter().GetResult();
​// 创建会话string endpointUrl = "opc.tcp://localhost:4840/";        EndpointDescription endpoint = CoreClientUtils.SelectEndpoint(endpointUrl, useSecurity: false);        ConfiguredEndpoint configuredEndpoint = new ConfiguredEndpoint(null, endpoint, EndpointConfiguration.Create(config));Session session = Session.Create(config, configuredEndpoint, false, "CsharpOpcUaClient", 60000, new UserIdentity(), null).GetAwaiter().GetResult();
​Console.WriteLine("已连接到OPC UA服务器");
​// 读取节点值NodeId nodeId = new NodeId("ns=2;s=Temperature");DataValue value = session.ReadValue(nodeId);Console.WriteLine($"读取节点值: {value.Value}

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

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

相关文章

牛客周赛R104 小红的矩阵不动点

D-小红的矩阵不动点_牛客周赛 Round 104 赛时这道题卡了一段时间&#xff0c;赛时代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int ans,h; int a[505][505]; signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int n,m;cin>…

Rust面试题及详细答案120道(19-26)-- 所有权与借用

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Jenkins + SonarQube 从原理到实战三:SonarQube 打通 Windows AD(LDAP)认证与踩坑记录

前言 在前两篇文章中&#xff0c;已经介绍了 SonarQube 的部署 以及 通过 sonar-cxx 插件实现 C/C 代码扫描。 本篇将重点讲 如何让 SonarQube 对接 Windows AD&#xff08;LDAP&#xff09;&#xff0c;实现域账号登录和基于 AD 组的权限管理。 一、背景与需求分析 需求分析…

[AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库

第七章&#xff1a;包与依赖管理 在我们使用open-lovable的旅程中&#xff0c;已经探索了它如何管理对话状态&#xff08;第一章&#xff1a;对话状态管理&#xff09;、将创意转化为可运行代码&#xff08;第二章&#xff1a;AI代码生成管道&#xff09;、如何在安全的虚拟环…

PanSou 一款开源网盘搜索项目,集成前后端,一键部署,开箱即用

PanSou 网盘搜索API PanSou是一个高性能的网盘资源搜索API服务&#xff0c;支持TG搜索和自定义插件搜索。系统设计以性能和可扩展性为核心&#xff0c;支持并发搜索、结果智能排序和网盘类型分类。 项目地址&#xff1a;https://github.com/fish2018/pansou 特性&#xff08…

java爬虫实战

本人目前在做鱼皮的《智能协同云图库》&#xff0c;涉及到了以图搜图图片爬取&#xff0c;虽然以前有爬过图片&#xff0c;但是用的都是别人现成的代码&#xff0c;不怎么去理解为什么要这样做&#xff0c;这次有在尝试理解每一个步骤。本人基础极差&#xff0c;属于一点基础也…

深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#…

北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧

今天没去教室&#xff0c;因为下午有个线下面试。其实是可以去教室的&#xff0c;但我实在太焦虑了&#xff0c;我觉得去了教室我心情会更不好&#xff0c;什么都干不下去&#xff0c;所以我选择不去早上依旧是带着满满焦虑起来的&#xff0c;会觉得自己的一切都不令自己满意&a…

在ubuntu服务器下安装cuda和cudnn(笔记)

目录 0 引言 1 相关环境查询 2 安装cuda 2.1 下载并安装 2.2 安装选项配置 2.3 验证安装 3 安装cudnn 3.1 下载 3.2 解压 3.3 删除旧版本 cuDNN 3.4 复制新文件到 CUDA 目录 3.5 设置文件权限 3.6 创建软链接 3.7 验证安装 0 引言 我在使用服务器的cuda11.8的时…

docker安装centos

docker库地址https://hub.docker.com/ 尝试使用centos7试了几次超时 换了个版本就可以了 docker pull centos:centos7.9.2009有时候需要更新资源地址 可以使用 vim /etc/docker/daemon.json配置其他资源地址 {"registry-mirrors": ["http://hub-mirror.c.163…

内容索引之word转md工具 - markitdown

切分文档构建RAG库过程中&#xff0c;langchain、llamaindex更期望处理latex、md类带有显式结构文档。 langchain、llamaindex切分word&#xff0c;有可能将段落中间截断&#xff0c;导致切分后的块语义不完整。 所以&#xff0c;需要先将word转化为md格式&#xff0c;然后再…

MaxKB+合合信息TextIn:通过API实现PDF扫描件的文档审核

上海合合信息科技股份有限公司&#xff08;以下简称为合合信息&#xff09;是一家深耕人工智能、OCR&#xff08;光学字符识别&#xff09;及商业大数据技术领域的科技企业。该公司拥有领先的智能文字识别技术&#xff0c;其名片全能王&#xff08;CamCard&#xff09;、扫描全…

MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查

目录 一、什么是 MyBatis&#xff1f;为什么要用它&#xff1f; 二、MyBatis 核心概念&#xff08;通俗理解&#xff09; 1.SqlSessionFactory 2.SqlSession 3.Mapper接口 4.映射文件&#xff08;XML&#xff09; 三、手把手搭建第一个 MyBatis 项目 1. 准备工作 2. 核心配置文…

数据结构初阶(12)排序算法—插入排序(插入、希尔)(动图演示)

2. 常见排序算法的实现2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一种简单的插入排序法&#xff1a;基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中。直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 比 挪 (…

MySQL优化常用的几个方法

本实例是对慢sql从2万优化到5千优化方法的汇总。 首先贴上优化效果&#xff1a;1、更新数据时使用ID更新&#xff1b;2、"分页/轮询"查询时先获取符合数据要求主键的最大和最小ID&#xff0c;然后WHERE条件增加ID步增查询&#xff1b;3、检查SQL是否命中WHERE条件&am…

深入解析 AUTOSAR:汽车软件开发的革命性架构

引言在汽车智能化、网联化、电动化浪潮席卷全球的今天&#xff0c;汽车电子系统的复杂性与日俱增。传统“烟囱式”的 ECU 开发模式&#xff08;各供应商独立开发软硬件&#xff09;带来了巨大的兼容性、复用性和维护成本挑战。AUTOSAR&#xff08;AUTomotive Open System ARchi…

计算机视觉(opencv)实战一——图像本质、数字矩阵、RGB + 图片基本操作(灰度、裁剪、替换等)

OpenCV 入门教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、机器学习等领域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2…

《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》

前引&#xff1a;在STL的关联式容器中&#xff0c;set以其严格的元素唯一性和自动排序特性成为处理有序数据的核心工具。其底层基于红黑树&#xff08;Red-Black Tree&#xff09;实现&#xff0c;保证了O(log n)的查找、插入与删除复杂度&#xff01;本文将从底层原理切入&…

各测试平台功能对比分析(ITP,Postman,Apifox,MeterSphere)

对比ITP与Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口测试✅ 可视化接口调试&#xff0c;支持多种请求方式✅ 支持✅ 支持✅ 支持场景测试✅ 多接口串联测试&#xff0c;支持前后置脚本✅ Collections功能✅ 支持✅ 支持定时任务✅ 基于Celery的定时…

开源日志log4cplus—如何将 string类型转为tstring类型,又如何将char*类型转换为tstring类型?

文章目录&#x1f527; 一、理解 log4cplus::tstring 的本质⚙️ 二、std::string 转 tstring 的三种方法✅ 1. 使用内置宏 LOG4CPLUS_STRING_TO_TSTRING&#xff08;推荐&#xff09;✅ 2. 手动条件编译转换&#xff08;精细控制&#xff09;✅ 3. 多字节模式下的直接赋值⚙️…