You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MQTT传输多数值实现树莓派灌溉系统定时控制?

推荐几种更可靠的MQTT多参数传输方案

你的灌溉调度场景里,把时间戳和时长拼接成单个数字的方法确实容易踩坑——比如时长超过999就会搞混时间戳的末三位,而且调试时完全看不出payload里到底存了什么信息,非常不友好。这里给你推荐几个更靠谱的方案,按推荐优先级排序:

1. 使用JSON格式传输(最推荐)

JSON是结构化数据传输的标准选择,可读性强、解析方便,而且扩展性极佳——以后要加其他参数(比如阀门ID、重复灌溉次数)都能轻松扩展。

发送端(智能手机侧)示例:

把startTime和duration打包成JSON字符串作为MQTT payload发送:

# 假设用Python的paho-mqtt库(手机端如果是安卓/iOS,也有对应的JSON序列化方法)
import json
import paho.mqtt.client as mqtt

client = mqtt.Client()
client.connect("your_raspberry_pi_ip", 1883, 60)

watering_info = {"startTime": 1563532789, "duration": 300}
payload = json.dumps(watering_info)
client.publish("watering/frontLawn", payload)

接收端(树莓派侧)解析示例:

订阅主题后,直接用JSON解析payload:

import json
import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
    try:
        watering_info = json.loads(msg.payload.decode("utf-8"))
        start_time = watering_info["startTime"]
        duration = watering_info["duration"]
        print(f"收到灌溉调度:开始时间{start_time},时长{duration}秒")
        # 这里写你的阀门控制逻辑
    except json.JSONDecodeError:
        print("无效的JSON格式,忽略消息")

client = mqtt.Client()
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.subscribe("watering/frontLawn")
client.loop_forever()

优点:结构清晰,调试时直接看payload就能明白内容,容错性强,扩展性好。

2. 使用分隔符分隔的字符串

如果觉得JSON有点“重”,可以用简单的分隔符(比如逗号、竖线)把两个参数拼成字符串,只要确保分隔符不会出现在参数本身里(时间戳和时长都是数字,用逗号完全没问题)。

发送端示例:

watering_info = f"{1563532789},{300}"
client.publish("watering/frontLawn", watering_info)

接收端解析示例:

def on_message(client, userdata, msg):
    payload_str = msg.payload.decode("utf-8")
    parts = payload_str.split(",")
    if len(parts) == 2:
        try:
            start_time = int(parts[0])
            duration = int(parts[1])
            print(f"收到灌溉调度:开始时间{start_time},时长{duration}秒")
        except ValueError:
            print("参数不是有效数字,忽略消息")
    else:
        print("消息格式错误,忽略")

优点:实现简单,payload体积小;缺点:扩展性差,以后加参数需要改解析逻辑,可读性不如JSON。

3. 使用MQTT 5.0的消息属性(进阶方案)

如果你的MQTT客户端(手机和树莓派)都支持MQTT 5.0,可以把startTime和duration放在消息的**用户属性(User Properties)**里,payload可以留空或者只传一个标识(比如阀门名称)。

发送端示例:

client.publish(
    "watering/frontLawn",
    payload="scheduled",
    properties={
        "User-Property": [
            ("startTime", "1563532789"),
            ("duration", "300")
        ]
    }
)

接收端解析示例:

def on_message(client, userdata, msg):
    props = msg.properties
    if props and "User-Property" in props:
        prop_dict = dict(props["User-Property"])
        start_time = int(prop_dict.get("startTime", 0))
        duration = int(prop_dict.get("duration", 0))
        print(f"收到灌溉调度:开始时间{start_time},时长{duration}秒")

优点:payload和参数分离,适合不需要在payload里存业务数据的场景;缺点:依赖MQTT 5.0支持,兼容性不如前两种方案。


总结一下:优先选JSON方案,它能解决你当前的问题,还能为未来的功能扩展留足空间,调试和维护也最方便。原来的数字拼接方法尽量避免,因为容错性太低,很容易因为时长超出预设位数导致解析错误。

内容的提问来源于stack exchange,提问作者Tasmotanizer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:45:21