news 2026/10/3 12:12:11

工业设备管理双协议实战:MQTT与SNMP组合架构与部署指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业设备管理双协议实战:MQTT与SNMP组合架构与部署指南

1. 工业设备管理为什么需要双协议组合

1.1 从两个真实场景说起

先聊两个我亲身经历的场景。

第一个场景:某汽车零部件工厂的冲压车间,现场有12台不同年份采购的冲压机。最早那批2012年上的设备,只带一个RJ45网口,支持SNMP v2c,能读到运行状态、油温、压力这些基础数据,但改不了参数。后来2019年新增的几台,自带MQTT客户端,能主动往服务器推数据,还能接收远程下发的控制指令。问题来了——这两批设备在同一个车间里,数据要汇总到同一个看板,运维人员要在一个界面上看到所有设备的状态。你不可能让老设备长出MQTT能力,也不可能让新设备退回去只跑SNMP。

第二个场景:一个做环境监测的项目,现场有温湿度传感器、烟感、水浸检测器,这些设备通过RS-485总线连到一台边缘网关。网关本身支持MQTT,但传感器只懂Modbus RTU。同时,机房里还有几台网络交换机需要监控端口流量和CPU负载,这些交换机只支持SNMP。整个系统要统一管理,就必然涉及MQTT和SNMP的协同。

这两个场景指向同一个结论:工业现场的设备是异构的,协议是多样的,单一协议不可能覆盖所有设备。MQTT和SNMP不是竞争关系,而是互补关系。MQTT擅长的是“设备主动上报、云端下发指令”这种双向实时通信,适合有计算能力的智能设备;SNMP擅长的是“网管系统主动轮询、读取设备状态”,适合网络设备和支持SNMP的传统工业设备。

1.2 两种协议的本质差异

要理解为什么需要组合使用,得先搞清楚这两种协议到底在解决什么问题。

MQTT的核心是发布/订阅模型。设备作为客户端连接到MQTT Broker(服务器),往某个主题(Topic)发布消息,其他订阅了该主题的客户端就能收到。这个模型的好处是解耦——发布者不需要知道谁在订阅,订阅者也不需要知道谁在发布。对于工业场景来说,这意味着设备只需要维护一条到Broker的连接,就能实现数据上报和指令接收,网络开销小,实时性好。

SNMP的核心是管理站/代理模型。网络管理站(NMS)主动向设备上的SNMP代理发起请求,读取或修改管理信息库(MIB)中的对象。SNMP是轮询机制,管理站定期去问设备“你现在怎么样”,设备回答。这种方式的好处是标准化程度极高,几乎所有网络设备和大量工业设备都支持,MIB结构清晰,数据定义明确。

两者的差异可以用一个生活类比来理解:MQTT像是微信工作群,设备有事直接在群里说,所有人都能看到;SNMP像是你挨个给每个人打电话问情况,问谁谁回答,不问就不说。群聊效率高但需要设备“会说话”,打电话虽然笨但谁都能接。

1.3 双协议组合的典型架构

在实际项目中,双协议组合的架构通常是这样分层的:

最底层是设备层,包含三类设备——纯SNMP设备(如交换机、部分PLC)、纯MQTT设备(如新型传感器、智能仪表)、以及通过网关转换协议的设备(如RS-485设备通过边缘网关接入MQTT)。

中间层是协议接入层。SNMP设备由SNMP采集器负责轮询,采集到的数据写入消息队列或直接转发到MQTT Broker。MQTT设备直接连接到Broker。边缘网关负责将Modbus、OPC UA等工业协议转换为MQTT。

最上层是应用层,包括数据存储、可视化看板、告警引擎、远程控制等。应用层只需要跟MQTT Broker打交道,不需要关心数据最初来自SNMP还是MQTT。

这个架构的关键设计点是:用MQTT作为统一的数据总线,SNMP作为设备接入手段之一。SNMP采集器扮演了“协议翻译官”的角色,把SNMP轮询到的数据转换成MQTT消息发布出去。这样上层应用只需要实现MQTT客户端,就能获取所有设备的数据。

2. MQTT协议核心机制与实操要点

2.1 MQTT的发布/订阅模型到底怎么工作

MQTT协议的全称是Message Queuing Telemetry Transport,消息队列遥测传输。名字里的“遥测”两个字点明了它的出身——为远程监测设计。现在最新版本是MQTT 5.0,但工业现场大量使用的还是MQTT 3.1.1,因为很多嵌入式设备的协议栈只支持到3.1.1。

