MQTT主题和唯一性问题

时间:2013-04-16 20:17:24

标签: javascript regex node.js mqtt

我正在尝试使用MQTT,但我遇到了一些奇怪的问题。这可能是由于我的具体设置,但我认为无论如何我都会问。

我使用Node.JS和mqttjs作为经纪人。我也在使用用Java编写的IBM ia92测试客户端。

当我订阅/system/app之类的主题时,然后我向/system/appp发布消息,虽然主题名称不同,但我的客户收到此消息。请注意,如果我发布到/system/ap,我就不会收到消息。当然,发布到/system/app的工作正常。

这是否意味着MQTT“自动填写”类似的东西,或者这是客户/经纪人的错误?我知道+#通配符,但我不知道这个“功能/错误”。

我正在使用的经纪人可以在这里找到:

https://github.com/adamvr/MQTT.js/blob/master/examples/server/orig.js

它在第23行有一些奇怪的正则表达式,我试图找出它为什么需要它以及它做了什么。如果这不是一个功能,也许它可能是一个错误的原因?如果有人对此有任何想法,我将非常感激。

2 个答案:

答案 0 :(得分:1)

我对MQTT一无所知,但'bug'似乎是由于正则表达式没有被锚定这一事实引起的,所以如果订阅主题名称可以在针对它测试的主题名称中找到,匹配将成功(在第40行的test)。

如果通过从

更改第23行来添加字符串锚$的结尾
 , reg = new RegExp(topic.replace('+', '[^\/]+').replace('#', '.+$'));   

 , reg = new RegExp(topic.replace('+', '[^\/]+').replace('#', '.+') + '$');

它可能会阻止此行为。

我建议您在github repo中将其作为一个问题打开。

答案 1 :(得分:1)

同意我在mqtt.js跟踪器上提出问题。

我还建议在MQTT Google Group上询问有关此类协议规范的问题,并对rsmb和mosquitto代理进行相同的测试,这些代理或多或少都是参考实现。

FWIW,IA92真的非常(非常)陈旧和过时,并且还有可疑的许可证。如果你想要一个用于MQTT的Java客户端,请查看Eclipse Paho,这是当前的参考实现。