在 MQTT 客户端中添加元数据以便在 InfluxDB 中进行查询

物联网 MQTT 传感器 系统架构 语义
2021-06-26 10:59:09

设想

我希望部署将传感器数据发布到中央 MQTT Broker 的传感器节点,然后将此信息发送到 InfluxDB。

要求

向传感器节点添加元数据,同时向代理发布信息。这个要求代替了传感器节点将部署在特定房间,这些信息需要保存在 InfluxDB 中tags,以便我进行后期处理。场景简化如下。 设想

元数据

例子:

 measurement: sensors
 type: temperature, humidity
 location: GATEA

此元数据可用作查询,如下所示:

  SELECT * FROM "sensors" WHERE "type"='humidity' AND "location"='GATEA' LIMIT 100

上面提到的查询为我提供了来自 GateA 的所有湿度传感器值。

问题

使用标准 MQTT 发布信息时如何添加此类元数据?

初步理解建议:

  1. topics根据Gates每个传感器节点向特定门主题发布信息的位置进行制作,例如GATEAGATEB等等。我不确定这是否有意义,因为 InfluxDB 可能会将该主题作为度量,并且查询可能如下所示:

       SELECT * FROM "GATEA" LIMIT 100
    

    然而,这并没有解决type可以作为元数据推送标签。

  2. 反之亦然是基于type传感器的主题创建,例如temphumidity对于每个传感器节点

在这种场景下,MQTT 部署是否有任何标准实践或架构设计建议?或者关于在这种情况下应该选择什么路径的任何建议?

参考

MQTT、Docker、Grafana、InfluxDB、ESP32 博客文章是一篇很棒的博客文章,我想作为此类设置的基础开始

1个回答

使用 MQTT 3.x 版,除了在它自己的消息有效负载中之外,没有任何地方可以包含任何元数据。这意味着传感器需要在发布消息之前构建它。

您可以在主题中编码一些信息,这对某些事情很有意义,例如让每个传感器发布自己的主题并订阅通配符。由于这个原因,主题是分层的,例如

country/city/building/floor/sensor1/temperature
country/city/building/floor/sensor1/humidity

MQTT v5(规范的新版本 2017/18)规范支持每条消息的用户属性以及有效负载,随着越来越多的东西支持它,这可能有助于包含额外的元数据。