这几年一直在折腾设施农业的环境监测,真正稳定跑起来的一套组合,是很多帖子里不太起眼的那套:Air8000A做4G主控,刷上iRTU开源固件去管理RS485总线上的Modbus报文,再用AirUI搭可视化页面。整套系统从传感器选型、总线布线,到固件配置、页面联调,再到现场反复排障,前前后后花了大半年,踩了不少坑。这篇就把从0到1的全过程写清楚,包含选型理由、具体配置、联调思路和踩坑排障链路,给准备做同类多传感器环境监测项目的朋友一个可直接参考的蓝本。
1. 从需求倒推方案:为什么是RS485、Air8000A和iRTU这套组合
1.1 环境监测到底要多传感器:先把需求硬约束摆出来
做环境监测系统和做一个网页看板完全不同,最核心的约束在物理现场。我当时要做的是一个小型设施农场的大棚环境监测,点位需求并不复杂,但足够典型:棚内温度和湿度、光照强度、土壤含水率、二氧化碳浓度。看似只有五类数据,但每个数值都要覆盖至少三个监测点,否则单点数据没有代表性。也就是说,现场至少挂十几个传感器,分布在几十米甚至一百米长的棚内。
这个距离和数量一摆出来,很多方案立刻被否掉。Wi-Fi传感器在金属棚架和植物遮挡下信号衰减明显,一个点一个地配网也是噩梦;蓝牙方案距离更短,只适合近距离演示;模拟量4-20mA方案传输距离远,但每个传感器都要单独拉一组信号线到采集端,十几个点位的线缆成本和施工量非常难看。剩下的主流方案基本就是RS485总线,一条双绞线串起所有传感器,主机轮询读取,距离能到几百米甚至上千米。
从运维角度看,RS485还有一个隐性好处在后面验证了:总线结构和Modbus协议非常开放,哪天觉得某家的传感器质量不行,只要寄存器地址和功能码一致,同型号替换很方便;即使寄存器映射不一致,翻一下手册改配置即可,不用动硬接线。对长期运行的环境监测项目来说,这种可替换性非常加分。
对比下来,各方案的取舍可以用一张表说清楚:
| 方案 | 传输距离 | 布线成本 | 抗干扰 | 扩展能力 | 我的结论 |
|---|---|---|---|---|---|
| Wi-Fi传感器 | 30-50米 | 低 | 一般 | 弱 | 大棚场景不推荐 |
| 蓝牙BLE | 10-20米 | 低 | 一般 | 弱 | 只适合近距离 |
| 模拟量4-20mA | 数百米 | 高 | 较好 | 一般 | 点位多时成本高 |
| RS485总线 | 1200米内 | 低 | 好 | 强 | 最终采用 |
1.2 主控、固件、页面三层分工:Air8000A、iRTU、AirUI各管什么
硬件链路定了RS485之后,接着就要选主控。我当时的要求很明确:要能直接出外网数据,不能依赖现场有电脑或路由器;要有足够的串口资源去接RS485总线;整机功耗要可控,最好能进入低功耗模式;还要留扩展能力,比如通过GPIO控制排风扇、水泵这些执行设备。
Air8000A就是按这个思路被选中的。它本身是集成4G通信能力的主控模组,自带串口、GPIO、ADC等常用外设,跑联网协议和处理业务逻辑都不成问题。相比传统单片机配一个4G模块再加一个RS485转接芯片的做法,Air8000A把通信和计算集成在一起,硬件设计更简单,现场接线和故障点也少很多。
但光有主控还不够,Modbus轮询、CRC校验、超时重试、断线重连这些协议细节如果全部自己写,工作量很大,而且很容易在边角情况下出问题。这里就用到了iRTU这套开源固件。它把RS485总线上的Modbus RTU轮询逻辑、数据转换、MQTT上报这些通用能力都封装好了,我只需要通过配置文件告诉它:串口参数是什么、传感器挂在哪些从机地址上、读取哪些寄存器、数据往哪个MQTT主题推。这省掉的不是一点点时间,而是半个月到一个月级的开发量。
AirUI负责的是最后一公里:页面展示。环境监测数据如果不能直观看到,前面所有链路都白做。AirUI解决的是实时数值卡片、历史曲线、告警列表这些常见页面组件的快速搭建。它的定位不是替代业务后端,而是把“数据能看”这件事做得足够轻量。三层分工明确了,后面每一个环节才知道配置改哪里、报错查哪里。
1.3 传感器选型与Modbus寄存器规划
传感器是整个系统里最像“黑盒”的部分。同一个“RS485温湿度传感器”,不同厂家的默认地址、寄存器顺序、数据精度完全可能不同。我建议选型阶段就强制要求供应商提供寄存器表,拿不到寄存器表的传感器直接不列入备选。
最终选定的传感器参数如下,覆盖了这个项目的基本需求:
| 传感器类型 | 量程 | 输出接口 | 供电 | 默认从机地址 | 读取寄存器 |
|---|---|---|---|---|---|
| 温湿度一体 | 温度-40~80℃、湿度0~100%RH | RS485 Modbus | 12V | 1 | 保持寄存器0x0001起 |
| 光照度 | 0~200kLux | RS485 Modbus | 12V | 2 | 保持寄存器0x0001起 |
| 土壤水分 | 0~100% | RS485 Modbus | 12V | 3 | 保持寄存器0x0001起 |
| 二氧化碳 | 0~5000ppm | RS485 Modbus | 24V | 4 | 保持寄存器0x0001起 |
注意默认地址这一列,这是后面第一个大坑的伏笔。大多数传感器出厂地址都是1,如果现场挂多个同型号传感器,开机后总线上一片混乱,谁的数据都读不对。所以硬件安装之前,第一步就是把每台传感器的地址规划好,逐个改成不重复的地址,并贴好标签。这个习惯能帮你后面少掉一半头发。
寄存器规划同样要在开工前做好。我把每个点位定义成一个“数据点”,字段名统一用英文小写加下划线,比如temp、humi、light、soil_moisture、co2。为什么强调这个?因为后续MQTT主题、AirUI页面绑定字段、告警规则全部依赖这一层命名。如果前期字段名不统一,后期联调时改一个字段名要牵连固件配置、脚本解析、页面绑定三处,非常痛苦。
2. 硬件链路搭建:RS485接线、供电和iRTU固件的首次配置
2.1 总线拓扑与现场接线:A/B、共地、终端电阻和供电分流
RS485总线在现场的接法其实很固定,但恰恰是这些“固定动作”最容易出问题。标准做法是所有传感器的RS485接口用双绞线并联到同一对A/B线上,主控作为主机挂在总线一端。我用的线缆是带屏蔽层的双绞线,A接A、B接B这句话说了无数遍,但现场经常有人把A/B接反,导致通信时好时坏。
接线的具体流程,建议按这个顺序来:
- 先把所有传感器断电,在主控端规划好总线主线走向,避免出现星形分支过长的情况。
- 用剥线钳处理传感器线缆,屏蔽层单端接地,不要两端都接,否则现场容易形成地环路。
- 所有传感器的A线并接在总线A上,B线并接在总线B上,线头用防水接线端子压好,不能裸露铜线。
- 在总线两端各并联一个120欧终端电阻,用于匹配线路阻抗、减少信号反射。
- 传感器供电线单独走一路,不要和信号线共用线管,避免电源纹波干扰485差分信号。
共地这个细节我单独拿出来说。RS485是差分信号,理论上靠A/B之间的电压差传数据,但很多低成本传感器的收发器芯片需要参考地,不然共模电压可能超出芯片允许范围,轻则通信偶尔失败,重则烧毁芯片。所以我在主控端和末端传感器之间额外布置了一根公共地线,把各传感器的GND和主控的GND连在一起。实测下来,加了共地之后,总线抗干扰能力明显提升。
供电方面,温湿度、光照、土壤水分这些传感器大多是宽压设计,我统一用12V开关电源供电,二氧化碳传感器按手册要求用24V单独一路供电。这里有个容易忽略的点:RS485总线上的传感器虽然不参与数据线供电,但它们的收发器在设备通电后就会占用总线电平,所以尽量让所有传感器同时上电,避免部分设备先上电占用总线,导致其他设备上电时通信错乱。在现场我加了一个总开关,统一控制整条总线的通断。
2.2 设置传感器地址与验证Modbus通信
传感器地址规划好之后,就要对每一台设备实际设置地址。我的做法是用一个USB转RS485调试器,直接接到电脑上,先把传感器单独挂载,用串口调试助手发送Modbus指令。单台挂载的好处是即使地址重复也不会互相干扰,可以安全地修改。
以常见的温湿度传感器为例,如果要把地址从默认的1改成10,需要发送类似这样的Modbus RTU写寄存器指令:
发送:01 06 00 01 00 0A CRC其中01是当前从机地址,06是写单个寄存器功能码,00 01是寄存器地址,00 0A是要写入的新地址10,CRC是循环冗余校验码,通常用工具自动计算。执行成功后传感器会返回同样的报文,然后断电重启,新地址生效。
地址设置完,还要用“读保持寄存器”指令验证一下:
发送:01 03 00 01 00 02 CRC这条指令的含义是:请求地址为01的设备,用功能码03读取起始地址0x0001、长度2个寄存器的数据。返回的报文前面是从机地址和功能码,中间是数据字节数,后面是实际数值,最后是CRC。第一次读到数据时,最好和历史曲线或者实物仪表对比一下,确认数值符合物理常识。比如大棚里今天湿度接近100%,结果读到个位数,那大概率是寄存器地址偏了,或者字节序反了。这个验证步骤虽然枯燥,但能省掉后面整条链路的排查时间。
2.3 在iRTU里配置串口、轮询任务和MQTT通道
硬件连线全部确认无误后,才轮到iRTU固件的配置。这套固件的核心思路是“配置驱动”,我只需要维护一份配置,把串口、Modbus轮询、MQTT上报三部分对接起来。
串口部分,我用的参数是波特率9600、数据位8、停止位1、无校验,也就是常说的8N1。多数RS485环境传感器默认出厂也是9600/8N1,匹配度最高。如果传感器手册上写的是其他波特率,例如19200或者偶校验,那配置必须改成和传感器一致,否则后面就是无休止的CRC错误和超时。
轮询任务部分,核心字段是轮询间隔、超时时间和重试次数。我第一版配置用的是1000毫秒轮询、200毫秒超时,结果现场有几台传感器响应慢,频繁报错。后来把轮询间隔调整到1500毫秒、超时放宽到500毫秒、失败重试3次,整体稳定性才上来。这里的原则是:轮询间隔不要设太短,因为一台传感器响应需要时间,总线上挂的设备越多,完整轮询一圈的时间就越长;如果轮询间隔小于总线一圈的总耗时,就会出现任务堆积,后读的数据全是上一轮的旧值。
MQTT通道部分,我配置了云端Broker地址、端口、ClientID、用户名密码、发布主题和订阅主题。每个点位的数据以JSON格式发布到固定主题,类似这样:
{ "sn": "site_01", "ts": 1717084800, "temp": 26.5, "humi": 72.3, "light": 18500, "soil_moisture": 45.2, "co2": 860 }这里的ts字段是Unix时间戳,一定要由主控在读取数据时打上,不能等服务器接收时再打。因为如果设备断网半小时,补报数据的时间戳如果全填服务器接收时间,历史曲线会完全失真。配置文件改完后,重启固件让它重新加载,然后观察串口日志,确认轮询任务确实在按预期读取传感器数据,再进入下一阶段。
3. AirUI页面与完整数据链路:让传感器数据变成能看的看板
3.1 从RS485到云端的真实数据流
很多人把页面开发理解成“画界面”,但如果数据链路没理清楚,页面做好了也是无源之水。我这条链路实际跑通后的完整流向是这样的:
现场传感器 -> RS485总线 -> Air8000A串口 -> iRTU固件按Modbus轮询 -> 解析寄存器值并组装JSON -> MQTT发布到云端Broker -> 后端服务订阅并存储 -> AirUI页面通过接口拉取数据 -> 最终渲染成实时卡片、折线图和告警列表。
这里最关键的一环在“MQTT发布”和“AirUI拉取”之间。AirUI本身不是一个完整的物联网平台,它没有内置设备管理和历史数据库,所以我在中间加了一层轻量级后端服务,负责订阅MQTT消息、把JSON解析后写入数据库,同时提供HTTP接口给AirUI调用。AirUI只负责展示,不直接对接设备层。这个分层的理由是:页面频繁刷新的数据和设备实时上报的数据不能强耦合,一旦设备波动导致页面卡顿,问题会很难排查。
现场实施时,我建议先把MQTT Broker里的原始报文打印出来,确认数据已经稳定到达云端,再开始写页面。很多联调问题都出在数据根本没到云端,前端怎么调都调不对。先确认数据源头,再谈页面联调,这条顺序不能反。
3.2 AirUI页面搭建:实时卡片、历史曲线和告警列表
AirUI页面搭建的整体思路,可以概括成“绑定数据源、组件化渲染、定时刷新”。第一步是在工程里建立数据源配置,把每个点位对应的字段和接口地址维护好,比如实时数据接口返回最新的temp、humi、soil_moisture等字段,历史数据接口返回一段时间内的曲线点数组。
实时卡片是最简单的,直接在页面里放数值卡片组件,把字段绑定到对应数据源上。绑定的时候有两点要注意:一是单位要写清楚,温度单位是摄氏度,光照单位是勒克斯,土壤水分单位是百分比,很多页面数据看上去不对,其实就是单位标错了;二是小数位的保留要跟传感器精度匹配,温湿度显示一位小数足够,二氧化碳浓度取整即可,不要无脑展示一堆浮点尾巴。
历史曲线我用的是折线图组件,X轴是时间戳,Y轴是量测值。实现时,我会把一段时间内的历史数据一次性从接口拉回来,在页面内按时间排序后传给图表组件,而不是让每个图表自己去轮询后端。这样后端压力小,页面刷新节奏也更容易控制。刷新间隔我按项目实际需求设成10秒,既不漏掉趋势变化,也不至于把数据库查爆。
告警列表的逻辑稍微复杂一点。除了把告警记录展示出来,还要处理“确认”和“恢复”两种状态。比如温度超过35度触发高温告警,页面列表里显示告警时间、点位、数值、状态;等温度回落到32度以下,系统产生一条恢复记录,同一条告警被标记为“已恢复”。这需要在后端维护告警状态机,AirUI只负责展示和标记已读,不要在页面里维护告警规则。告警规则的维护放到后端配置里,这样调整阈值不用重新发版页面。
3.3 数据告警与远程联动
环境监测如果只是“看到数据”,价值还差一半;另一半在于异常时能告警、能联动。AirUI页面里我做了两个层面的联动:页面告警展示和远程控制下发。
告警阈值的配置,我采用后端配置加页面展示的方式。例如大棚温度超过35摄氏度触发高温告警,土壤水分低于20%触发缺水告警。后端的告警模块收到MQTT数据后,按点位规则判断是否触发,触发后既写入告警记录,又通过消息推送通道把提醒发到运维人员手机上。页面上只展示告警状态和触发时间,让看板成为日常巡检的入口。
远程联动这块,场景是夏天大棚温度过高时,通过页面按钮远程打开排风扇。AirUI页面上放一个开关控件,点击后向后端接口发送控制指令,后端通过MQTT下发到Air8000A主控,主控收到指令后控制GPIO输出,驱动继电器闭合排风扇回路。这套链路看起来长,但每一环都是标准接口。唯一需要谨慎处理的是要有反馈机制:开关控件不能只显示“已点击”,还要等待主控回传“继电器已闭合”状态,再更新到界面上,否则会出现页面显示开了、现场根本没动作的情况。
页面和联动的开发顺序,我建议先做实时卡片,确认单条数据链路能通;再做告警列表,确认异常场景能触发;最后做远程控制按钮,因为它涉及设备端执行,排障范围最大,放到最后最稳妥。
4. 真机联调阶段,我踩得最深的四个坑及完整排查过程
4.1 两个从机默认地址都是1:数据串位与逐断开排查法
第一个让我印象深刻的坑,发生在一次现场轮询测试。iRTU日志里显示总线上的设备响应混乱,偶尔读到温度80多度,湿度100%,数据完全不符合物理常识。当时我第一反应是传感器坏了,拿着USB转485调试器单独测试,结果每一台单独读都正常。
后来仔细看日志才发现,同批次的两台温湿度传感器出厂默认地址都是1。它们在总线上同时存在时,主机发一条读地址1的指令,两台设备都会响应,由于响应速度和电平叠加不同,数据就变成了一台设备的高字节拼另一台设备的低字节,读出来的数值自然离谱。
排查链路我完整复盘一下,方便遇到类似问题的人直接照做:
- 首先看主控日志,确认是“全部点位失败”还是“个别点位数据错乱”。前者通常是总线物理层问题,后者多半是地址或寄存器冲突。
- 用USB转RS485调试器直接扫描总线,尝试发送读地址1、2、3的指令,观察哪些地址有响应。
- 发现有多个地址响应异常时,断开所有传感器,逐台接入总线,单台确认设备地址。
- 确认两台设备地址重复后,按前面说的方法,把其中一台改成新地址,并重新确认CRC返回正常。
解决后数据立即正常。这个坑的根本原因就是省掉了“地址规划”这一步。传感器挂上总线之前不初始化地址,总线越热闹,出问题的概率越大。后面我在项目规范里加了一条硬性要求:所有传感器上总线之前必须单独设置地址并贴标签,标签上写明地址、点位名称、寄存器起始地址。
4.2 轮询超时总是失败:波特率校验位和响应时序
第二个坑发生在接入第三台二氧化碳传感器之后。iRTU日志开始大量出现“modbus timeout”报错,前几台温湿度和光照都正常,唯独二氧化碳传感器时不时读不出来。我刚开始以为是这台传感器质量差,直接单独验证,结果单独读取一切正常,响应也很快。
后来我用一个串口调试工具同时抓主控发出的请求和传感器返回的应答,才看出问题。这台二氧化碳传感器出厂波特率不是9600,而是19200,而且校验位是偶校验。我在iRTU里配置的是全局串口参数,所有传感器共用一套9600/8N1设置,其他传感器正常,这台当然不正常。
这个坑的根本原因在于“所有设备共用一个串口和一套串口参数”。RS485总线上的Modbus RTU协议要求主机和从机波特率一致,理论上总线内所有设备波特率必须统一,不能混搭。那台传感器之所以单测正常,是因为我把调试器也配成了19200/偶校验,单独通信自然没问题。
处理方案有两个:
- 把总线上一台不兼容的传感器退回换成支持9600/8N1的型号。
- 如果传感器本身没法改,就拆成两条独立总线,挂到主控的另一个串口上,单独配置对应的波特率参数。
我当时选的是第二个方案,因为那台传感器已经采购,不能浪费。同时我把轮询间隔和超时也重新梳理了一遍:轮询间隔1500毫秒、超时500毫秒、失败重试3次,并且把读寄存器超时日志单独标记出来,方便后续观察哪台设备响应慢。
这里有个经验:联调阶段一定要抓协议报文看,不要只看应用层超时。超时只是一种表象,根因在报文层面才能看到。波特率不匹配时,主机收到的往往是一堆乱码或者直接无应答;CRC校验错误时,报文长度和内容看着正常,但校验位不对。这两种情况在日志里记录的关键字不同,通过原始报文区分,能少走很多弯路。
4.3 低功耗休眠把总线挂死:DE/RE方向和总线隔离
这个坑在项目交付后一个多月才暴露。系统里开启了低功耗模式,Air8000A在没有上报任务的夜间会进入休眠,白天再起来继续采集。原本以为低功耗只影响主控耗电,结果某一天早上醒来发现整条总线上的数据全部读不到,主控也像死机了一样。
我当时的排查链路挺曲折,从怀疑MQTT断线,到怀疑云端服务挂了,最后才定位到是休眠唤醒后的总线状态问题。仔细看现象:主控刚上电重启时数据正常,过一段时间一旦进入休眠,总线就异常;唤醒后如果紧接着执行轮询,大概率全部失败,要手动重启一次主控才恢复。
根因出在RS485收发器的收发方向控制引脚上。RS485是半双工总线,收发器芯片通常有一个DE/RE引脚,高电平时使能发送,低电平时使能接收。模组在休眠时,GPIO状态被重置,负责控制DE/RE的引脚可能会默认变为高电平,导致主控这边的收发器一直处于发送状态,把总线电平持续拉死。相当于一个人在电话里一直按住通话键不放,对方说什么你都听不见。
解决思路分两步:
- 把DE/RE控制脚设置为默认低电平,只有真正需要发送Modbus请求前才临时拉高,发送完成立刻拉低,不给它“按住通话键”的机会。
- 在进入休眠前,显式把收发器设置为接收方向,并且可以增加一个GPIO控制收发器供电,休眠时直接断电,唤醒后再上电复位收发器状态。
代码里处理方向控制时,哪怕用现成的RS485驱动库,也要自己检查一下初始化时DE/RE引脚的电平顺序。常见做法是发送请求时先拉高DE,延时一小段字符时间,然后发送数据,数据发送完成后延时再拉低DE。不要仅仅依赖驱动库的默认行为,不同版本驱动对方向引脚的初始电平处理并不一致。低功耗模式下尤其要验证“休眠前状态”和“唤醒后状态”,否则就等着现场跑一趟吧。
4.4 断线重连后数据积压补报:时间戳意识与缓冲队列
最后一个坑不在硬件,而在软件数据策略。设备现场网络不稳定,4G信号时好时坏,MQTT连接偶发断开是很正常的事。iRTU固件在断线时会缓存一部分数据,等网络恢复后补报。我一开始觉得这是好事,直到看到云端数据库里某一天突然涌入几千条历史数据,历史曲线几乎被压成一条无法阅读的粗线。
问题就出在补报策略太激进。设备断线半天,等到网络恢复时把缓存里积压的所有数据全部一次性发上来,后端按时间戳存储后,历史曲线在那一小段时间内聚集了超高密度数据点,直接把图表时间轴撑爆。更麻烦的是,这些数据里很多是同一时刻附近的旧值,对实时监测毫无意义,反而挤占了数据库和带宽。
我当时的调整方案包括三条:
- 缓存队列加一个上限,比如最多保留最近100条,超出上限的部分以“丢旧留新”为原则丢弃,而不是无限积压。
- 数据上报必须带设备本地时间戳,由后端按时间戳入库,而不是用Broker接收时刻。
- 断线重连后,不要全量补报,只补报最近10分钟内的关键数据,其余历史数据等系统空闲时分批补齐,或者直接不补报。
这套策略调整完之后,历史曲线恢复成了干净的趋势线,数据库压力也小了很多。核心认知是:物联网数据不是越多越好,采样频率和保留策略要匹配实际用途。环境监测看的是变化趋势和异常告警,不是要把设备缓存里每一笔原始报文都搬上云。
5. 从能跑到好用的工程化收尾:远程升级、日志与现场运维
5.1 版本管理与远程升级
系统联调通过后,真正的工程问题才开始:现场几十台设备分布在多个点位,不可能每次都带着笔记本电脑去现场改配置。所以版本管理和远程升级是必须提前考虑的。
主控固件、iRTU配置、页面脚本这三类东西要分开做版本管理。固件版本号标在编译产物里,每次发布都在变更记录里写清楚改了什么;iRTU配置文件因为是文本格式,我会在文件头加一个format_version字段,防止旧版固件加载不兼容的新配置;AirUI页面工程的发布目录同样打版本号标签,页面和接口联调时严格按版本对应。
远程升级通道要用起来但不滥用。我在项目里做了两级控制:主控固件通过OTA通道升级,配置文件和页面脚本通过MQTT下发校验。OTA升级前一定要先升级一台“试验机”,观察半天到一天,确认没有异常再把剩余设备分批升级。曾经有一次我觉得改动很小,直接全量升级,结果有一个很小的寄存器映射错误导致整片数据延迟上报,最后逐个回滚非常被动。
配置热更新也需要注意原子性:新配置先写入临时文件,校验通过后再替换正式配置。绝不要边写配置边重启,否则写了一半断电,设备起来加载的是半个配置文件,大概率直接进不了正常模式。这类问题在工程现场极难排查,但根源往往就是一次不规范的配置更新。
5.2 日志与现场快速排查
系统交付后,现场运维效率直接取决于日志设计。我在这套系统里做了三层日志:
- 主控本地日志,记录串口收发摘要、MQTT连接状态、低功耗休眠唤醒记录。
- 云端接入日志,记录设备上线、断线、离线时长、每次上报的数据量。
- 页面操作日志,记录谁的账号在什么时间点击了什么远程控制按钮。
三层日志打通之后,排查问题基本可以按“链路分层”的思路来。比如用户反馈某个点位数据不更新,我会先看MQTT日志里这个点位还有没有上报;如果没有,再看主控本地日志里Modbus轮询是否失败;如果轮询失败,再查总线和传感器。用这套顺序排障,大多数问题都能在一轮之内定位。比起在现场拿着万用表从头到尾量一遍,效率高得多。
现场端的日志存储我用的是本地文件加循环覆盖,单文件限制在一百条左右,避免一年半载后存储占满导致主控异常。同时把关键事件,比如传感器离线、MQTT断线重连、固件重启,单独上报云端汇总,方便值班人员看到汇总告警而不是只看一堆原始日志。
5.3 给打算复刻这套系统的人几句实在话
如果你也要做类似的多传感器环境监测项目,我的建议顺序是:先把传感器寄存器表和点位地址规划成一张总表,再动硬件;硬件安装完成后先调试总线,确认每个从机能读到符合物理常识的数值;然后配置iRTU,确认MQTT数据稳定到云;最后才做AirUI页面。每一步都有明确的验收标准,不要跳步。
所有配置和脚本都要纳入版本管理,哪怕只是改了一个波特率也记录下来。环境监测系统的难点永远不在单点技术上,而在于几十个点位的组合可靠性。我在实际运行中体会最深的是,这套组合的稳定性上限挺高,下限也低得吓人,差别就在这些前期规范和排障思路上。把这套链路跑顺之后,后续再扩展新的传感器类型,基本就是“加一台设备、加一个数据点、加一个页面卡片”这样的标准增量动作了。