发布/订阅模型的核心概念有三个:Broker、Topic、Client。

Broker是消息中转站,所有消息都经过它转发。你可以自己搭建Broker,比如用Mosquitto、EMQX、HiveMQ这些。Topic是消息的分类标签,用斜杠分隔层级,比如factory/workshop1/press001/temperature。Client就是连接到Broker的设备或应用程序。

整个流程是这样的:温度传感器作为Client连接到Broker,往Topicfactory/workshop1/press001/temperature发布一条消息,内容是{"value": 68.5, "unit": "celsius", "ts": 1700000000}。看板应用作为另一个Client,订阅了factory/workshop1/+/temperature(加号是单层通配符),就能收到所有车间所有设备的温度数据。

这里有个关键设计点:Topic的设计直接决定了系统的可扩展性。我见过太多项目一开始Topic随便起,后来设备一多就乱了。建议的Topic命名规范是:{项目}/{区域}/{设备类型}/{设备ID}/{数据类别}。比如plant-a/workshop1/plc/plc-001/status。这样既方便通配符订阅,也方便权限控制。

2.2 QoS等级怎么选才不浪费资源

MQTT有三个QoS等级,这个必须讲清楚,因为选错了要么丢数据要么浪费带宽。

QoS 0是“最多一次”,消息发出去就不管了,Broker收到就转发,没收到也不重试。适合高频传感器数据,丢一两条无所谓。QoS 1是“至少一次”,发送方会等接收方确认,没确认就重发,但可能重复。适合一般状态数据。QoS 2是“恰好一次”,通过四次握手确保消息不丢不重,但开销最大。适合计费、告警这种不能出错的数据。

我在实际项目中的经验是:90%的场景用QoS 1就够了。QoS 2的四次握手在设备数量多的时候会明显增加Broker负载。QoS 0虽然轻量,但在网络不稳定的工业现场容易丢关键数据。QoS 1的重复问题可以在应用层做去重,比如每条消息带一个唯一消息ID,接收端缓存最近的消息ID,重复的直接丢弃。

2.3 保留消息和遗嘱消息的实战用法

这两个特性是MQTT的杀手锏,但很多人没用起来。

保留消息(Retained Message):当Client往一个Topic发布保留消息时,Broker会保存这条消息。之后任何新订阅这个Topic的Client,都会立刻收到这条保留消息。这个特性非常适合存储设备的“最后已知状态”。比如设备上线后发布一条保留消息到device/plc-001/status,内容是online。看板应用订阅这个Topic时,立刻就能知道设备当前是在线还是离线,不需要等设备下一次上报。

遗嘱消息(Last Will and Testament):Client在连接Broker时可以指定一条遗嘱消息。如果这个Client异常断开(不是主动断开),Broker会自动发布这条遗嘱消息。这个特性用来做设备离线检测非常方便。设备连接时设置遗嘱消息为offline发布到device/plc-001/status,正常运行时定期发布online。一旦设备掉线,Broker自动发布offline,看板立刻就能看到设备离线。

这两个特性配合使用,设备在线状态管理就非常优雅了。不需要额外的心跳检测机制,Broker帮你搞定。

2.4 MQTT Broker选型与搭建实操

Broker的选型主要看几个维度:并发连接数、消息吞吐量、集群能力、认证授权、以及是否支持MQTT 5.0。

对于中小型项目(设备数500以内),Mosquitto是最省心的选择。它轻量、稳定、配置简单,Linux上一条命令就能装好。对于中大型项目(设备数5000以上),EMQX更合适,它支持集群、有Web管理界面、规则引擎可以对接数据库和消息队列。如果预算充足且需要企业级支持,HiveMQ也是不错的选择。

我用Docker搭一个Mosquitto的实操步骤如下:

# 创建配置目录 mkdir -p /opt/mosquitto/config /opt/mosquitto/data /opt/mosquitto/log # 创建配置文件 cat > /opt/mosquitto/config/mosquitto.conf << 'EOF' listener 1883 allow_anonymous false password_file /mosquitto/config/passwd persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log EOF # 创建用户密码 docker run --rm -it -v /opt/mosquitto/config:/mosquitto/config eclipse-mosquitto \ mosquitto_passwd -c -b /mosquitto/config/passwd admin YourPassword123 # 启动Broker docker run -d --name mosquitto \ -p 1883:1883 -p 9001:9001 \ -v /opt/mosquitto/config:/mosquitto/config \ -v /opt/mosquitto/data:/mosquitto/data \ -v /opt/mosquitto/log:/mosquitto/log \ --restart unless-stopped \ eclipse-mosquitto

