用于发布3个数据点的MQTT主题层次结构

时间:2017-02-06 13:24:22

标签: hierarchy mqtt publish-subscribe data-integrity

这是关于MQTT主题的复合问题。

我有几个MQTT客户端(传感器节点)将Sensed Data发布为" _data",Signal Strength as" _rssi"和数据收集时间" _toc"他们的三个主题。

  

/节点/ NODE_ID /数据/
  /节点/ NODE_ID / RSSI /
  /节点/ NODE_ID / TOC /

其中" node_id"是客户端(节点)的标识符(整数/数字)(节点唯一)。 各自的有效负载 _data (浮点数据), _rssi (浮点数)和 _toc (Unix日期时间) 。显然,所有三个数据点都是相互关联的。

此设计有助于根据授权订阅的主题维护不同订阅者的访问控制。

然而,每个节点/客户端使用3个不同的主题有一个很大的问题 - 如果MQTT客户端和服务器之间的连接在发布后立即被破坏(丢失),那么数据"有效载荷并在发布" rssi"之前和"时间戳"有效载荷,然后是三个数据点之间的不匹配,来自"数据"主题将反映新的价值,而其他两个主题将保持较旧的价值〜失去诚信。

我可以使用像

这样的单行话题
  

/ node / node_id / data / _data / rssi / _rssi / toc / _toc

  

/节点/ NODE_ID /(_数据,_rssi,_toc)

将_data,_rssi和_toc替换为相应的值,并解析它并分离值。最后一种主题样式,特别是减少了客户端发布的次数 - 节省了数据成本和完整性错误。它的长度也很短。但是,当然,这很混乱,非常特别,错误很容易实现。

有人建议采用中间方式来始终保持数据完整性并最大限度地减少客户端应该发布的数量,并保持干净的消息结构。我绝对希望拥有数据完整性,但也希望在订阅者之间隔离访问权限。

1 个答案:

答案 0 :(得分:3)

不要将数据编码为主题,它最终会非常混乱,并且意味着您必须使用非常讨厌的通配符订阅来使事情有效。

如果确实需要将数据紧密地联系在一起,那么唯一的选择就是在有效负载中发布包含所有3个值的单个消息。这意味着您无法单独访问各个组件,但这是唯一的方法。