news 2026/9/27 13:01:39

工厂设备数据采集、可视化与告警一体化物联网方案实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工厂设备数据采集、可视化与告警一体化物联网方案实战

1. 从一台注塑机说起:这套方案到底要解决什么问题

我在工厂车间里待过的年头不算短,见过太多“数据孤岛”的场面。一台注塑机跑了八年,操作工每天拿本子抄参数,班长拿计算器算良率,设备科长月底对着Excel发愁。老板问“昨天那批货为什么不良率高”,没人答得上来,因为数据要么没采,要么采了躺在PLC里没人看,要么看了也不知道该报警给谁。

工厂设备数据采集、可视化、告警一体化物联网解决方案,说白了就是把这三件事串成一条线:设备里的数据自动读出来,读出来之后用图表实时呈现,一旦某个参数越界就立刻通知到该知道的人。听起来简单,但真正落地的时候,坑比想象的多得多。

这套方案适合谁看?如果你是工厂的自动化工程师、设备管理负责人、IT运维,或者正在做物联网相关项目(包括毕业设计级别的验证系统),这篇文章里的思路和实操细节都能直接参考。我不打算讲太多“物联网三层架构”这种教科书概念,而是从一台设备怎么接、数据怎么传、图表怎么画、告警怎么发这几个实际环节拆开说。

核心关键词就五个:数据采集、可视化、告警、物联网、工厂设备。这五个词构成了整套方案的骨架,缺一个,系统就是残废的。采集是入口,可视化是眼睛,告警是神经末梢,物联网是连接方式,工厂设备是服务对象。下面我按实际落地的顺序,一层一层拆。

2. 整体方案设计与技术选型思路

2.1 为什么不做“大而全”,而是分层解耦

很多工厂上物联网项目,第一反应是找一家供应商做“整体解决方案”,结果被绑定得死死的:采集网关只能用他家的,可视化平台只能用他家的,告警模块还得额外付费。一旦某个环节出问题,整条线都得等供应商来修。

我倾向于分层解耦的架构。采集层只管把设备数据读出来,用标准协议(比如MQTT)往外发;传输层用消息队列做缓冲;可视化层和告警层各自订阅数据,互不干扰。这样做的直接好处是:可视化工具换了,不影响采集;告警规则改了,不用动设备端代码。

具体分层是这样的:

层级职责常见选型选型理由
采集层从PLC、传感器、注塑机等读取原始数据边缘网关、Python脚本、LabVIEW DAQ靠近设备,延迟低,协议适配灵活
传输层数据缓冲与分发MQTT Broker、Kafka削峰填谷,支持多消费者
存储层时序数据持久化InfluxDB、TDengine、Redis写入快,查询效率高
可视化层实时图表与大屏Grafana、ECharts、OneNet开箱即用,支持自定义Dashboard
告警层规则判断与通知Alertmanager、Nightingale、企微机器人支持降噪、分组、静默

这个表不是让你照抄,而是让你理解每一层为什么存在。比如传输层用MQTT而不是HTTP轮询,是因为工厂设备数据是持续产生的,轮询会有延迟和无效请求;用Kafka而不是直接写数据库,是因为当可视化层和告警层同时消费数据时,需要一个可靠的缓冲机制。

2.2 采集频率与数据量的平衡计算

采集频率定多少,是第一个要算清楚的账。定高了,网络和存储扛不住;定低了,关键波动抓不到。

假设一个车间有50台注塑机,每台机器需要采集12个参数(温度、压力、速度、位置等),采集频率为1秒一次。那么每秒产生的数据点数是:

50台 × 12参数 × 1次/秒 = 600个数据点/秒

每个数据点按50字节估算(含时间戳、设备ID、参数名、值),每秒数据量约30KB,一天就是约2.6GB。如果采集频率提高到100毫秒一次,数据量直接翻十倍,一天26GB。对于大多数工厂的本地服务器来说,这个量级用TDengine或InfluxDB完全能扛住,但网络带宽和磁盘IO需要提前评估。

我的经验是:温度、压力这类缓变量,1秒一次足够;振动、位移这类快变量,可能需要100毫秒甚至更高。不要一刀切,按参数特性分别设置采集频率,能省下大量存储和计算资源。