注意:生产环境一定要关闭匿名访问,并且给每个设备分配独立的用户名密码。不要所有设备共用一个账号,否则一台设备被攻破会影响整个系统。

2.5 MQTT客户端工具与调试技巧

调试MQTT的时候,命令行工具和图形化工具各有用处。

命令行推荐mosquitto_pub和mosquitto_sub,它们是Mosquitto自带的,安装Mosquitto客户端包就有。订阅所有主题的命令是:

mosquitto_sub -h broker-ip -p 1883 -u admin -P YourPassword123 -t '#' -v

-t '#'表示订阅所有主题,-v表示同时显示主题名和消息内容。这个命令在调试阶段非常有用,能看到Broker上所有流动的消息。

图形化工具推荐MQTTX,跨平台,界面清爽,支持多连接管理、消息格式化、脚本自动化。我通常用它来模拟设备上报和测试订阅逻辑。

还有一个技巧:用MQTTX的脚本功能做批量模拟。比如要测试100台设备同时上报的场景,可以写一个JavaScript脚本,创建100个连接,每个连接定期往不同Topic发消息。这比手动开100个窗口高效得多。

3. SNMP协议核心机制与设备接入

3.1 SNMP的三种操作和MIB结构

SNMP协议的核心操作就三个:GET、SET、TRAP。

GET是读取,管理站问设备“OID 1.3.6.1.2.1.1.3.0的值是多少”,设备回答“运行时间123456秒”。SET是写入,管理站告诉设备“把OID 1.3.6.1.2.1.1.5.0的值改成new-name”,设备执行修改。TRAP是设备主动上报,当设备发生异常时,主动向管理站发送告警信息。

OID是对象标识符,用一串数字表示MIB树上的一个节点。比如1.3.6.1.2.1.1.5.0对应的是设备名称。MIB是管理信息库,定义了设备支持哪些OID以及每个OID的数据类型和含义。每个设备厂商都会提供自己的MIB文件,导入MIB文件后,网管软件就能把OID翻译成人类可读的名称。

这里有个实操中的大坑:不同厂商的MIB文件质量参差不齐。有些厂商的MIB文件写得很规范,导入后所有OID都有清晰的名称和描述。有些厂商的MIB文件缺失或者有语法错误,导入后一堆OID显示为数字。遇到这种情况,只能手动对照厂商文档来映射OID。

3.2 SNMP版本选择:v2c还是v3

SNMP有三个主要版本:v1、v2c、v3。

v1是最老的版本,功能有限,现在基本不用了。v2c增加了GETBULK操作,能一次性读取多个OID,效率高很多,而且配置简单,只需要一个团体名(Community String)。v3增加了认证和加密,安全性最好,但配置复杂,对设备性能也有一定要求。

工业现场的实际选择是:内网环境用v2c,跨网段或安全要求高的用v3。v2c的团体名相当于密码,默认的public和private一定要改掉。我见过太多项目用默认团体名,等于把设备信息裸奔在网上。

v3的配置涉及用户名、认证协议(MD5/SHA)、认证密码、加密协议(DES/AES)、加密密码。配置起来步骤多,但安全性有本质提升。如果设备支持v3且网络环境不可控,建议上v3。

3.3 SNMP采集器的实现思路

SNMP采集器的核心逻辑是:定期轮询设备OID,将结果转换为统一格式,发布到MQTT。

采集器的实现可以用Python的pysnmp库,也可以用Go的gosnmp库。Python上手快,适合快速原型;Go性能好,适合大规模部署。

用Python实现一个基础采集器的核心代码如下:

