From 4ce8dce9630f7697eee142ba040b5ed46d23be5a Mon Sep 17 00:00:00 2001 From: George Date: Mon, 26 Jan 2026 22:45:35 +0800 Subject: [PATCH] =?UTF-8?q?20260126=EF=BC=9A=E8=A7=A3=E5=86=B33=E5=B8=A7?= =?UTF-8?q?=E5=86=85=E6=97=A0=E6=B3=A8=E5=86=8C=E5=8C=85=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E8=AE=BE=E5=A4=87=E7=AB=AF=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fastbee/base/session/Session.java | 21 +++++++++++++++++++ .../server/handler/TCPMessageAdapter.java | 5 +++++ .../iot/service/impl/DeviceServiceImpl.java | 4 ++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java b/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java index 68c45bf7..90e35c75 100644 --- a/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java +++ b/fastbee-server/base-server/src/main/java/com/fastbee/base/session/Session.java @@ -92,6 +92,11 @@ public class Session { private String ip; /*服务协议类型 MQTT,TCP UDP COAP*/ private ServerType serverType; + // 帧计数器(未注册前计数) + private AtomicInteger frameCountBeforeRegister = new AtomicInteger(0); + // 未注册时最大允许帧数 + private static final int MAX_FRAMES_BEFORE_REGISTER = 3; + public Session() { @@ -170,8 +175,24 @@ public class Session { return className; } + /** + * 增加未注册前的帧计数 + */ + public void incrementFrameCount() { + frameCountBeforeRegister.incrementAndGet(); + } + + /** + * 检查是否需要因未注册而关闭连接 + * @return true=应该关闭连接 + */ + public boolean shouldCloseForNoRegister() { + return !isRegistered() && frameCountBeforeRegister.get() > MAX_FRAMES_BEFORE_REGISTER; + } + /** * 判断设备是否已经注册上线 + * @return true:已注册;false:未注册 */ public boolean isRegistered() { return clientId != null; diff --git a/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/handler/TCPMessageAdapter.java b/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/handler/TCPMessageAdapter.java index abdb6a08..9d09acdb 100644 --- a/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/handler/TCPMessageAdapter.java +++ b/fastbee-server/iot-server-core/src/main/java/com/fastbee/server/handler/TCPMessageAdapter.java @@ -50,6 +50,11 @@ public class TCPMessageAdapter extends ChannelInboundHandlerAdapter { ByteBuf buf = (ByteBuf) msg; /*session存储*/ Session session = getSession(ctx); + session.incrementFrameCount(); + if (session.shouldCloseForNoRegister()) { + log.info("=>设备未注册,关闭连接session=[{}],remoteAddress=[{}]", session.getClientId(),ctx.channel().remoteAddress()); + ctx.close(); + } session.access(); /*将设备端消息传递给下一个处理器*/ ctx.fireChannelRead(Packet.of(session, buf)); diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java index f19b02a3..f4ebbee3 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -516,8 +516,8 @@ public class DeviceServiceImpl implements IDeviceService { List thingsModelValueRemarkItem = input.getThingsModelValueRemarkItem(); // 判断是否有纯计算物模型 有:需要获取设备级别物模型 无:直接使用产品级别物模型即可 boolean isCalculated = thingsModelValueRemarkItem.stream().anyMatch(ThingsModelSimpleItem::isCalculated); - Map calculatedModelMap = new HashMap<>(); - Map thingsModelValueMap = new HashMap<>(); + Map calculatedModelMap = Collections.emptyMap(); + Map thingsModelValueMap = Collections.emptyMap(); if (isCalculated) { calculatedModelMap = itslCache.getDeviceCalculatedModelMap(serialNumber); thingsModelValueMap = thingsModelValueRemarkItem.stream().filter(things -> !things.isCalculated())