20260126:解决3帧内无注册包直接关闭设备端连接

This commit is contained in:
George 2026-01-26 22:45:35 +08:00
parent 692dcaab1f
commit 4ce8dce963
3 changed files with 28 additions and 2 deletions

View File

@ -92,6 +92,11 @@ public class Session {
private String ip; private String ip;
/*服务协议类型 MQTT,TCP UDP COAP*/ /*服务协议类型 MQTT,TCP UDP COAP*/
private ServerType serverType; private ServerType serverType;
// 帧计数器(未注册前计数)
private AtomicInteger frameCountBeforeRegister = new AtomicInteger(0);
// 未注册时最大允许帧数
private static final int MAX_FRAMES_BEFORE_REGISTER = 3;
public Session() { public Session() {
@ -170,8 +175,24 @@ public class Session {
return className; 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() { public boolean isRegistered() {
return clientId != null; return clientId != null;

View File

@ -50,6 +50,11 @@ public class TCPMessageAdapter extends ChannelInboundHandlerAdapter {
ByteBuf buf = (ByteBuf) msg; ByteBuf buf = (ByteBuf) msg;
/*session存储*/ /*session存储*/
Session session = getSession(ctx); Session session = getSession(ctx);
session.incrementFrameCount();
if (session.shouldCloseForNoRegister()) {
log.info("=>设备未注册,关闭连接session=[{}],remoteAddress=[{}]", session.getClientId(),ctx.channel().remoteAddress());
ctx.close();
}
session.access(); session.access();
/*将设备端消息传递给下一个处理器*/ /*将设备端消息传递给下一个处理器*/
ctx.fireChannelRead(Packet.of(session, buf)); ctx.fireChannelRead(Packet.of(session, buf));

View File

@ -516,8 +516,8 @@ public class DeviceServiceImpl implements IDeviceService {
List<ThingsModelSimpleItem> thingsModelValueRemarkItem = input.getThingsModelValueRemarkItem(); List<ThingsModelSimpleItem> thingsModelValueRemarkItem = input.getThingsModelValueRemarkItem();
// 判断是否有纯计算物模型 有:需要获取设备级别物模型 无:直接使用产品级别物模型即可 // 判断是否有纯计算物模型 有:需要获取设备级别物模型 无:直接使用产品级别物模型即可
boolean isCalculated = thingsModelValueRemarkItem.stream().anyMatch(ThingsModelSimpleItem::isCalculated); boolean isCalculated = thingsModelValueRemarkItem.stream().anyMatch(ThingsModelSimpleItem::isCalculated);
Map<String, ThingsModelValueItem> calculatedModelMap = new HashMap<>(); Map<String, ThingsModelValueItem> calculatedModelMap = Collections.emptyMap();
Map<String, String> thingsModelValueMap = new HashMap<>(); Map<String, String> thingsModelValueMap = Collections.emptyMap();
if (isCalculated) { if (isCalculated) {
calculatedModelMap = itslCache.getDeviceCalculatedModelMap(serialNumber); calculatedModelMap = itslCache.getDeviceCalculatedModelMap(serialNumber);
thingsModelValueMap = thingsModelValueRemarkItem.stream().filter(things -> !things.isCalculated()) thingsModelValueMap = thingsModelValueRemarkItem.stream().filter(things -> !things.isCalculated())