from pysnmp.hlapi import * import paho.mqtt.client as mqtt import json import time # SNMP设备列表 devices = [ {"ip": "192.168.1.10", "community": "mycommunity", "oids": { "sysName": "1.3.6.1.2.1.1.5.0", "sysUpTime": "1.3.6.1.2.1.1.3.0", "cpuLoad": "1.3.6.1.4.1.2021.10.1.3.1" }}, {"ip": "192.168.1.11", "community": "mycommunity", "oids": { "sysName": "1.3.6.1.2.1.1.5.0", "sysUpTime": "1.3.6.1.2.1.1.3.0" }} ] # MQTT连接 mqtt_client = mqtt.Client() mqtt_client.username_pw_set("admin", "YourPassword123") mqtt_client.connect("broker-ip", 1883, 60) mqtt_client.loop_start() def snmp_get(ip, community, oid): iterator = getCmd( SnmpEngine(), CommunityData(community, mpModel=1), # mpModel=1表示v2c UdpTransportTarget((ip, 161), timeout=2, retries=1), ContextData(), ObjectType(ObjectIdentity(oid)) ) errorIndication, errorStatus, errorIndex, varBinds = next(iterator) if errorIndication: return None elif errorStatus: return None else: for varBind in varBinds: return str(varBind[1]) while True: for device in devices: data = {} for name, oid in device["oids"].items(): value = snmp_get(device["ip"], device["community"], oid) if value is not None: data[name] = value if data: topic = f"snmp/{device['ip'].replace('.', '-')}/data" mqtt_client.publish(topic, json.dumps(data), qos=1) time.sleep(30) # 每30秒轮询一次

这个采集器的逻辑很清晰:遍历设备列表,对每个设备的每个OID执行SNMP GET,把结果组装成JSON,发布到MQTT。轮询间隔30秒是个折中值,太短会增加设备和网络负担,太长会导致数据实时性差。

3.4 SNMP TRAP的接收与转发

TRAP是设备主动上报的告警,不能靠轮询获取。接收TRAP需要采集器监听UDP 162端口。

用pysnmp接收TRAP的核心代码如下:

from pysnmp.entity import engine, config from pysnmp.carrier.asyncore.dgram import udp from pysnmp.entity.rfc3413 import ntfrcv import paho.mqtt.client as mqtt import json snmpEngine = engine.SnmpEngine() config.addTransport(snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('0.0.0.0', 162))) config.addV1System(snmpEngine, 'my-area', 'mycommunity') mqtt_client = mqtt.Client() mqtt_client.username_pw_set("admin", "YourPassword123") mqtt_client.connect("broker-ip", 1883, 60) mqtt_client.loop_start() def cbFun(snmpEngine, stateReference, contextEngineId, contextName, varBinds, cbCtx): trap_data = {} for name, val in varBinds: trap_data[str(name)] = str(val) mqtt_client.publish("snmp/trap", json.dumps(trap_data), qos=1) ntfrcv.NotificationReceiver(snmpEngine, cbFun) snmpEngine.transportDispatcher.jobStarted(1) snmpEngine.transportDispatcher.runDispatcher()

TRAP接收后直接转发到MQTT的snmp/trap主题,上层应用订阅这个主题就能实时收到所有设备的告警。

注意:TRAP使用的是UDP协议,不保证可靠送达。如果TRAP丢失,设备不会重发。所以关键告警不能只依赖TRAP,还要配合轮询做状态确认。

4. 双协议组合的完整实操流程

4.1 整体部署架构设计

一个完整的双协议组合系统包含以下组件:

组件作用推荐方案
MQTT Broker消息总线EMQX或Mosquitto
SNMP采集器轮询SNMP设备并转发到MQTTPython脚本或Telegraf
SNMP TRAP接收器接收设备主动告警Python脚本
边缘网关将RS-485/Modbus转换为MQTT自研或商用网关
数据存储时序数据存储InfluxDB或TDengine
可视化数据展示Grafana或自研看板

部署顺序建议是:先搭Broker,再部署SNMP采集器,然后接入MQTT设备,最后配置可视化和告警。

4.2 用Telegraf快速实现SNMP到MQTT的桥接

如果不想写代码,Telegraf是一个很好的选择。它内置了SNMP输入插件和MQTT输出插件,配置一下就能跑。

Telegraf的配置文件核心部分如下:

[[inputs.snmp]] agents = ["udp://192.168.1.10:161", "udp://192.168.1.11:161"] version = 2 community = "mycommunity" interval = "30s" [[inputs.snmp.field]] name = "sysName" oid = "1.3.6.1.2.1.1.5.0" [[inputs.snmp.field]] name = "sysUpTime" oid = "1.3.6.1.2.1.1.3.0" [[inputs.snmp.field]] name = "cpuLoad" oid = "1.3.6.1.4.1.2021.10.1.3.1" [[outputs.mqtt]] servers = ["tcp://broker-ip:1883"] topic = "snmp/{{ .Host }}/{{ .Name }}" username = "admin" password = "YourPassword123" qos = 1

