• 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
}

该节点还有其他未在此配方中使用的选项来更改其行为。例如,可以设置超时,以确保在其中一个传感器停止发送值时它会发送_一些东西_。如果这是一个问题,您可以考虑此配方以提供占位符值。