2. 农业物联网数据采集与传输协议选型
在农业远程监控系统中,传感器采集到的空气温湿度、土壤含水率、光照强度、CO₂浓度等数据,最终要跨越田间到云端这段"最后一公里"。这段链路的带宽往往并不宽裕:大棚里可能是运营商4G信号微弱,大田里可能靠LoRa网关回传,山区果园甚至只有NB-IoT可用。因此,协议选型不是"哪个流行用哪个",而是要在报文开销、连接保持、功耗和可靠性之间做权衡。本节围绕MQTT、HTTP、CoAP三种主流协议展开对比,并给出传感器数据上报格式与边缘网关到云端的数据流转路径设计。
三种协议在低带宽场景下的本质差异
HTTP是请求—响应模型,客户端每次上报都要重新建立TCP连接(或复用长连接),并携带完整的请求头。一个典型的HTTP POST请求头往往有200~500字节,而农业传感器一次上报的有效载荷可能只有几十字节,头部开销占比极高。HTTP适合低频、非实时的数据补传,比如每天一次的历史数据同步,但不适合分钟级的高频上报。
MQTT基于发布/订阅模型,运行在TCP之上,通过心跳机制维持长连接。它的固定报头最小仅2字节,主题名和载荷分离,非常适合"多设备、小报文、持续在线"的场景。农业监控中大量传感器节点需要周期性上报,MQTT的轻量报头和QoS等级(0/1/2)能灵活匹配不同数据的可靠性要求。缺点是长连接需要网关持续保活,对极端低功耗的电池节点不够友好。
CoAP运行在UDP之上,采用类HTTP的请求—响应语义,但报头压缩到最小4字节,并支持观察模式(Observe)和块传输(Block-wise)。它天然适合受限设备与丢包率较高的无线链路,在NB-IoT、LoRa这类非连接型网络上表现更好。CoAP的短板是UDP本身不保证可靠,需要应用层做重传和去重,且云端服务端支持不如MQTT成熟。
传感器数据上报格式设计
协议只解决"怎么传",格式解决"传什么、怎么解析"。JSON可读性好、调试方便,适合开发阶段和低频上报;二进制格式紧凑,适合带宽紧张或节点数量大的场景。以土壤温湿度传感器为例,一条JSON上报报文可以设计为:
{
"devId": "TH-0012",
"ts": 1717488000,
"seq": 1024,
"data": {
"soilTemp": 23.6,
"soilMoist": 41.2,
"airTemp": 26.1,
"airHum": 68.5
},
"batt": 3.72,
"rssi": -87
}
字段设计要点:devId用于设备寻址;ts为Unix时间戳(秒),避免时区歧义;seq为递增序号,用于去重和丢包检测;data内按物理量命名,单位在设备注册时约定(温度℃、湿度%RH);batt和rssi是运维关键字段,用于判断节点供电和信号质量。整条JSON约180字节,若每分钟上报一次,单节点日流量约260KB,在4G下可接受,但在LoRa上就偏重。
二进制格式则把上述字段按固定偏移打包。例如采用12字节定长帧:设备ID 2字节、时间戳4字节(相对网关基准时间的偏移)、土壤温度2字节(0.1℃精度)、土壤湿度2字节、电量1字节、序号1字节。同样一条数据压缩到12字节,报文体积下降约93%。代价是可读性差,需要维护字段字典和字节序约定(建议统一小端序)。实践中常见做法是:节点到网关用二进制节省无线带宽,网关到云端转成JSON便于平台解析和看板展示。
边缘网关到云端的数据流转路径
完整链路可以概括为四段:传感器节点经LoRa/RS-485将数据送到边缘网关;网关完成协议适配、单位归一、异常值过滤(如土壤含水率超过100%视为无效)和本地缓存;网关通过MQTT over TLS将数据发布到云端Broker,主题按farm/{farmId}/{devType}/{devId}分级;云端订阅后解析入库,Web看板从时序库查询展示。
断网续传是农业场景必须考虑的设计。网关本地用SQLite或环形缓冲区保存最近24~72小时数据,网络恢复后按seq顺序补发,云端依据devId+seq做幂等去重。QoS选择上,环境监测数据用QoS 1保证至少送达,重复由去重逻辑消化;电量告警等关键事件可用QoS 2。若节点采用NB-IoT且上报间隔超过15分钟,可改用CoAP Observe模式,由云端注册观察关系,节点仅在数据变化超阈值时推送,进一步降低功耗。
最后提醒一点:无论选哪种协议,都要在报文里保留时间戳、序号和设备标识这三类"元数据",它们是后续去重、补传和故障定位的基础。协议决定传输效率,格式决定数据可用性,两者配合才能在低带宽条件下把农业数据稳定、经济地送到看板上。