Telegraf会自动按照interval指定的间隔轮询SNMP设备,把数据发布到MQTT。Topic中的{{ .Host }}和{{ .Name }}是模板变量,会被替换成实际的主机和字段名。

这个方案的优点是配置简单、维护成本低,适合中小规模部署。缺点是灵活性不如自研采集器,比如做数据预处理、条件过滤就不太方便。

4.3 RS-485设备通过MQTT接入的实操

RS-485设备本身不支持MQTT,需要通过边缘网关转换。网关的作用是:向下用Modbus RTU协议读取RS-485设备的数据,向上用MQTT协议发布数据。

以常见的Modbus RTU温湿度传感器为例,网关的配置逻辑是:

  1. 配置串口参数:波特率9600、数据位8、停止位1、无校验
  2. 配置Modbus轮询:从站地址1、功能码03、起始寄存器0、寄存器数量2
  3. 配置数据解析:寄存器0和1组成一个32位浮点数,表示温度值
  4. 配置MQTT上报:Broker地址、Topic、上报间隔

网关读取到数据后,按照配置的解析规则转换成实际值,然后发布到MQTT。上层应用看到的就是标准的MQTT消息,完全不需要知道底层是RS-485。

提示:RS-485总线上的设备地址不能重复,否则会通信冲突。调试时先用Modbus调试工具确认每个设备的地址和寄存器映射,再配置网关。

4.4 数据统一建模与Topic规划

双协议组合最大的挑战不是技术实现,而是数据模型的统一。SNMP采集到的数据格式和MQTT设备上报的数据格式往往不一样,上层应用要处理两种格式会很痛苦。

解决方案是定义一个统一的数据模型。我通常用这样的JSON结构:

{ "deviceId": "plc-001", "deviceType": "plc", "protocol": "snmp", "timestamp": 1700000000000, "metrics": { "temperature": 68.5, "pressure": 0.85, "status": "running" }, "tags": { "area": "workshop1", "line": "line-a" } }

SNMP采集器在转发数据时,把OID映射成metrics里的字段名。MQTT设备上报时,也按照这个结构组织数据。这样上层应用只需要处理一种数据格式。

Topic规划建议按{protocol}/{area}/{deviceType}/{deviceId}/data来设计。比如snmp/workshop1/switch/sw-001/data和mqtt/workshop1/sensor/temp-001/data。这样既能按协议筛选,也能按区域和设备类型筛选。

5. 常见问题与排查技巧实录

5.1 SNMP采集常见问题速查

问题现象可能原因排查方法
SNMP GET超时网络不通、团体名错误、设备未开启SNMP先用snmpwalk命令测试连通性
返回noSuchObjectOID不存在或MIB未导入对照设备MIB文档确认OID
返回noSuchNameOID格式错误或设备不支持检查OID是否有多余的.0后缀
TRAP收不到设备未配置TRAP目标、防火墙拦截UDP 162在设备端确认TRAP配置,检查防火墙规则
数据值异常OID对应错误、数据类型解析错误用MIB Browser查看原始返回值

5.2 MQTT连接与消息问题排查

MQTT最常见的问题是连接断开和消息丢失。

连接断开的原因通常是:网络抖动、Broker负载过高、客户端心跳超时。排查时先看Broker日志,确认是客户端主动断开还是被Broker踢掉。如果是心跳超时,适当增大keepalive值。如果是网络抖动,确保客户端实现了自动重连逻辑。

消息丢失的原因通常是:QoS设置不当、Topic订阅不匹配、Broker消息队列满了。排查时先用mosquitto_sub -t '#' -v订阅所有消息,确认消息是否到达Broker。如果到了Broker但订阅端没收到,检查Topic通配符是否匹配。如果Broker都没收到,检查发布端的QoS和连接状态。

5.3 双协议时间同步问题

SNMP采集器和MQTT设备的时间可能不一致,导致数据时间戳混乱。解决方案是:所有数据的时间戳以Broker接收时间为准,或者在采集器和设备端都配置NTP同步。

我在项目中遇到过SNMP采集器所在服务器时间慢了5分钟,导致看板上SNMP设备的数据总是“滞后”。后来统一配置了NTP,问题解决。这个坑不大,但排查起来很费时间,因为你会先怀疑网络延迟、Broker性能,最后才想到是服务器时间问题。

