0

如果特定主题提前与另一个主题匹配,是否有内置方法可以使用 hivemq-mqtt-client 检查?

例如,使用主题发布的消息:

publishedTopic= "sensors/sensor1";

订阅的客户:

subscribedTopic = "sensors/#";

有没有类似的东西

publishedTopic.matches(subscribedTopic)

?

具体情况:

我在家里经营一个经纪人,几个设备发布不同主题的值。有些像传感器/humi[45],有些像传感器/数据[JSON Payload]。对于我的个人用途,我使用 Java HiveQM MQTT 客户端运行应用程序。一位客户使用 raspberryPi 上的 mosquitto 订阅了相关主题。另一个客户端正在将选定的数据发布到可公开访问的代理。接收新消息不仅会以我处理它的方式处理所有数据,还会触发将接收到的消息发布到公共代理。

我可以

if(topic.equals("sensor/xxx")) {
//publish to public broker here
}

但是做一些事情,比如从我的内部代理订阅“sensor/#”,并“转发”类似“sensor/+”的东西,并让一个库来确定是否使用“sensors/#”接收到某个消息”,将重新发布给公共经纪人,仅限于“传感器/+”是我正在寻找的。

当我订阅“sensors/#”时,HiveMQ mqtt-client 库中的逻辑是否可以被库用户访问?

4

3 回答 3

2
import com.hivemq.client.mqtt.datatypes.MqttTopic;
import com.hivemq.client.mqtt.datatypes.MqttTopicFilter;
...

class Example {
    static boolean matches( String topicFilter, String topicReceived ) {
        MqttTopicFilter filter = MqttTopicFilter.of(topicFilter);
        MqttTopic topic = MqttTopic.of(topicReceived);
        return filter.matches(topic);
    }
}
于 2021-01-13T17:40:24.887 回答
1

实现您想要的一种方法是对您要转发的主题使用特定的回调。

使用 HiveMQ 库,您可以定义一个回调来使用每个订阅接收到的消息或全局匹配给定过滤器。

在您的情况下,您可以使用每个订阅消费者来处理应该以特殊方式处理的主题:

client.subscribeWith()
        .topicFilter("sensors/sensor1")
        .qos(<qos>)
        .callback(<callback for topics to be forwarded>)
        .send();

后跟一个匹配所有尚未使用的主题的全局过滤器:

client.publishes(MqttGlobalPublishFilter.REMAINING, <callback for other topics>))

(当然还有订阅sensors/#

这种方式只会sensors/sensor1在您的第一个回调中使用,并且sensors/sensor2(sensors/sensor3等等) 会被另一个回调使用

于 2020-12-18T09:57:19.720 回答
0

MQTT 的部分意义在于将信息生产者与消费者完全解耦。这意味着向主题发布消息的客户端对可能订阅消息发布到的主题的任何客户端一无所知。

可能有从 0 到无限订阅者的任何地方,他们可能只订阅完全匹配的主题或将匹配的通配符。

在您在评论中描述的情况下,您在 2 个代理之间有一座桥梁,您需要明确列出您想要桥接的主题,通常您不能根据给定客户端连接到其中一个客户端的内容动态更改该列表经纪人已订阅。

您也许可以为 HiveMQ 编写一个插件来执行此操作,但它必须在客户端订阅的同一代理上运行,如果我理解正确的话,这是您无法控制的代理。

于 2020-12-18T11:35:26.790 回答