• V
 

从不同消息流创建单个消息

问题

您有来自不同来源的消息需要合并为一个单一的消息。

例如,您有三个不同的传感器发布数值,您想将它们作为一个条目插入数据库。

解决方案

给每个流一个唯一的 msg.topic 值,并使用 Join 节点将它们组合成一个消息。

示例

[{"id":"8ccddb9a.a55f38","type":"inject","z":"ac14500e.2c57d","name":"temperature","topic":"temperature","payload":"10","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":1760,"wires":[["47b769c5.cb0e28"]]},{"id":"47b769c5.cb0e28","type":"join","z":"ac14500e.2c57d","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"3","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":310,"y":1800,"wires":[["f9afb265.b11b7"]]},{"id":"f9afb265.b11b7","type":"debug","z":"ac14500e.2c57d","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":470,"y":1800,"wires":[]},{"id":"2d269127.4f04ce","type":"inject","z":"ac14500e.2c57d","name":"humidity","topic":"humidity","payload":"","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":1800,"wires":[["47b769c5.cb0e28"]]},{"id":"d6fbe805.0e4628","type":"inject","z":"ac14500e.2c57d","name":"pressure","topic":"pressure","payload":"999","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":1840,"wires":[["47b769c5.cb0e28"]]}]

讨论

在示例流中,每个 Inject 节点代表一个不同的消息来源。它们分别设置一个独特的 msg.topic 值,以便在流中的后续步骤可以识别。

Join 节点已在手动模式下配置,以创建一个以 msg.topic 作为键名的键值对象。由于我们知道有三个独立的消息流要合并,该节点已被配置为在接收到该数量的部分时发送一条消息。

这意味着每次它从三个不同的主题中接收到至少一条消息时,它将发送一条消息 - 使用每个主题中最新的值。

{
    "temperature":10,
    "humidity":0,
    "pressure":999
}

该节点还有更多选项可以改变其行为,但在这个示例中没有使用。例如,可以设置超时以确保它在某个传感器停止发送值的情况下发送某个东西。如果这是一个问题,您可能考虑 这个食谱 来提供占位符值。