HiveMQ MQTT 客户端 Java:有没有办法检查主题是否与订阅匹配?

HiveMQ MQTT Client Java: Is there a way to check if a topic matches a subscription?

是否有内置的方法来检查 hivemq-mqtt-client 是否预先与另一个主题匹配?

例如,发布了一条主题为:

的消息

publishedTopic= "sensors/sensor1";

一个订阅的客户:

subscribedTopic = "sensors/#";

有没有类似的

publishedTopic.matches(subscribedTopic)

?

具体情况:

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

是的,我可以

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

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

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

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

使用 HiveMQ 库,您可以定义回调以使用接收到的消息 per subscribeglobally matching a given filter.

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

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/sensor2sensors/sensor3(依此类推)会被另一个回调消耗

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

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

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

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

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);
    }
}