【问题标题】:Can MQTT broker be configured to send data to subscribers at a different rate?可以将 MQTT 代理配置为以不同的速率向订阅者发送数据吗?
【发布时间】:2017-03-22 19:59:57
【问题描述】:

我是 MQTT 新手,正在使用 mosquitto 代理和开发库。

我有一个用例,不同的订阅者可能想要订阅给定的主题,但希望以不同的速率获取数据。因此,subscriber1 可能只希望它与之前的值相比有所变化,而subscriber2 可能希望它以固定的节奏进行,比如每隔几分钟/秒。

有没有办法在 mosquitto 代理中进行配置?或者任何其他支持它的经纪人?

【问题讨论】:

  • 无论有没有 MQTT,在 PubNub 上,您都需要两个独立的频道:topic-delta 和 topic-cadence。每个订阅将订阅不同的频道。发布者将在 topic-cadence 和if currentValue <> lastValue, publish to topic-delta 上以常规节奏发布数据。这有意义吗?
  • 可选地,使用 PubNub,您可以使用 Stream Filters 发布一个元数据键,如果该值从以前的值发生变化并且订阅者只想要更改的频道,客户端将创建一个设置过滤器以仅接收将该元数据键设置为 true 的消息。
  • 是的,如果我没有找到好的解决方案,我想我会这样做。但是,这似乎很基本,以至于我认为至少有一些代理实现会支持它。
  • 在下面发布了官方答案。

标签: mqtt publish-subscribe iot pubnub


【解决方案1】:

渠道数据隔离

无论有没有 MQTT,在 PubNub 上,您都需要两个独立的通道:一个用于增量数据,一个用于常规节奏数据,您可以采用三种策略。

两个通道

只想要数据更改的客户端将订阅topic-change。想要有规律的数据节奏的订阅者可以同时订阅topic-cadencetopic-change

发布者将在topic-cadenceif currentValue !=lastValue 上定期发布数据,发布到topic-change。所以这两种类型的订阅者都能得到他们想要的数据。

流过滤器

PubNub 的另一个选项,您可以使用Stream Filters to publish 一个元数据值,如果该值与之前的值相比已更改,则该值等于“1”,如果该值与上次发布的值相同,则可以使用“0”。这些值只会发布到一个频道topic-cadence

pubnub.publish(
    {
        channel: "topic-cadence", 
        message: {"price" : 102.34},
        meta: {"change": "1"}
    },
    function(status, response) {
        // handle publish success/fail here
    }
);

想要所有数据的客户会像往常一样订阅。但是对于只想要更改的客户端,the client would set a filter 只接收元数据键设置为“1”的消息。客户端像往常一样初始化 PubNub,添加监听器(接收发布的消息)并订阅频道topic-cadence,但还设置了一个过滤器。

pubnub.setFilterExpression("change=1");
pubnub.subscribe("channels" : ["topic-cadence"]);

现在这个客户端只有在数据发生变化的情况下才会收到消息,而没有过滤器的客户端将获得以常规节奏发布的所有数据。

通配符频道

使用Wildcard Subscribe 的解决方案与第一个非常相似。只要数据相同,发布者就会在名为topic.cadence 的通道上发布值。如果值发生变化,它将被发布到名为topic.delta 的频道。频道名称中的点 (.) 很重要,因为客户端可以使用通配符 - 星号 (*) 进行订阅。

只希望更改值的客户端将订阅topic.change

pubnub.subscribe("channels" : ["topic.change"]);

想要以节奏方式获得所有价值的客户将使用通配符订阅来订阅这两个频道。

pubnub.subscribe("channels" : ["topic.*"]);

这只是意味着发布到以topic. 开头并具有一些子频道 名称的任何频道的数据 - topic.changetopic.footopic.bar - 将接收该数据。

【讨论】:

    【解决方案2】:

    不,没有办法配置 mosquitto(或我知道的任何成熟的代理)来做到这一点,它将以发布者发送新消息的速率将发送到主题的每条消息传递给所有订阅者。

    如果你真的必须拥有这个功能,那么你能做的最好的可能就是使用 mosca (https://github.com/mcollina/mosca) 之类的东西,并使用它提供的钩子来构建你自己的代理,但这将是一个令人讨厌的 hack,它仍然不会'如果没有新消息出现,则通常不会重新传递相同的消息

    但是,如果新消息尚未到达,则仅在客户端中保留一个小状态以丢弃重复的消息和刚刚处理最后一条消息的事件循环会容易得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2019-08-03
      • 2021-04-03
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多