我是MQTT的新手,并与mosquitto代理和开发库合作。
我有一个用例,其中不同的订阅者可能想要订阅给定主题,但希望以不同的速率获取数据。因此,订户1可能只希望它从之前的值改变,而订户2可能希望它以固定的节奏,比如每隔几分钟/秒。
有没有办法在mosquitto代理中配置?或任何其他支持它的经纪人?
答案 0 :(得分:2)
无论有没有MQTT,在PubNub上您都需要两个独立的通道:一个用于增量数据,一个用于常规节奏数据,您可以使用三种策略。
只想要更改数据的客户端将订阅topic-change
。想要定期节奏数据的订阅者将订阅topic-cadence
和topic-change
。
发布商会在topic-cadence
和if 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.change
,topic.foo
,{{1将收到该数据。
答案 1 :(得分:1)
不,没有办法配置mosquitto(或我所知道的任何完全成熟的经纪人)来做到这一点,它会以发布者发送新消息的速度将发送给主题的每条消息传递给所有订阅者。 / p>
如果你真的必须拥有这个功能,那么你可以做的最好的事情可能是采取类似mosca(https://github.com/mcollina/mosca)的东西并使用它提供的钩子来建立你自己的经纪人,但这将是一个讨厌的黑客和它如果没有新的一个因为持续的节奏问题而仍然没有得到相同的信息,那么仍然不会重新发送相同的信息
但是在客户端中保留一个小状态来抛出重复的消息和刚刚处理完最后消息的事件循环(如果新的消息尚未到达)会更容易。