当前位置: 首页 > news >正文

物联网通讯协议-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.dtcms.com/a/326422.html

相关文章:

  • 支持向量机SM
  • 人工智能-python-机器学习-线性回归与梯度下降:理论与实践
  • 大屏幕自适应
  • 基于FPGA的热电偶测温数据采集系统,替代NI的产品(三)测试
  • C++ STL | STL迭代器(lterator)
  • 阿里千问系列:Qwen3 强化学习新算法GSPO!
  • HTML应用指南:利用GET请求获取全国一加授权零售店位置信息
  • 机器学习逻辑回归实战
  • 【Lua】题目小练10
  • computed使用的方式
  • 【Lua】XLua加载lua文件
  • xlsxio全平台(x86、arm32、arm64 )编译、测试,使用编译脚本10分钟快速编译!
  • redis常见的性能问题
  • 游戏盾是什么?
  • Qwen Code CLI在Windows上的安装与环境配置问题解决
  • 金蝶云星辰:赋能企业数据管理
  • 开发指南130-实体类的主键生成策略
  • 达梦数据库慢SQL日志收集和分析
  • 机器学习 TF-IDF提取关键词,从原理到实践的文本特征提取利器​
  • Java 之抽象类和接口
  • 数据结构-数组扩容
  • 2025苹果CMS泛目录 8月最新可用
  • 软件测评中HTTP 安全头的配置与测试规范
  • 鸿蒙开发中所有自定义装饰器的完整案例解析--涵盖 16 个核心装饰器的详细用法和实战场景
  • QT 高分屏不同缩放比例的自适应处理
  • 数据科学与计算实例应用
  • 借助 ChatGPT 快速实现 TinyMCE 段落间距与行间距调节
  • Ansible 面试题 20250811
  • OpenGL中的EBO:高效渲染的秘密武器(绘制四边形)(Unreal Engine、Unity、Godot原理系列)
  • JavaScript中map和forEach的区别详解