我正在尝试使用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行有一些奇怪的正则表达式,我试图找出它为什么需要它以及它做了什么。如果这不是一个功能,也许它可能是一个错误的原因?如果有人对此有任何想法,我将非常感激。
答案 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,这是当前的参考实现。