2.3 为什么可视化层推荐Grafana而不是自己写前端

自己写前端不是不行,但成本太高。Grafana的优势在于:数据源接入简单(支持InfluxDB、MySQL、Prometheus等几十种),图表类型丰富,告警规则可以直接在面板上配置,而且支持变量和模板,一套Dashboard可以复用到多台设备。

如果你做的是毕业设计或者小型验证项目,ECharts加Python Flask也能快速出效果,但一旦设备数量超过20台,自己维护前端的工作量会急剧上升。Grafana的另一个好处是社区资源多,遇到问题搜一下基本都有答案。

2.4 告警层为什么要做“降噪”

工厂里最怕的不是没告警,而是告警太多。一台设备温度波动一下,五分钟内发了200条告警,操作工直接把通知静音了,真正的事故反而被淹没。

告警降噪的核心思路有三个:一是抑制,同一设备同一参数的连续告警只发第一条和恢复通知;二是分组,把同一时间段内多个相关告警合并成一条;三是静默,计划检修期间自动屏蔽对应设备的告警。Alertmanager和Nightingale都原生支持这些能力,关键是要配置好规则。

3. 数据采集层:从设备里把数据“抠”出来

3.1 先搞清楚你的设备能吐什么数据

不是所有工厂设备都支持标准协议。我见过最极端的情况:一台九十年代的注塑机,只有一个RS232串口,输出的是自定义的ASCII码,连Modbus都不是。这种设备要采集,只能靠串口监听加协议逆向。

常见的设备数据接口有这么几类:

  • PLC类:西门子S7、三菱FX、欧姆龙CP系列,支持Modbus TCP、OPC UA、S7协议等。这类最好采,用边缘网关或者Python的pymodbus、python-snap7库就能读。
  • 注塑机类:多数支持OPC UA或厂商私有协议,部分老机型只有串口。海天、震雄等品牌有对应的数据采集模块。
  • 传感器类:温度、压力、流量传感器,输出4-20mA模拟量或RS485数字量,需要DAQ模块转换。
  • 仪表类:电表、水表、气表,多数支持Modbus RTU或DL/T645协议。

注意:采集之前一定要拿到设备的通信协议手册,确认寄存器地址、数据类型(INT16、FLOAT32等)、字节序(大端还是小端)。字节序搞错,读出来的温度可能是几千度。

3.2 边缘网关 vs 工控机 vs 单片机

采集端的硬件选型,取决于设备数量和现场环境。

边缘网关(如研华、映翰通、有人物联网的产品)适合设备分散、需要协议转换的场景。优点是体积小、功耗低、支持多种协议,缺点是计算能力有限,不适合做复杂的数据预处理。

工控机适合设备集中、需要本地存储和边缘计算的场景。可以跑Python脚本、Node-RED、甚至轻量级数据库。缺点是成本高、需要维护操作系统。

单片机方案(如ESP32、STM32)适合单台设备、数据量小的场景,比如毕业设计里的食用菌栽培车间监控。成本极低,但开发周期长,稳定性依赖硬件设计。

我的建议是:超过10台设备,优先考虑边缘网关或工控机;少于5台,单片机或树莓派就够用。不要为了省几百块钱选单片机,后期调试和维护的时间成本远超硬件差价。

3.3 用Python写一个Modbus采集脚本的完整过程

假设你有一台支持Modbus TCP的注塑机,IP是192.168.1.100,端口502,需要采集温度(寄存器地址40001,FLOAT32)和压力(寄存器地址40003,FLOAT32)。

先安装依赖:

pip install pymodbus paho-mqtt

采集脚本的核心逻辑:

from pymodbus.client import ModbusTcpClient import paho.mqtt.client as mqtt import struct import time import json # Modbus连接 client = ModbusTcpClient('192.168.1.100', port=502) client.connect() # MQTT连接 mqtt_client = mqtt.Client() mqtt_client.connect('localhost', 1883, 60) def read_float(addr): result = client.read_holding_registers(addr, 2) if result.isError(): return None # 将两个16位寄存器合并为32位浮点数 raw = struct.pack('>HH', result.registers[0], result.registers[1]) return struct.unpack('>f', raw)[0] while True: temp = read_float(1) # 寄存器地址40001对应偏移1 pressure = read_float(3) payload = { 'equipment_id': 'IM-001', 'temperature': temp, 'pressure': pressure, 'timestamp': time.time() } mqtt_client.publish('factory/IM-001/data', json.dumps(payload)) time.sleep(1)

