MQTT主题匹配评估
MQTT topic match evaluation
我正在使用 Mqtt (Paho) 实现一个 Android 应用程序。我有一些组件,我必须在其中比较包含通配符的订阅主题与客户已发布到的实际主题。
我就是不明白,我的 "rudimentary" 正则表达式技能也无济于事...
在Paho/Java MQTT 中是否有实用程序class 以查看
"SENSOR/TEMPERATURE/+/DEGREE/#/ID"(已订阅主题)
适用于
"SENOR/TEMPERATURE/GARDEN/DEGREE/CELSIUS/ABOVEZERO/ID"(实际题目)?
有人知道最好的方法是什么吗?
谢谢!
编辑:您好 - 我认为这应该是正确的
public static boolean compareTopic(final String actualTopic, final String subscribedTopic){
return actualTopic.matches(subscribedTopic.replaceAll("\+", "[^/]+").replaceAll("#", ".+"));
}
您的解决方案应该有效,因此在您的示例中,正则表达式为
"SENSOR/TEMPERATURE/[^/]+/DEGREE/.+/ID"
像 http://www.regexplanet.com/advanced/java/index.html 这样的网站对于此类案例来说是非常好的资源。
在 util_topic.c 的 mosquitto_topic_matches_sub()
函数中有一个如何将 MQTT 主题与订阅相匹配的示例:
https://github.com/eclipse/mosquitto/blob/master/lib/util_topic.c
这看起来很简单,但是有一些陷阱需要处理,所以您的简单正则表达式并不能完全完成工作。
我已经 运行 进行了一些测试,我认为这可行:
String topicExp = topicPattern//
.replaceAll("\$", "\\\$")//
.replaceAll("\+", "[^/]+")//
.replaceAll("/\#$", "(\$|/.+)");
Pattern pattern = Pattern.compile(topicExp);
boolean match = pattern.matcher(topic).matches();
return match;
我正在使用 Mqtt (Paho) 实现一个 Android 应用程序。我有一些组件,我必须在其中比较包含通配符的订阅主题与客户已发布到的实际主题。
我就是不明白,我的 "rudimentary" 正则表达式技能也无济于事...
在Paho/Java MQTT 中是否有实用程序class 以查看
"SENSOR/TEMPERATURE/+/DEGREE/#/ID"(已订阅主题)
适用于
"SENOR/TEMPERATURE/GARDEN/DEGREE/CELSIUS/ABOVEZERO/ID"(实际题目)?
有人知道最好的方法是什么吗?
谢谢!
编辑:您好 - 我认为这应该是正确的
public static boolean compareTopic(final String actualTopic, final String subscribedTopic){
return actualTopic.matches(subscribedTopic.replaceAll("\+", "[^/]+").replaceAll("#", ".+"));
}
您的解决方案应该有效,因此在您的示例中,正则表达式为
"SENSOR/TEMPERATURE/[^/]+/DEGREE/.+/ID"
像 http://www.regexplanet.com/advanced/java/index.html 这样的网站对于此类案例来说是非常好的资源。
在 util_topic.c 的 mosquitto_topic_matches_sub()
函数中有一个如何将 MQTT 主题与订阅相匹配的示例:
https://github.com/eclipse/mosquitto/blob/master/lib/util_topic.c
这看起来很简单,但是有一些陷阱需要处理,所以您的简单正则表达式并不能完全完成工作。
我已经 运行 进行了一些测试,我认为这可行:
String topicExp = topicPattern//
.replaceAll("\$", "\\\$")//
.replaceAll("\+", "[^/]+")//
.replaceAll("/\#$", "(\$|/.+)");
Pattern pattern = Pattern.compile(topicExp);
boolean match = pattern.matcher(topic).matches();
return match;