sanshengshui / netty-learning-example

:egg: Netty实践学习案例,见微知著!带着你的心,跟着教程。我相信你行欧。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mqtt connect报文

huchenxiao opened this issue · comments

if (!msg.variableHeader().isCleanSession()) { List<DupPublishMessageStore> dupPublishMessageStoreList = grozaDupPublishMessageStoreService.get(msg.payload().clientIdentifier()); List<DupPubRelMessageStore> dupPubRelMessageStoreList = grozaDupPubRelMessageStoreService.get(msg.payload().clientIdentifier()); dupPublishMessageStoreList.forEach(dupPublishMessageStore -> { MqttPublishMessage publishMessage = (MqttPublishMessage) MqttMessageFactory.newMessage( new MqttFixedHeader(MqttMessageType.PUBLISH, true, MqttQoS.valueOf(dupPublishMessageStore.getMqttQoS()), false, 0), new MqttPublishVariableHeader(dupPublishMessageStore.getTopic(), dupPublishMessageStore.getMessageId()), Unpooled.buffer().writeBytes(dupPublishMessageStore.getMessageBytes()) ); channel.writeAndFlush(publishMessage); }); dupPubRelMessageStoreList.forEach(dupPubRelMessageStore -> { MqttMessage pubRelMessage = MqttMessageFactory.newMessage( new MqttFixedHeader(MqttMessageType.PUBREL, true, MqttQoS.AT_MOST_ONCE, false, 0), MqttMessageIdVariableHeader.from(dupPubRelMessageStore.getMessageId()), null ); channel.writeAndFlush(pubRelMessage); }); }

清理会话标志位设置为保存会话,设备连接成功后,为什么是“重发同一clientId存储的未完成的QoS1和QoS2的DUP消息”?我查看mqtt3.3.1文档时,发现是这么说的“清理会话标志设置为0的客户端会收到所有在它连接断开期间发布的QoS 1和QoS 2级别的消息”。但是代码里的实现,写的是发布该设备未完成的消息出去,而不是接收在断开连接期间的消息。