可以将MQTT代理配置为以不同的速率向订阅者发送数据吗?

可以将MQTT代理配置为以不同的速率向订阅者发送数据吗?,mqtt,publish-subscribe,iot,pubnub,Mqtt,Publish Subscribe,Iot,Pubnub,我是MQTT新手,并与mosquitto代理和开发库一起工作 我有一个用例,不同的订阅者可能想要订阅一个给定的主题,但需要不同速率的数据。因此,subscriber1可能只希望更改前一个值,而subscriber2可能希望更改为固定的节拍,例如每隔几分钟/秒 有没有办法在mosquitto代理中配置它?或者任何其他支持它的代理?不,没有办法配置Mosquito(或者我知道的任何成熟的代理)来实现这一点,它将以发布者发送新消息的速率将发送到某个主题的每条消息发送给所有订阅者 如果您真的必须拥有此功

我是MQTT新手,并与mosquitto代理和开发库一起工作

我有一个用例,不同的订阅者可能想要订阅一个给定的主题,但需要不同速率的数据。因此,subscriber1可能只希望更改前一个值,而subscriber2可能希望更改为固定的节拍,例如每隔几分钟/秒


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

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

如果您真的必须拥有此功能,那么您最好使用类似于mosca()的东西,并使用它提供的钩子来构建您自己的代理,但这将是一个令人讨厌的黑客攻击,如果没有新的代理来处理持续的cadence问题,它通常不会重新传递相同的消息

但是,如果新消息尚未到达,只需在客户端中保留一点状态,就可以轻松地丢弃重复的消息和刚刚处理最后一条消息的事件循环。

通道数据隔离
无论是否使用MQTT,在PubNub上都需要两个单独的通道:一个用于增量数据,另一个用于常规cadence数据,您可以采用三种策略

双通道 只需要数据更改的客户端将订阅
主题更改
。想要常规节奏数据的订阅者将同时订阅
主题节奏
主题更改

pubnub.subscribe("channels" : ["topic.change"]);
发布者将在
主题cadence
上以常规的cadence发布数据,如果currentValue=lastValue
,发布到
主题更改
。因此,这两种类型的订阅者都可以获得他们想要的数据

流过滤器 PubNub的另一个选项是,如果值与上一个值不同,则可以使用等于“1”的元数据值;如果值与上次发布的值相同,则可以使用等于“0”的元数据值。这些值将只发布到一个频道,
主题cadence

publish.publish(
{
频道:“主题节奏”,
电文:{“价格”:102.34},
元:{“更改”:“1”}
},
功能(状态、响应){
//在此处处理发布成功/失败
}
);
需要所有数据的客户端将像普通客户端一样订阅。但对于只希望更改的客户端,只接收元数据键设置为“1”的消息。客户端像往常一样初始化PubNub,添加侦听器(接收已发布的消息)并订阅频道
主题cadence
,但也设置了一个过滤器

pubnub.setFilterExpression("change=1");
pubnub.subscribe("channels" : ["topic-cadence"]);
现在,只有当数据发生变化时,这个客户端才会收到发送给它的消息,而不带过滤器的客户端将获得按常规cadence发布的所有数据

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

只需要更改值的客户端将订阅
主题.change

pubnub.subscribe("channels" : ["topic.change"]);
想要cadence中所有值的客户端将使用通配符subscribe订阅这两个频道

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

这仅仅意味着发布到任何以
主题开始的频道的数据。
和具有一些子频道名称的频道-
主题。更改
主题.foo
主题.bar
-将接收该数据。

在PubNub上,无论是否使用MQTT,您都需要两个单独的频道:主题增量和主题节奏。每个订阅将订阅不同的频道。发布者将在主题cadence上以常规cadence发布数据,
如果currentValue lastValue,则发布到主题delta
。这有意义吗?或者,使用PubNub,您可以使用流筛选器发布一个为true的元数据密钥。如果值与上一个值不同,并且订阅者只希望更改频道,则客户端将创建一个set a筛选器,以仅接收该元数据密钥设置为true的消息。是,如果我没有找到一个好的解决方案,我会这么做。然而,这看起来非常基本,我认为至少有一些代理实现会支持它。