尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

mqtt-QoS0/QoS1/QoS2服务质量:农业设备数据可靠性场景选型

mqtt-QoS0/QoS1/QoS2服务质量:农业设备数据可靠性场景选型 QoS0/QoS1/QoS2服务质量农业设备数据可靠性场景选型作者黒漂技术佬 | 系列MQTT物联网协议与智慧农业全栈实战前言有一个经典问题大棚传感器上报的温度数据丢了1条要不要紧答案取决于你的场景。如果每5秒报一次温度丢1条真的无所谓——下一秒就有新数据上来。但如果是卷帘机电机启动这条控制指令丢了电机不转那可能真的出事故。这就是QoSQuality of Service服务质量要解决的问题在不同场景下用不同级别保证消息传递的可靠性。一、QoS概念MQTT定义了三级QoS从随便发到确保送达不重复逐级递增保障力度——同时开销也逐级递增。注意QoS只保证Publisher到Broker、Broker到Subscriber这两段的传递质量是端到端的分段保证不是Publisher直连Subscriber的端到端保证。二、QoS 0最多一次At most once江湖人称丢了就丢了不心疼。完整流程Publisher → [PUBLISH (QoS0)] → Broker → [PUBLISH (QoS0)] → Subscriber就这么简单——消息发出去就完事不等确认不重试。Publisher发出PUBLISH报文后立刻认为消息已送达Broker收到后也不向Publisher确认Subscriber也不会向Broker确认收到优点开销最小速度最快不占内存。缺点消息可能丢失。网络抖动导致TCP断包、Broker繁忙丢包——都可能导致消息无声无息地消失。智慧农业适用场景每5秒一次的温湿度、光照数据上报——丢一两帧完全无感CO2传感器高频采集数据——下一秒就有新的实操建议agriculture/greenhouse1/sensors/#这类Topic用QoS 0发布省电省流量。三、QoS 1至少一次At least once江湖人称必须送到重复了再说。完整流程Publisher Broker │ │ ├── PUBLISH (QoS1, PacketID42) ─→ │ ① 发送消息 │ │ ② 保存PacketID42 │ ←────── PUBACK (PacketID42) ──┤ ③ 确认收到 │ ③ 删除PacketID │ ④ 投递给订阅者 │ │ │ 如果超时未收到PUBACK │ ├── PUBLISH (QoS1, PacketID42) ─→ │ DUP1 重发 │ ←── PUBACK (PacketID42) ────────┤核心机制每条QoS 1消息附带一个PacketID包标识符。Broker收到后必须回复PUBACK确认。Publisher在收到PUBACK之前会一直重发。为什么至少一次可能造成重复如果Publisher发出消息后网络断了Broker收到了消息也回了PUBACK但PUBACK在网络中丢失。Publisher超时重发同一条消息同一个PacketIDBroker收到第二条时在3.1.1协议中会再投递一次——这就是重复的来源。MQTT 5.0通过消息属性可以标记去重但3.1.1时代靠业务层幂等处理。优点消息不会丢至少一次送达。缺点可能重复需要客户端维护PacketID状态比QoS 0开销大。智慧农业适用场景告警消息大棚温度超过35℃告警如果丢了就不知道作物在蒸桑拿设备状态变更水肥机从运行变为故障状态同步不能丢每日汇总数据上报每天一次的关键指标汇总丢不起实操建议agriculture//alarms/#和agriculture//device_status用QoS 1。四、QoS 2恰好一次Exactly once江湖人称精确投递不丢不重。代价是四次握手慢但稳。完整流程四次握手Publisher Broker │ │ ├── PUBLISH (QoS2, PID42) ──────→ │ ① 发送消息 │ ←── PUBREC (PID42) ─────────┤ ② 收到请继续 ├── PUBREL (QoS2, PID42) ──────→ │ ③ 确认释放 │ ←── PUBCOMP (PID42) ────────┤ ④ 完成投递这四次握手保证了恰好一次的语义——Publisher确认Broker真正收到了且不会把这消息投递两次Broker确认Publisher知道消息已被处理两方状态完全同步。优点消息不丢不重是最高级别的可靠性保证。缺点四次网络交互性能最低、延迟最大、消耗电量最多。在4G网络下一次QoS 2消息的完整交互可能需要500ms以上。智慧农业适用场景控制指令远程启动水肥机、开启通风风机、关闭遮阳网——这些操作重复执行可能造成设备损坏或安全事故参数配置下发修改传感器上报频率为30秒——如果重复应用可能没问题天然幂等但用QoS 2更规范固件升级的启动指令进入OTA模式的指令不能丢也不能重复实操建议agriculture//actuators//control用QoS 2。五、三种QoS完整对比维度QoS 0QoS 1QoS 2送达保证最多一次至少一次恰好一次网络交互次数124性能最高中等最低功耗最低中等最高消息丢失风险有无无消息重复风险无有无客户端内存开销无需存PacketID需存更多状态适用数据高频传感器告警、状态控制指令六、QoS降级规则一个用QoS 2发布的消息到了订阅者手里就一定是QoS 2吗不一定。MQTT的规则是实际投递的QoS min(发布者QoS, 订阅者QoS)举例发布者 → Broker: QoS 2 Broker → 订阅者A订阅QoS 2: QoS 2 ✓ Broker → 订阅者B订阅QoS 1: QoS 1 ← 降级了 Broker → 订阅者C订阅QoS 0: QoS 0 ← 降级更多这就是QoS降级。设计系统时订阅者的QoS设置要和消息的重要程度匹配。监控大屏只管展示订阅QoS 1就够了告警系统订阅QoS 1控制指令订阅者必须用QoS 2七、智慧农业QoS选型总结用一个表格把大棚项目的QoS选型说清楚数据类型推荐QoSTopic示例理由温湿度/光照/CO2QoS 0sensors/temperature高频可丢少量土壤数据EC/pHQoS 0sensors/soil_ec变化慢丢一帧无感告警信息QoS 1alarms/high_temp不能丢设备状态变更QoS 1device_status状态同步不能漏控制指令QoS 2actuators//control不能丢也不能重复设备配置参数QoS 1~2devices/config配置信息重要八、QoS对功耗和带宽的影响在电池供电的田间传感器中QoS选择直接影响续航QoS 0一发一收无线模块唤醒时间最短最省电QoS 1两发一收多了PUBACK功耗约是QoS 0的1.5~2倍QoS 2四发四收功耗约是QoS 0的3~4倍如果你的传感器靠太阳能电池供电大量用QoS 2可能让设备在连续阴雨天饿死。原则是大部分数据用QoS 0关键数据用QoS 1控制指令才用QoS 2。结尾QoS不是越高越好——在资源受限的物联网设备上“合理降级是工程智慧。大棚里99%的数据用QoS 0那1%的关键指令用QoS 2——这就是MQTT协议的精妙之处它让不同重要程度的数据走不同的保障通道不搞一刀切”。记住三个口诀数据丢了无所谓QoS 0丢了不行但多一两条没关系QoS 1丢不起也重不起QoS 2。
返回列表