如何通过MQTT发布多个号码?

时间:2019-07-19 10:51:02

标签: python mqtt payload

我正在使用MQTT通过智能手机远程控制供水系统,以控制连接到树莓派的阀门。 到目前为止,我已经让树莓派订阅了多个主题(“浇水/前草坪”,“浇水/后草坪”),并将有效载荷解释为浇水持续时间。 现在,我想添加一种安排浇水的方法,该方法需要额外发送时间,以确保应该浇水。因此,需要针对特定​​主题发送startTimeduration。 像wateringInfo = [1563532789, 300] # in the form [startTime, duration]

是否有推荐的传输信息的方式?

到目前为止,我唯一的想法是将两个数字相结合:

startTime*1000+duration # assuming duration is maxed at 999

发送他们 并使用以下方式检索:

retrievedStartTime = int(msg.payload) / 1000
retrievedDuration = int(msg.payload) % 1000

这似乎是一种容易出错的处理方式。有没有其他方法,甚至可以直接传输数组?

2 个答案:

答案 0 :(得分:0)

如何打包/序列化数据完全取决于您,并且取决于多种因素,包括(但不仅限于):

  1. 哪种类型的系统正在生成数据(它是功能非常有限的传感器)?
  2. 什么消耗了数据(见上文)?
  3. 数据是否需要人类可读?
  4. 您是否关心消息的大小(按字节付费)?

一些示例选项包括:

  1. JSON / XML这两种都是标记语言,可让您包括大量结构和上下文以及值。但是它们也是人类可读的。
  2. 这是人类可读的CSV(逗号分隔的变量),但是您需要知道列表中每个变量的位置映射到什么位置。
  3. Protobuf再次允许您包含结构,但是以二进制级别包含,因此难以理解。
  4. 原始固定宽度字段,您只是说每个值都将适合固定数目的字节可以表示的范围。例如-128到+ 128(或0到255)可以用一个字节表示,您只需预定义每个字段的字节数及其顺序即可。这基本上是CSV,但是没有分隔符,并且使用最小的空间来传递信息。

还有很多其他选项,但是它们主要是上述3个选项的变体。您选择哪种方式至少取决于列出的因素以及实施时希望获得的最低水平。

答案 1 :(得分:0)

我建议使用“浇水/ frontLawn /信息”主题,并将消息作为字符串发送,这样在另一侧就很容易解析。

发布者:

client.publish(topic="watering/frontLawn/info", 
               payload=str(start)+","+str(end), qos=1, retain=False)

订户:

client.subscribe(topic="watering/frontLawn/info", qos=1)

解析部分:

info = message.payload.split(",")

现在您的列表如下:

 info = ["start", "end"]

要获取信息:

start = int(info[0])
end = int(info[1])