diff --git a/CHANGELOG.md b/CHANGELOG.md index b628ee78a80b90641f3745647552b7b3c3cb98dc..7debdea9963f8ed00d0bc5fd0e8df5d22034a028 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ ### v1.2.2 - 2021-12-26 - :sparkles: mica-mqtt server 添加发布权限接口,无权限直接断开连接,避免高级别 qos 重试浪费资源。 - :sparkles: mica-mqtt-broker 优化节点信息存储 -- :sparkles: mqtt client 抽象 IMqttClientSession 接口。 +- :sparkles: mica-mqtt client 重复订阅优化。感谢 `@一片小雨滴` +- :sparkles: mica-mqtt client 抽象 IMqttClientSession 接口。 - :bug: 修复重构 AbstractMqttMessageDispatcher 保持跟 mica-mqtt-broker 逻辑一致 gitee #I4MA6A 感谢 `@胡萝博` - :arrow_up: mica-mqtt-example 升级 log4j2 到 2.17.0 diff --git a/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/auth/IMqttServerPublishPermission.java b/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/auth/IMqttServerPublishPermission.java index 369c934c14960cc95a740818769e137971c6475d..3799f544b16ecec4b7d62692843ade98d78dfa28 100644 --- a/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/auth/IMqttServerPublishPermission.java +++ b/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/auth/IMqttServerPublishPermission.java @@ -33,8 +33,9 @@ public interface IMqttServerPublishPermission { * @param clientId 客户端 id * @param topic topic * @param qoS MqttQoS + * @param isRetain 是否保留消息 * @return 否有发布权限 */ - boolean hasPermission(ChannelContext context, String clientId, String topic, MqttQoS qoS); + boolean hasPermission(ChannelContext context, String clientId, String topic, MqttQoS qoS, boolean isRetain); } diff --git a/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/support/DefaultMqttServerProcessor.java b/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/support/DefaultMqttServerProcessor.java index 0a7d36fbcebab42af69eed47152214f075fee3b6..dd92c93863502f071ddd3c5b2194887f1be807d6 100644 --- a/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/support/DefaultMqttServerProcessor.java +++ b/mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/support/DefaultMqttServerProcessor.java @@ -199,7 +199,7 @@ public class DefaultMqttServerProcessor implements MqttServerProcessor { MqttPublishVariableHeader variableHeader = message.variableHeader(); String topicName = variableHeader.topicName(); // 1. 判断是否有发布权限,没有权限则断开 mqtt 连接 mqtt 5.x qos1、qos2 可以响应 reasonCode - if (publishPermission != null && !publishPermission.hasPermission(context, clientId, topicName, mqttQoS)) { + if (publishPermission != null && !publishPermission.hasPermission(context, clientId, topicName, mqttQoS, fixedHeader.isRetain())) { Tio.remove(context, "Mqtt clientId:" + clientId + " publish topic: " + topicName + " no permission."); return; } @@ -428,7 +428,7 @@ public class DefaultMqttServerProcessor implements MqttServerProcessor { message.setPayload(payload); } message.setMessageType(MessageType.UP_STREAM); - message.setRetain(fixedHeader.isRetain()); + message.setRetain(isRetain); message.setDup(fixedHeader.isDup()); message.setTimestamp(System.currentTimeMillis()); Node clientNode = context.getClientNode();