这段代码有几个关键点:FLOAT32需要读两个连续寄存器,然后用struct打包再解包;字节序用'>'表示大端,如果设备是小端,改成'<';MQTT主题按设备ID分层,方便后续订阅和路由。

实操心得:调试Modbus的时候,先用Modbus Poll或QModMaster这类工具手动读一次,确认地址和数据类型正确,再写代码。我见过太多人直接写脚本,结果地址偏移搞错,读了一整天都是零。

3.4 采集频率与异常处理

采集脚本不能裸奔,必须加异常处理。网络断了、设备断电、寄存器读取超时,这些情况都要考虑。

while True: try: temp = read_float(1) if temp is None: raise ValueError('读取温度失败') # ... 发布数据 except Exception as e: print(f'采集异常: {e}') # 尝试重连 client.close() time.sleep(5) client.connect() time.sleep(1)

另外,采集频率不要写死在代码里,最好做成配置文件或者从环境变量读取。不同设备的采集频率可能不同,硬编码会导致后期调整非常麻烦。

4. 数据传输与存储:让数据“流”起来而不是“堆”起来

4.1 MQTT主题设计规范

MQTT的主题设计直接影响后续的可视化和告警配置。我推荐的结构是:

factory/{车间}/{设备类型}/{设备ID}/{数据类别}

比如:

factory/workshop-a/injection-molding/IM-001/telemetry factory/workshop-a/injection-molding/IM-001/status factory/workshop-a/injection-molding/IM-001/alarm