5.4 性能优化经验

当设备数量上去之后,性能问题会逐渐暴露。几个关键的优化点:

SNMP轮询并发化。单线程轮询100台设备,每台30秒超时,一轮下来要50分钟。改成多线程或异步IO,并发轮询,一轮可以压缩到1分钟以内。

MQTT消息批量发送。如果采集器每读一个OID就发一条MQTT消息,消息数量会爆炸。应该把一台设备的所有OID数据组装成一条消息发送。

Broker参数调优。EMQX的默认配置适合小规模场景,设备多了要调整max_connections、max_packet_size、message_rate_limit等参数。Mosquitto则要调整max_connections和max_queued_messages。

数据存储降采样。原始数据高频写入时序数据库,查询时会很慢。应该配置降采样规则,比如原始数据保留7天,1分钟聚合数据保留30天,1小时聚合数据保留1年。

5.5 安全加固要点

工业设备管理系统的安全不能马虎。几个必须做的加固措施:

SNMP方面,v2c必须改掉默认团体名,v3必须启用认证和加密。ACL限制只允许采集器IP访问设备的SNMP端口。

MQTT方面,必须启用认证,每个设备独立账号密码。启用TLS加密,防止消息被窃听。Topic权限要细粒度控制,设备只能发布和订阅自己相关的Topic。

网络安全方面,SNMP采集器和MQTT Broker部署在内网,不直接暴露到公网。如果必须跨网段访问,通过防火墙限制源IP和端口。

我在实际项目中踩过最大的坑是:一个项目的MQTT Broker没有启用认证,结果被扫描到之后,有人往Topic里发了大量垃圾消息,导致看板数据混乱。后来加了认证和ACL才解决。这个教训告诉我,安全配置不是可选项,是必选项。

6. 从单点验证到规模化部署的进阶思路

6.1 先用最小系统跑通链路

不要一上来就搞大规模部署。先用一台SNMP设备、一个MQTT Broker、一个采集器脚本,把“SNMP读取→MQTT发布→订阅端接收”这条链路跑通。确认数据能正确流转之后,再逐步增加设备数量和类型。

最小系统的验证清单:

  • SNMP GET能返回正确值
  • 采集器能把值发布到MQTT
  • 订阅端能收到消息且格式正确
  • 设备离线时能检测到
  • 数据时间戳准确

这五点都通过了,再考虑扩展。

6.2 灰度上线与回滚方案

规模化部署时,建议按区域或设备类型分批上线。先上一个车间,观察一周,确认稳定后再上第二个车间。每批上线前准备好回滚方案——如果新系统出问题,能快速切回旧系统。

回滚方案的核心是:采集器和Broker的配置要版本化管理。每次变更前备份配置文件,出问题能一键恢复。设备端的SNMP配置变更也要记录,方便回退。

6.3 监控系统自身的健康状态

双协议组合系统本身也需要被监控。关键指标包括:Broker的连接数、消息吞吐量、消息堆积量;采集器的轮询成功率、平均响应时间;SNMP设备的在线率;MQTT设备的在线率。

这些指标可以通过MQTT自身来上报——采集器定期往system/health主题发布自己的状态,Broker的监控数据通过EMQX的REST API获取。然后用Grafana做一个系统健康看板,运维人员一眼就能看到整个系统是否正常。

我在实际运维中体会最深的一点是:工业设备管理系统的价值不在于技术多先进,而在于稳定可靠。一个能稳定运行三年的简单系统,比一个功能花哨但每周出问题的复杂系统有价值得多。MQTT加SNMP的组合,本质上是用成熟的技术解决实际问题,不追求新潮,只追求管用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 12:07:07

单视频三维实时重构支撑化工罐区、管廊、装卸区立体预警技术解析

技术权属说明&#xff1a;化工三区立体风险感知、单视频三维态势预警、罐区-管廊-装卸区一体化风险耦合研判、复杂工业场景微小隐患前置预警体系由华东师范大学浙江普陀时空大数据研究院耿文海团队原创研发&#xff0c;镜像视界&#xff08;浙江&#xff09;科技有限公司为唯一…

作者头像 李华
网站建设 2026/10/3 12:06:49

ccswitch使用教程:把CC Switch的endpoint改到TaoToken的完整配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华