如何区分源自用户的MQTT发布事件与仅用于广播的内部消息

时间:2016-07-10 20:15:01

标签: mqtt mosquitto

我正在使用mosquitto mqtt客户端。

例如,您拥有发布和订阅主题的用户。该主题实际上与REsT端点相关。

场景1(典型的发布/子使用)

  1. UserA订阅topic / device / 123 / meta
  2. UserB将一些数据发布到topic / device / 123 / meta
    • 根据定义,此发布将广播给订阅者
    • 我们有一个订阅了/ devices /#的脚本,它知道如何在收到发布数据时保存topic / device / 123 / meta的有效负载。此数据将保存到数据库中。
  3. 场景2

    1. 有人通过ReST接口更新data / device / 123 / meta(或直接数据库更新,关键是它不是MQTT发布)。
      • 数据库已更新
      • 将发布消息发送到MQTT代理,以便所有订阅者都将更新作为有效内容获取
    2. 情景2是我试图解决的问题。这会产生令人讨厌的反馈循环。当广播内部消息时,我处理来自用户的发布事件的脚本可以区分源自第三方用户的发布事件或仅用于广播一些数据的内部发布事件(不需要保存数据) )。

      我应该如何处理? MQTT消息非常简单,我找不到任何可以基于逻辑的消息。我试图以某种方式探索原点,但到目前为止没有运气。我意识到我可以编写插件,但这对mosquitto来说非常重要。

1 个答案:

答案 0 :(得分:2)

在纯MQTT协议级别无法区分消息源自订户的位置。发布/订阅协议的一部分是将发布者与订阅者分离。

最便携的方法是在实际的消息有效负载上添加一个标志,以指示该消息来自实际设备以外的其他地方。

或者假设消息正在发布,因此数据库中的触发器会触发检查传入消息是否实际更改了数据库存储值,如果传入消息与数据库的现有状态匹配则则不需要重新发布它。

Mosquitto的插件机制目前仅用于编写身份验证和授权解决方案,但JavaScript mosca或Java HiveMQ代理支持可能能够执行您想要的插件。