这样设计的好处是:可视化层可以用通配符订阅整个车间的数据(factory/workshop-a/#),告警层可以只订阅告警主题,存储层可以按设备类型分别写入不同的数据库表。

注意:MQTT主题不要用中文,不要用空格,不要用特殊字符。虽然协议本身支持,但很多Broker和客户端在处理时会出问题。

4.2 用Redis做实时数据缓存

Redis在整套方案里扮演两个角色:一是实时数据缓存,可视化层需要最新值时直接从Redis读,不用查时序数据库;二是告警状态存储,记录每个告警的当前状态(触发中、已恢复、已确认)。

Redis的数据结构选择:

  • String:存储单个设备的最新值,key格式device:IM-001:temperature,value是数值。
  • Hash:存储一台设备的所有参数,key是device:IM-001,field是参数名,value是数值。
  • Sorted Set:存储告警队列,score是时间戳,member是告警ID。

用Hash的好处是可以一次性获取一台设备的所有参数,减少网络往返。设置过期时间(比如60秒),避免Redis内存无限增长。

如果你需要可视化Redis里的数据,可以用RedisInsight或Another Redis Desktop Manager这类工具,直接看到key的分布和值的变化。但生产环境不建议频繁用GUI工具连生产Redis,容易误操作。

4.3 时序数据库选型:InfluxDB vs TDengine

对比项InfluxDBTDengine
写入性能高极高,专为时序优化
查询语言Flux/InfluxQLSQL-like
集群支持企业版开源版支持
生态非常丰富国内社区活跃
学习曲线中等低,会SQL就能用

如果团队熟悉SQL,TDengine上手更快;如果需要跟Grafana深度集成,InfluxDB的插件更成熟。我个人的选择是:中小规模用TDengine,大规模且需要复杂查询用InfluxDB。

建表的时候,TDengine的超级表设计很关键:

CREATE STABLE factory_data ( ts TIMESTAMP, temperature FLOAT, pressure FLOAT, speed FLOAT ) TAGS ( equipment_id NCHAR(32), workshop NCHAR(32) );

每台设备自动创建一个子表,写入时只需要指定TAG,查询时可以按设备、按车间聚合。这种设计比传统关系型数据库的行存储效率高得多。

4.4 数据清洗与预处理

原始数据不能直接存,要先做清洗。常见的清洗规则:

  • 去重:同一设备同一时间戳的数据只保留一条。
  • 补缺:如果某个参数读取失败,用前值填充或标记为NULL,不要直接丢弃整条记录。
  • 单位统一:温度统一为摄氏度,压力统一为MPa,避免后续计算混乱。
  • 异常值过滤:超出物理量程的值(比如温度-100度或5000度)直接标记为无效。

这些清洗逻辑可以放在采集脚本里做,也可以放在传输层用流处理做。如果数据量不大,放在采集脚本里最简单;如果数据量大且需要复杂规则,考虑用Kafka Streams或Flink。

5. 可视化层:让数据“说话”

5.1 Grafana Dashboard设计原则

Grafana的核心是Dashboard,但很多人做出来的Dashboard要么信息过载,要么关键信息找不到。我的设计原则是:

第一屏看全局,第二屏看细节,第三屏看历史。

第一屏放车间级的总览:设备在线率、总产量、当前告警数、能耗趋势。用Stat面板显示关键指标,用Time Series显示趋势,用Table显示设备列表和状态。

第二屏放单台设备的详情:温度曲线、压力曲线、速度曲线,叠加设定值和上下限。用Gauge显示当前值,用Bar Chart显示班次对比。

第三屏放历史查询:支持按时间范围、按设备、按参数筛选,用Heatmap显示参数分布,用Histogram显示统计特征。

实操心得:Dashboard的颜色不要超过五种,红色只用于告警,绿色只用于正常,黄色用于警告。颜色太多反而让人抓不住重点。

5.2 用ECharts做自定义可视化大屏

Grafana适合运维人员看,但工厂老板可能更喜欢大屏。ECharts做可视化大屏的优势是灵活,想怎么画就怎么画。

一个典型的工厂大屏包含:

  • 顶部:车间名称、当前时间、天气(可选)
  • 左侧:设备状态环形图,在线、离线、告警三种状态
  • 中间:产量趋势折线图,按小时聚合
  • 右侧:实时告警滚动列表
  • 底部:能耗柱状图,按设备对比

ECharts的数据可以通过WebSocket从后端推送,也可以用定时器轮询API。WebSocket的实时性更好,但需要后端支持;轮询实现简单,适合数据更新频率不高的场景。

5.3 OneNet等平台的可视化能力

如果不想自己搭Grafana和ECharts,可以用OneNet这类物联网平台的可视化工具。OneNet支持数据流接入、触发器配置、可视化编辑器,适合快速验证。

但OneNet的局限性也很明显:自定义程度低,复杂图表做不了,数据导出不方便。如果只是做毕业设计或者小型演示,OneNet够用;如果要上生产环境,还是建议自建可视化层。

5.4 可视化中的常见陷阱

陷阱一:刷新频率过高。有人把Dashboard的刷新间隔设成1秒,结果浏览器卡死,数据库压力巨大。实际上,大多数工厂参数的变化是缓慢的,5秒或10秒刷新一次完全够用。

陷阱二:图表类型选错。温度趋势用折线图,设备状态用饼图或环形图,产量对比用柱状图。不要用折线图显示分类数据,也不要用饼图显示时间序列。

陷阱三:忽略移动端。车间主任不可能一直坐在电脑前,Dashboard要能在手机上看。Grafana支持响应式布局,ECharts需要额外做适配。

6. 告警层:从“狼来了”到“精准打击”

6.1 告警规则设计:阈值、持续时间、恢复条件

告警规则不是简单的“大于多少就报警”。一个完整的规则包含三个要素:

  • 阈值:触发告警的临界值,比如温度大于80度。
  • 持续时间:条件持续多久才触发,比如持续30秒。这可以过滤掉瞬时波动。
  • 恢复条件:什么时候解除告警,比如温度降到75度以下。

在Alertmanager中,规则配置大概是这样的:

groups: - name: factory_alerts rules: - alert: HighTemperature expr: temperature > 80 for: 30s labels: severity: warning equipment: "{{ $labels.equipment_id }}" annotations: summary: "设备 {{ $labels.equipment_id }} 温度过高" description: "当前温度 {{ $value }} 度,持续超过30秒"

for: 30s就是持续时间,表示条件满足30秒后才真正触发告警。这个参数非常关键,设得太短会误报,设得太长会漏报。

6.2 告警降噪的三种实战手段

手段一:抑制规则。当一台设备的高温告警触发时,抑制同一设备的其他告警,避免告警风暴。

inhibit_rules: - source_match: alertname: HighTemperature target_match_re: alertname: .* equal: ['equipment_id']

手段二:分组。把同一车间、同一类型的告警合并成一条通知。

route: group_by: ['workshop', 'alertname'] group_wait: 30s group_interval: 5m repeat_interval: 4h

group_wait表示等待30秒再发送,这段时间内同组的新告警会合并进来;repeat_interval表示如果告警一直没恢复,每4小时重复通知一次,避免频繁骚扰。

手段三:静默。计划检修期间,通过Alertmanager的Silence功能临时屏蔽对应设备的告警。可以手动创建,也可以通过API自动创建。

6.3 企微机器人告警通知的完整配置

企业微信机器人是工厂环境中最常用的通知方式,因为大家本来就用车企微办公。

首先在企微群里添加一个机器人,拿到Webhook地址。然后用Alertmanager的Webhook Receiver转发告警:

receivers: - name: 'wechat' webhook_configs: - url: 'http://your-webhook-adapter:5000/send' send_resolved: true

中间需要一个适配器把Alertmanager的JSON格式转换成企微机器人的消息格式。用Python写一个简单的Flask服务:

from flask import Flask, request import requests app = Flask(__name__) WECHAT_WEBHOOK = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key' @app.route('/send', methods=['POST']) def send_alert(): data = request.json for alert in data.get('alerts', []): status = alert['status'] name = alert['labels']['alertname'] equipment = alert['labels'].get('equipment', '未知') summary = alert['annotations'].get('summary', '') color = 'warning' if status == 'firing' else 'info' message = { 'msgtype': 'markdown', 'markdown': { 'content': f"**{summary}**\n> 状态: {status}\n> 设备: {equipment}" } } requests.post(WECHAT_WEBHOOK, json=message) return 'ok'

注意:企微机器人有频率限制,每分钟最多20条消息。如果告警量大,一定要做好分组和抑制,否则消息会被限流。

6.4 告警升级与值班机制

不是所有告警都需要立刻处理。我通常把告警分为三级:

  • P0(紧急):设备停机、安全事故、严重影响生产。立即通知,5分钟未确认则升级到主管。
  • P1(重要):参数越界但未停机,可能影响质量。通知到班组,30分钟未处理则升级。
  • P2(提示):参数接近阈值,需要关注。只记录,不主动通知。

升级机制可以通过Alertmanager的repeat_interval和路由规则实现,也可以自己写一个简单的值班调度服务。

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

7.1 采集端常见问题速查表

问题现象可能原因排查方法解决方案
读到的值全是0寄存器地址错误用Modbus Poll手动读核对协议手册,确认地址偏移
读到的值明显异常字节序错误检查数据类型和字节序大端改小端,或反之
采集时断时续网络不稳定ping设备IP,看丢包率改用有线连接,或增加重连逻辑
数据延迟高采集频率过高查看CPU和网络占用降低频率,或增加边缘计算
设备离线无数据设备断电或网关故障检查电源和指示灯增加心跳检测,离线告警

7.2 可视化端常见问题

问题:Grafana图表显示“No Data”。先检查数据源连接是否正常,再检查查询语句是否正确,最后检查时间范围是否匹配。我遇到过好几次是因为时区设置不对,数据写入了但查询时间范围差了8小时。

问题:Dashboard加载慢。原因通常是查询范围太大或查询语句太复杂。解决方案是:限制默认时间范围为最近1小时,使用降采样查询,避免在Dashboard上做全表扫描。

问题:ECharts图表不更新。检查WebSocket连接是否断开,或者定时器是否被清除。浏览器控制台的Network面板能看到具体原因。

7.3 告警端常见问题

问题:告警发了但没收到。检查Webhook地址是否正确,检查企微机器人是否被移出群,检查Alertmanager的日志有没有报错。

问题:告警重复发送。检查repeat_interval是否设置得太短,检查是否有多个Alertmanager实例同时发送。

问题:告警恢复通知没发。检查send_resolved是否设置为true,检查恢复条件是否满足。

7.4 独家避坑技巧

技巧一:采集脚本加日志。不要只print,用logging模块写到文件,按天切割。出问题的时候,日志是唯一的线索。

技巧二:MQTT Broker加认证。不要用匿名连接,设置用户名密码,或者用客户端证书。工厂内网也不是绝对安全的。

技巧三:数据库定期清理。时序数据增长很快,设置数据保留策略,比如只保留最近3个月的数据,历史数据归档到冷存储。

技巧四:告警规则先松后紧。刚上线的时候,阈值设宽一点,观察一段时间再收紧。一上来就设得很严,会被误报淹没。

技巧五:可视化大屏加“数据更新时间”。让看的人知道数据是不是最新的,避免拿着过期数据做决策。

8. 从毕业设计到生产环境:不同规模的落地建议

如果你是做物联网毕业设计,比如“食用菌栽培车间物联网环境智能监控系统设计”,这套方案的简化版完全够用:一个ESP32采集温湿度,MQTT传到本地服务器,Grafana展示,企微机器人告警。成本不到500块,两周能跑通。

如果你是工厂小规模试点,比如先在一台注塑机上验证,建议用边缘网关加本地服务器,采集频率1秒,存储用TDengine,可视化用Grafana,告警用Alertmanager加企微。这套组合稳定、开源、社区资源多。

如果你是全厂推广,需要考虑设备数量、网络架构、数据安全、高可用等问题。采集层用工业网关集群,传输层用Kafka集群,存储层用TDengine集群,可视化层用Grafana加负载均衡,告警层用Nightingale做统一管理。这时候就不是技术问题了,而是工程问题和运维问题。

我在实际项目中踩过最大的坑,是低估了现场网络的复杂性。车间里的电磁干扰、网络抖动、设备断电,这些在实验室里遇不到的问题,在生产环境里天天发生。所以,任何采集脚本都要有重连机制,任何告警都要有抑制规则,任何可视化都要有降级方案。这套方案的核心不是用了多少先进技术,而是能不能在恶劣环境下稳定跑下去。

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

SLAM学习路线全攻略:从零搭建激光与视觉SLAM知识体系

1. 从零开始搭建SLAM学习路线&#xff1a;一个过来人的完整笔记SLAM这个词&#xff0c;如果你刚接触机器人或者自动驾驶领域&#xff0c;大概率已经被它反复轰炸过了。全称Simultaneous Localization and Mapping&#xff0c;中文叫同步定位与建图。说白了就是一台机器在一个完…

作者头像 李华
网站建设 2026/9/27 12:57:05

工业物联网MQTT协议实战:从原理到部署的完整指南

1. 为什么工业物联网最终都绕不开MQTT如果你在工业现场待过&#xff0c;一定见过这样的场景&#xff1a;车间里几十台PLC、传感器、扫码枪各自跑着不同的协议&#xff0c;Modbus RTU走串口&#xff0c;Profinet走网线&#xff0c;还有一堆私有协议&#xff0c;数据要汇总到中控…

作者头像 李华
网站建设 2026/9/27 12:56:44

vue2 项目接入 tailwind css:vscode 配置与 100% 成功验证

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

作者头像 李华
网站建设 2026/9/27 12:54:25

Codex 实战:新人上手的关键步骤与 TaoToken 配置指南

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

作者头像 李华
网站建设 2026/9/27 12:53:29

以太网温湿度变送器双协议调试:SNMP与TCP长连接并行实战

1. 项目缘起与整体设计思路1.1 为什么选以太网温湿度变送器这个方向机房、药厂洁净车间、档案馆、温室大棚、锂电池老化房&#xff0c;这些场景有一个共同点&#xff1a;温湿度数据必须连续记录&#xff0c;而且一旦超标要能立刻被上层系统感知。传统的做法是RS485总线拉一串温…

作者头像 李华