一、该问题的重现步骤是什么?
新建的租户用户,测试MqttClientTest类,连不上mqtt。其中调用的DeviceSimulator类是原始代码,没有改动。录制的视频如下
报错信息如下:
14:52:32.619 [main] INFO org.springblade.mqtt.broker.mqtt.DeviceSimulator -- username: jNuuEy698XhU9Pss&7NaaWspg4vr, password: dddeb6b97d45867226c2da855f9571c3, clientId: jNuuEy698XhU9Pss
14:52:32.661 [Thread-3] INFO org.tio.utils.timer.TimingWheelThread -- Starting
14:52:32.669 [tio-group-2] INFO org.tio.client.ConnectionCompletionHandler -- connected to 127.0.0.1:1883
14:52:32.679 [tio-group-2] INFO net.dreamlu.iot.mqtt.core.client.MqttClientAioListener -- MqttClient reconnect send connect result:true
14:52:32.700 [tio-worker-3] INFO org.tio.core.task.CloseRunnable -- TioClientConfig [name=Mica-Mqtt-Client], server:127.0.0.1:1883, client:0:0:0:0:0:0:0:0:58548 准备关闭连接, isNeedRemove:false, MqttClient connect error error ReturnCode:connection refused bad user name or password (拒绝连接:用户名或密码错误)
14:52:32.701 [tio-worker-3] INFO org.tio.core.ChannelContext -- 关闭前server:127.0.0.1:1883, client:0:0:0:0:0:0:0:0:58548, 关闭后server:127.0.0.1:1883, client:$UNKNOWN:1
14:52:32.867 [main] INFO org.springblade.mqtt.broker.mqtt.DeviceSimulator -- username: 0eFNryiJ77TAgdj6&7NaaWspg4vr, password: e99380a8ef79bfe81629eab3bb5c5971, clientId: 0eFNryiJ77TAgdj6
14:52:32.867 [Thread-11] INFO org.tio.utils.timer.TimingWheelThread -- Starting
14:52:32.868 [tio-group-4] INFO org.tio.client.ConnectionCompletionHandler -- connected to 127.0.0.1:1883
14:52:32.868 [tio-group-4] INFO net.dreamlu.iot.mqtt.core.client.MqttClientAioListener -- MqttClient reconnect send connect result:true
14:52:32.879 [tio-worker-6] INFO org.tio.core.task.CloseRunnable -- TioClientConfig [name=Mica-Mqtt-Client], server:127.0.0.1:1883, client:0:0:0:0:0:0:0:0:58549 准备关闭连接, isNeedRemove:false, MqttClient connect error error ReturnCode:connection refused bad user name or password (拒绝连接:用户名或密码错误)
14:52:32.879 [tio-worker-6] INFO org.tio.core.ChannelContext -- 关闭前server:127.0.0.1:1883, client:0:0:0:0:0:0:0:0:58549, 关闭后server:127.0.0.1:1883, client:$UNKNOWN:2
14:52:35.168 [DefaultTimerTaskService] INFO org.tio.core.Tio -- can't send data, server:127.0.0.1:1883, client:$UNKNOWN:2, isClosed:true, isRemoved:false
14:52:35.168 [DefaultTimerTaskService] INFO org.tio.core.Tio -- can't send data, server:127.0.0.1:1883, client:$UNKNOWN:1, isClosed:true, isRemoved:false
14:52:35.168 [DefaultTimerTaskService] INFO org.tio.core.Tio -- can't send data, server:127.0.0.1:1883, client:$UNKNOWN:1, isClosed:true, isRemoved:false
14:52:35.168 [DefaultTimerTaskService] INFO org.tio.core.Tio -- can't send data, server:127.0.0.1:1883, client:$UNKNOWN:2, isClosed:true, isRemoved:false
二、你期待的结果是什么?实际看到的又是什么?
期待的结果:新建的租户用户建的设备,能正常连接mqtt,并认证通过。
实际看到的:新建的租户用户建的设备,连接不上msqtt。
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
正在使用的产品:BladeX物联网平台
版本:1.0.0
操作系统:Windows11
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
比如原本的链接clientId格式为:2db044787907fe72204d97665e52fc98|clienttype=2,timestamp=1724329110037|
现在用了非管理租户,比如租户id为150326,则clientId在第一个数线前加上 @150326
2db044787907fe72204d97665e52fc98@150326|clienttype=2,timestamp=1724329110037|
下版本会更新到页面自动生成的逻辑里
另外你用DeviceSimulator,需要把产品key、设备名、设备密钥也改成租户名下创建的来连接。
然后连接参数增加一个tenantId
配置完tenantid后可以正常调试“mqtt调试”。但是启动“RelayMqttApplication”后,并配置好和“消费组配置”中mqtt一样的“11889”端口,在“设备模拟”中,发送出去的消息,在RelayMqttApplication的控制台无法接收到。记录的视频如下。是不是还有其他什么地方需要配置?
录制_2024_08_23_10_06_46_974.mp4
现在这个mqtt的转发是管理租户和普通租户都不生效还是就普通租户不生效,还有就是你再到这里打断点调试看看是哪一步没有走转发的逻辑。如果找不到原因的话,我们来安排排查一下。
是管理租户,两处的代码都能打断点打到该位置。但是DefaultServerRelayManager.java#L63的代码断点的产品key没有出现我配置的“7NaaWspg4vr”
过了好几分钟了,还是没有出现我配置的产品key。
这里打断点等下一次调用,看看是哪个逻辑没查出对应的产品:https://center.javablade.com/blade/BladeX-Links/src/branch/master/blade-service/blade-broker/src/main/java/org/springblade/mqtt/broker/data/relay/handler/ServerRelayHandler.java#L94
授人以鱼不如授人以渔,这类问题教会你调用逻辑的地方,下次你就可以自己来解决了。
这个地方已经查出了产品key。但是DefaultServerRelayManager.java#L63这里没有出现产品key
你手动提交了三个重复的key?为什么同一个产品key会有三条数据,其中两条还是未删状态
之前在页面上点击删除,删除过这个产品key,但最终只创建了一个。
不管你后续是否手动新增了同样的产品key,你只要有产品key是被删除的,他这里都会被清掉。下面有代码逻辑
else { // 针对禁用或者删除数据进行清除 removeServerTopic(productKey); }
这情况是为了防止已删数据被重复使用。如果你们觉得不需要,可以把这个逻辑去掉,但我们觉得是有必要保留的。
如果要继续同一个产品,就需要从数据库手动恢复这条数据才行。这样做可以防止未来生产环境数据出问题。
不对,我上面说错了。是删除过“比亚迪汽车”对应的老的产品key,然后又重新生成一个新的产品key,新的产品key就是这个“7NaaWspg4vr”
而且是页面上删除,不是手动删除mysql数据库
不是一样吗?你页面删除了,就变成已删状态,你再创建了一样的key,当然会删掉。所有这块逻辑都告诉你了,自己排查和消化一下。你这个做法有点像去咖啡店点了份炒饭,虽然不合理但确实是会发生的。后面版本我们会限制这种操作,直接控制源头
在“产品管理”页面上删除某个“产品”不应该是正常操作吗(页面上有“删除”按钮,不给删除?)?
你删除后,又手动复制了一份同样的key创建。那以后删除的数据要恢复了,到底哪个才是真的。
我没有“复制了一份同样的key创建”,“以后删除的数据要恢复了”是什么意思?手动在mysql里恢复数据?页面上只要点击“删除”,页面就不显示了,正常用户是不再需要mysql里的数据。我大致看了下,发现点击“删除”产品的时候,iot_server_relay表没有删除对应的ProductKey,这个不知是不是你们的bug导致后面的问题。系统问题确实比较多,你们测试人员最好多测试下
你发了这么多帖子,绝大部分都是没看全文档或者没理解对导致的问题,这算不了bug。目前真正的bug,也就是删产品没有联动删除
你们还没有出物联网平台使用的操作手册,比如你们现有的文档里,没有自建一个租户用户,如何在物联网平台上操作的完整流程,目前是还都是我摸索进行的。
你们在预售期间最低价买入,为什么低价,也是因为文档没有提前发布。等后面内容多了会逐步涨价,现在已经涨了第一波了。后续还会持续涨价。但购买的用户不受影响。
你在只有技术文档没有操作文档的时候,在我们技术社区提问了,我们也100%回答率,并且都是当天就回,这个对系统熟悉的印象比你自己看未来的操作温度更深刻,因为我们手把手教你逻辑在哪里实现的。
所以你用没有操作不熟悉系统来指代系统bug多是有失偏颇的。这个贴子所有人都在看,我们需要解释你这个说法不对,不然就默认自己系统全是bug了,希望相互理解下。
本帖到此为止,后续新问题请发新帖。
扫一扫访问 Blade技术社区 移动端