4. 农业传感器数据采集与MQTT发布

在农业物联网系统中,传感器是数据的源头,MQTT是数据的运输通道。本节要解决的核心问题是:如何把土壤温湿度、光照、CO₂等异构传感器的原始读数,整理成结构统一、主题规范、频率可控的MQTT消息,稳定地发布到Broker上。这一环节做得好不好,直接决定了后续存储、告警和自动控制的可靠性。

一、传感器接入与数据采集

农业现场常见的传感器按接口大致分为三类:模拟量输出(如4–20mA或0–3V的土壤湿度探头)、数字总线(如RS-485上的Modbus-RTU温湿度变送器、I²C接口的CO₂模块)以及自带协议的数字传感器(如SHT30、BH1750)。接入方式不同,采集程序的处理逻辑也不同。

以RS-485土壤温湿度变送器为例,典型参数为:设备地址0x01,功能码0x03,寄存器0x0000存放土壤温度(单位0.1℃,有符号),寄存器0x0001存放土壤湿度(单位0.1%RH)。采集端通过Modbus读取两个寄存器后,需要做量纲还原:温度 = 原始值 ÷ 10,湿度 = 原始值 ÷ 10。光照传感器BH1750通过I²C读取16位数据,换算公式为 光照(lux) = 原始值 ÷ 1.2。CO₂模块常见输出为0–5000ppm对应0–3V模拟电压,需按线性关系换算。

采集程序应遵循“先采集、后处理、再发布”的顺序,并对每个读数附加时间戳和采集质量标记。例如读取失败时不应直接丢弃,而应发布带 valid:false 标记的消息,让上层知道该点位当前不可信,而不是误以为数值正常。

二、数据格式设计

消息体推荐使用JSON,兼顾可读性与解析便利。设计要点有三:字段命名统一、单位明确、保留元数据。以下是一个可直接参考的发布载荷示例:

{
  "deviceId": "agri-node-01",
  "ts": 1735689600000,
  "seq": 1024,
  "sensors": {
    "soilTemp":  {"value": 21.4, "unit": "C",   "valid": true},
    "soilHum":   {"value": 63.2, "unit": "%RH", "valid": true},
    "light":     {"value": 18500, "unit": "lux", "valid": true},
    "co2":       {"value": 612,  "unit": "ppm", "valid": true}
  },
  "battery": 87,
  "rssi": -72
}

其中 ts 使用毫秒级Unix时间戳,seq 为递增序号用于丢包检测,battery 与 rssi 是运维排障的重要辅助信息。字段值统一用数值类型而非字符串,避免下游做二次转换。单位放在消息内而非仅靠文档约定,可显著降低多厂商设备混用时的歧义。

三、主题规划

主题设计应遵循“层级清晰、便于订阅通配、避免歧义”的原则。推荐结构为:agri/{区域}/{设备类型}/{设备ID}/{数据类别}。例如:

  • 数据上报:agri/greenhouse-a/sensor/agri-node-01/telemetry
  • 设备状态:agri/greenhouse-a/sensor/agri-node-01/status
  • 控制指令:agri/greenhouse-a/actuator/valve-03/cmd

这样设计后,平台侧可用 agri/greenhouse-a/sensor/+/telemetry 订阅某区域全部传感器数据,用 agri/+/+/+/status 统一监控在线状态。注意主题中不要使用空格、中文和特殊符号,设备ID应保持全局唯一。QoS建议遥测数据用QoS 0或1,控制指令用QoS 1并配合应答主题。

传感器采集 → 数据整形 → 主题发布 链路 现场传感器 土壤温湿度 RS-485 / Modbus 光照 BH1750 I²C 数字量 CO₂ 模块 0–3V 模拟量 电池 / RSSI 运维辅助量 采集与数据整形 读取原始寄存器 / 电压 量纲还原(÷10、÷1.2) 有效性判定 valid 封装 JSON + 时间戳 seq 递增,便于丢包检测 MQTT 发布与主题 agri/greenhouse-a/sensor/ agri-node-01/telemetry QoS 0/1 · retain=false 发布频率:30s 周期 变化触发:超阈值即发 Broker 分发至平台 / 告警 / 控制 关键约束:单位随值发布 · 失败读数带 valid:false · 主题层级固定 · 频率与功耗、带宽平衡 示例参数仅用于教学说明,实际取值以设备手册与现场标定为准

四、发布频率控制

农业传感器多为电池供电,通信模块(尤其是4G/NB-IoT)的功耗远高于采集本身,因此频率控制是工程重点。常见策略是“周期上报 + 变化触发 + 心跳保活”三者结合。

周期上报给出基础节奏,例如土壤温湿度变化缓慢,30秒至5分钟一次即可;光照和CO₂变化相对快,可设为10–30秒。变化触发用于捕捉突变:当土壤湿度在两次周期之间下降超过3%RH,或CO₂超过设定阈值(如1000ppm)时立即补发一条,保证告警及时。心跳保活则用于让平台判断设备在线,可每5分钟发一条精简状态消息。

频率设定还要考虑带宽与Broker压力。假设单条JSON约220字节,30秒一次,单设备日发送约2880条、约0.6MB;若一个温室有50个节点,日流量约30MB,对多数平台完全可接受。但若把频率提高到1秒一次,流量将放大30倍,电池寿命也会明显缩短。因此建议在设备端做本地缓存与批量合并:采集可以高频,发布按策略聚合,避免“采一次发一次”的粗放做法。

实践建议:为每条消息保留 seq 与 ts,平台侧即可计算丢包率与端到端延迟;将发布频率、QoS、主题前缀做成设备配置项,便于现场调整而无需重新烧录固件。
常见误区:把不同量纲、不同采样周期的数据塞进同一条消息却不加单位;或所有设备共用同一个主题导致无法按设备订阅。前者会让下游解析出错,后者会让通配订阅失去意义,二者都应在设计阶段规避。

综合来看,传感器接入解决“采得到”,数据格式解决“看得懂”,主题规划解决“找得到”,频率控制解决“发得起”。四者配合,才能让农业设备的数据在MQTT通道上稳定、经济、可追溯地流动。