Merge branch 'test' of https://git.will-way.cn/zgty/zt-qms into test

This commit is contained in:
2025-10-10 20:42:56 +08:00
8 changed files with 197 additions and 156 deletions

View File

@@ -4,12 +4,16 @@ import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant; import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext;
import com.github.xingfudeshi.knife4j.annotations.ApiOperationSupport; import com.github.xingfudeshi.knife4j.annotations.ApiOperationSupport;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionForRedisContext;
import com.zt.plat.module.qms.iot.tcpserver.device.RedisSessionComponent;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.zt.plat.module.qms.iot.tcpserver.core.ChannelStatInfo; import com.zt.plat.module.qms.iot.tcpserver.core.ChannelStatInfo;
import tech.zzjc.tio.core.ChannelContext; import tech.zzjc.tio.core.ChannelContext;
@@ -41,8 +45,8 @@ import java.util.stream.Collectors;
@Tag(name = "iot连接管理-连接统计") @Tag(name = "iot连接管理-连接统计")
public class IotConnectManagerStatsController { public class IotConnectManagerStatsController {
@Resource @Autowired private TioServerBootstrap tioServerBootstrap;
private TioServerBootstrap tioServerBootstrap; @Autowired public RedisSessionComponent redisSessionComponent;
@GetMapping("/all-connect") @GetMapping("/all-connect")
@ApiOperationSupport(order = 1) @ApiOperationSupport(order = 1)
@@ -89,11 +93,18 @@ public class IotConnectManagerStatsController {
break; break;
case ChannelContextConstant.CONNECT_DEVICE://设备 case ChannelContextConstant.CONNECT_DEVICE://设备
IotDeviceSessionContext deviceSessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY); IotDeviceSessionContext deviceSessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
String deviceId = deviceSessionContext.getDeviceId();
String deviceCode = deviceSessionContext.getDeviceCode(); String deviceCode = deviceSessionContext.getDeviceCode();
String deviceType = deviceSessionContext.getDeviceType(); IotDeviceSessionForRedisContext deviceContext = redisSessionComponent.getByDeviceCode(deviceCode);
String deviceName = deviceSessionContext.getDeviceName(); String deviceId = "";
String controlRealName = deviceSessionContext.getControlRealName() == null ? "" : deviceSessionContext.getControlRealName(); String deviceType = "";
String deviceName = "";
String controlRealName = "";
if(deviceContext != null){
deviceId = deviceContext.getDeviceId();
deviceType = deviceContext.getDeviceType();
deviceName = deviceContext.getDeviceName();
controlRealName = deviceContext.getControlRealName();
}
info.setDeviceId(deviceId); info.setDeviceId(deviceId);
info.setDeviceCode(deviceCode); info.setDeviceCode(deviceCode);
info.setDeviceType(deviceType); info.setDeviceType(deviceType);
@@ -193,6 +204,12 @@ public class IotConnectManagerStatsController {
@Operation(summary = "关闭连接") @Operation(summary = "关闭连接")
public CommonResult<?> close(@RequestParam(name="id",required=true) String id) { public CommonResult<?> close(@RequestParam(name="id",required=true) String id) {
ChannelContext channelContext = Tio.getByChannelContextId(tioServerBootstrap.getServerTioConfig(), id); ChannelContext channelContext = Tio.getByChannelContextId(tioServerBootstrap.getServerTioConfig(), id);
IotDeviceSessionContext sessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
if(sessionContext != null){
String deviceId = sessionContext.getDeviceId();
if(!ObjectUtils.isEmpty(deviceId))
redisSessionComponent.deleteByDeviceId(deviceId);
}
Tio.IpBlacklist.clear();//清空全局黑名单 Tio.IpBlacklist.clear();//清空全局黑名单
Tio.close(channelContext, "控制端主动关闭连接"); Tio.close(channelContext, "控制端主动关闭连接");
return CommonResult.success("ok"); return CommonResult.success("ok");
@@ -211,10 +228,14 @@ public class IotConnectManagerStatsController {
Tio.IpBlacklist.clear();//清空全局黑名单 Tio.IpBlacklist.clear();//清空全局黑名单
if(channelContext != null) { if(channelContext != null) {
IotDeviceSessionContext deviceSessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY); IotDeviceSessionContext deviceSessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
String deviceId = deviceSessionContext.getDeviceId();
if(!ObjectUtils.isEmpty(deviceId)){
redisSessionComponent.clearControlByDeviceId(deviceId, channelContext);
}
//设置控制点的channelContext //设置控制点的channelContext
deviceSessionContext.setControlChannelContext(null); // deviceSessionContext.setControlChannelContext(null);
deviceSessionContext.setControlRealName(""); // deviceSessionContext.setControlRealName("");
channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, ""); // channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, "");
} }
return CommonResult.success("ok"); return CommonResult.success("ok");
} }

View File

@@ -3,8 +3,11 @@ package com.zt.plat.module.qms.iot.tcpserver;
import com.zt.plat.module.qms.iot.tcpserver.core.*; import com.zt.plat.module.qms.iot.tcpserver.core.*;
import com.zt.plat.module.qms.iot.tcpserver.core.IotClientSessionContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotClientSessionContext;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext;
import com.zt.plat.module.qms.iot.tcpserver.device.RedisSessionComponent;
import com.zt.plat.module.qms.iot.tcpserver.proxy.ProxyProtocolDecoder; import com.zt.plat.module.qms.iot.tcpserver.proxy.ProxyProtocolDecoder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import tech.zzjc.tio.common.starter.annotation.TioServerAioListener; import tech.zzjc.tio.common.starter.annotation.TioServerAioListener;
import tech.zzjc.tio.core.ChannelContext; import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio; import tech.zzjc.tio.core.Tio;
@@ -32,6 +35,7 @@ public class IotServerAioListener implements ServerAioListener {
// @Autowired // @Autowired
// private IMeasurePointService measurePointService; // private IMeasurePointService measurePointService;
@Autowired public RedisSessionComponent redisSessionComponent;
@Override @Override
public void onAfterConnected(ChannelContext channelContext, boolean isConnected, boolean isReconnect) throws Exception { public void onAfterConnected(ChannelContext channelContext, boolean isConnected, boolean isReconnect) throws Exception {
@@ -68,6 +72,20 @@ public class IotServerAioListener implements ServerAioListener {
//连接断开,更新数据库连接状态 //连接断开,更新数据库连接状态
IotClientSessionContext iotClientSessionContext = (IotClientSessionContext) channelContext.get(IotClientSessionContext.DEFAULT_CLIENT_SESSION_CONTEXT_KEY); IotClientSessionContext iotClientSessionContext = (IotClientSessionContext) channelContext.get(IotClientSessionContext.DEFAULT_CLIENT_SESSION_CONTEXT_KEY);
IotDeviceSessionContext sessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
String deviceId = sessionContext.getDeviceId();
log.info("onBeforeClose deviceId:" + deviceId);
//设备断开清除redis记录
if(!ObjectUtils.isEmpty(deviceId)){
redisSessionComponent.deleteByDeviceId(deviceId);
}
//客户端断开,清除控制
Object deviceCode = channelContext.get(ChannelContextConstant.CONTROL_DEVICE_ID);
if(!ObjectUtils.isEmpty(deviceCode)){
redisSessionComponent.clearControlByDeviceCode(deviceCode.toString(), channelContext);
}
//解绑业务ID //解绑业务ID
Tio.unbindBsId(channelContext); Tio.unbindBsId(channelContext);

View File

@@ -2,6 +2,7 @@ package com.zt.plat.module.qms.iot.tcpserver;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.util.ObjectUtils;
import tech.zzjc.tio.core.ChannelContext; import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio; import tech.zzjc.tio.core.Tio;
@@ -62,10 +63,14 @@ public class IotUtils {
} }
public static String transDeviceCodeToId(String deviceCode){ public static String transDeviceCodeToId(String deviceCode){
if(ObjectUtils.isEmpty(deviceCode))
return "";
return new BigInteger(deviceCode, Character.MAX_RADIX).toString(); return new BigInteger(deviceCode, Character.MAX_RADIX).toString();
} }
public static String transDeviceIdToCode(String deviceId){ public static String transDeviceIdToCode(String deviceId){
if(ObjectUtils.isEmpty(deviceId))
return "";
return new BigInteger(deviceId).toString(Character.MAX_RADIX); return new BigInteger(deviceId).toString(Character.MAX_RADIX);
} }
} }

View File

@@ -3,6 +3,7 @@ package com.zt.plat.module.qms.iot.tcpserver;
import com.zt.plat.module.qms.core.constant.CommonConstant; import com.zt.plat.module.qms.core.constant.CommonConstant;
import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant; import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext;
import com.zt.plat.module.qms.iot.tcpserver.device.RedisSessionComponent;
import com.zt.plat.module.qms.iot.tcpserver.handler.IotClientHandler; import com.zt.plat.module.qms.iot.tcpserver.handler.IotClientHandler;
import com.zt.plat.module.qms.iot.tcpserver.handler.IotDeviceHandler; import com.zt.plat.module.qms.iot.tcpserver.handler.IotDeviceHandler;
import com.zt.plat.module.qms.iot.tcpserver.handler.IotHander; import com.zt.plat.module.qms.iot.tcpserver.handler.IotHander;
@@ -45,6 +46,7 @@ public class IotWebSocketMsgHandler implements IWsMsgHandler {
@Autowired @Autowired
private IotHeartbeatHandler iotHeartbeatHandler; private IotHeartbeatHandler iotHeartbeatHandler;
@Autowired public RedisSessionComponent redisSessionComponent;
@Override @Override
public HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception { public HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception {
@@ -112,17 +114,10 @@ public class IotWebSocketMsgHandler implements IWsMsgHandler {
switch (connectType) { switch (connectType) {
case ChannelContextConstant.CONNECT_CAA_CLIENT: case ChannelContextConstant.CONNECT_CAA_CLIENT:
//判断是否控制设备,如果控制设备则取消设备控制 //判断是否控制设备,如果控制设备则取消设备控制
String deviceIdCode = channelContext.get(ChannelContextConstant.CONTROL_DEVICE_ID) == null ? "" : channelContext.get(ChannelContextConstant.CONTROL_DEVICE_ID).toString(); String deviceCode = channelContext.get(ChannelContextConstant.CONTROL_DEVICE_ID) == null ? "" : channelContext.get(ChannelContextConstant.CONTROL_DEVICE_ID).toString();
if (StringUtils.isNotBlank(deviceIdCode)) { if (StringUtils.isNotBlank(deviceCode)) {
ChannelContext deviceChannelContext = Tio.getByBsId(channelContext.getTioConfig(), deviceIdCode); redisSessionComponent.clearControlByDeviceCode(deviceCode, channelContext);
if (deviceChannelContext != null) {
IotDeviceSessionContext deviceSessionContext = (IotDeviceSessionContext) deviceChannelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
deviceSessionContext.setControlChannelContext(null);
deviceSessionContext.setControlRealName("");
}
} }
break; break;
default: default:

View File

@@ -51,7 +51,6 @@ public class IotCaaClientControlDeviceHander implements IotDataHander {
String realClient = realClientIp + ":" + realClientPort; String realClient = realClientIp + ":" + realClientPort;
log.info("{}, APP客户端控制设备 {}", realClient, controlDevice); log.info("{}, APP客户端控制设备 {}", realClient, controlDevice);
String deviceId = controlDevice.getDeviceId(); String deviceId = controlDevice.getDeviceId();
log.info("设备ID:{}", deviceId);
if (StringUtils.isBlank(deviceId)) { if (StringUtils.isBlank(deviceId)) {
JSONObject json = null; JSONObject json = null;
json = new JSONObject(); json = new JSONObject();
@@ -68,54 +67,10 @@ public class IotCaaClientControlDeviceHander implements IotDataHander {
} }
String deviceCode = IotUtils.transDeviceIdToCode(deviceId); String deviceCode = IotUtils.transDeviceIdToCode(deviceId);
ChannelContext deviceChannelContext = Tio.getByBsId(channelContext.getTioConfig(), deviceCode); ChannelContext deviceChannelContext = Tio.getByBsId(channelContext.getTioConfig(), deviceCode);
IotDeviceSessionForRedisContext deviceContext = redisSessionComponent.getByDeviceId(deviceId);
IotPacket iotPacket = new IotPacket(); IotPacket iotPacket = new IotPacket();
JSONObject json = null; JSONObject json = null;
if (deviceChannelContext != null) { if (deviceChannelContext == null) {
// IotDeviceSessionContext deviceSessionContext = (IotDeviceSessionContext) deviceChannelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
ChannelContext oldDeviceChannelContext = deviceContext.getControlChannelContext();
if (controlDevice.getIsControl()) {
//设置控制点的channelContext
deviceContext.setControlChannelContext(channelContext);
deviceContext.setControlRealName(controlDevice.getControlRealName());
controlDevice.setMsg("设备被“" + controlDevice.getControlRealName() + "”远程控制!");
channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, deviceCode);
} else {
//设置控制点的channelContext
deviceContext.setControlChannelContext(null);
deviceContext.setControlRealName("");
controlDevice.setMsg("" + controlDevice.getControlRealName() + "”取消设备远程控制!");
channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, "");
}
redisSessionComponent.update(deviceContext);
//获取客户端连接信息
String deviceRealClientIp = deviceChannelContext.get("realClientIp") == null ? deviceChannelContext.getClientNode().getIp() : deviceChannelContext.get("realClientIp").toString();
String deviceRealClientPort = deviceChannelContext.get("realClientPort") == null ? deviceChannelContext.getClientNode().getPort() + "" : deviceChannelContext.get("realClientPort").toString();
String deviceRealClient = deviceRealClientIp + ":" + deviceRealClientPort;
log.info("{} 设备:{},旧控制:{},新的控制:{}", realClient, deviceRealClient, oldDeviceChannelContext, realClient);
json = new JSONObject();
json.put("msgId", msgId);
json.put("cmd", Command.REPLY_CONTROL_DEVICE.getName());
json.put("clientType", ClientType.CAA_CLIENT.getName());
controlDevice.setSuccess(true);
json.put("data", controlDevice);
iotPacket.setBody((json.toJSONString() + "\r\n").getBytes(Charset.forName(IotPacket.CHARSET)));
//todo 发送通知
TioConfig tioConfig = deviceChannelContext.getTioConfig();
TioClusterConfig tioClusterConfig = tioConfig.getTioClusterConfig();
tioClusterConfig.publish(new TioClusterVo(iotPacket));
Tio.sendToGroup(channelContext.getTioConfig(), CAA_ALL_CLIENT, iotPacket, new ChannelContextFilter() {
@Override
public boolean filter(ChannelContext cc) {
if (channelContext.getId().equals(cc.getId())) {
return false;
}
return true;
}});
} else {
json = new JSONObject(); json = new JSONObject();
json.put("msgId", msgId); json.put("msgId", msgId);
json.put("cmd", Command.REPLY_CONTROL_DEVICE.getName()); json.put("cmd", Command.REPLY_CONTROL_DEVICE.getName());
@@ -125,7 +80,52 @@ public class IotCaaClientControlDeviceHander implements IotDataHander {
json.put("data", controlDevice); json.put("data", controlDevice);
iotPacket.setBody((json.toJSONString() + "\r\n").getBytes(Charset.forName(IotPacket.CHARSET))); iotPacket.setBody((json.toJSONString() + "\r\n").getBytes(Charset.forName(IotPacket.CHARSET)));
Tio.send(channelContext, iotPacket); Tio.send(channelContext, iotPacket);
return null;
} }
if (controlDevice.getIsControl()) {
//控制
// deviceContext.setControlChannelContext(channelContext);
IotDeviceSessionForRedisContext deviceContext = redisSessionComponent.getByDeviceId(deviceId);
deviceContext.setControlRealName(controlDevice.getControlRealName());
channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, deviceCode);
controlDevice.setMsg("设备被“" + controlDevice.getControlRealName() + "”远程控制!");
redisSessionComponent.update(deviceContext);
} else {
//释放
redisSessionComponent.clearControlByDeviceId(deviceId, channelContext);
controlDevice.setMsg("" + controlDevice.getControlRealName() + "”取消设备远程控制!");
}
//获取客户端连接信息
// String deviceRealClientIp = deviceChannelContext.get("realClientIp") == null ? deviceChannelContext.getClientNode().getIp() : deviceChannelContext.get("realClientIp").toString();
// String deviceRealClientPort = deviceChannelContext.get("realClientPort") == null ? deviceChannelContext.getClientNode().getPort() + "" : deviceChannelContext.get("realClientPort").toString();
// String deviceRealClient = deviceRealClientIp + ":" + deviceRealClientPort;
// log.info("{} 设备:{},旧控制:{},新的控制:{}", realClient, deviceRealClient, oldDeviceChannelContext, realClient);
json = new JSONObject();
json.put("msgId", msgId);
json.put("cmd", Command.REPLY_CONTROL_DEVICE.getName());
json.put("clientType", ClientType.CAA_CLIENT.getName());
controlDevice.setSuccess(true);
json.put("data", controlDevice);
iotPacket.setBody((json.toJSONString() + "\r\n").getBytes(Charset.forName(IotPacket.CHARSET)));
//发送通知到其他服务实例
TioConfig tioConfig = deviceChannelContext.getTioConfig();
TioClusterConfig tioClusterConfig = tioConfig.getTioClusterConfig();
TioClusterVo iotClusterVo = new TioClusterVo(iotPacket);
iotClusterVo.setGroup(CAA_ALL_CLIENT);
tioClusterConfig.publish(iotClusterVo);
//发送消息到本服务实例连接的客户端
Tio.sendToGroup(channelContext.getTioConfig(), CAA_ALL_CLIENT, iotPacket, new ChannelContextFilter() {
@Override
public boolean filter(ChannelContext cc) {
if (channelContext.getId().equals(cc.getId())) {
return false;
}
return true;
}}
);
return null; return null;
} }

View File

@@ -1,30 +1,57 @@
package com.zt.plat.module.qms.iot.tcpserver.device; package com.zt.plat.module.qms.iot.tcpserver.device;
import com.zt.plat.framework.tenant.core.context.TenantContextHolder;
import com.zt.plat.module.qms.iot.tcpserver.IotUtils; import com.zt.plat.module.qms.iot.tcpserver.IotUtils;
import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionForRedisContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionForRedisContext;
import com.zt.plat.module.qms.iot.tcpserver.publisher.IotDeviceRegisterPublisher;
import com.zt.plat.module.qms.resource.device.dal.dataobject.DeviceInfomationDO;
import com.zt.plat.module.qms.resource.device.service.DeviceInfomationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio;
import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Service @Service
@Slf4j
public class RedisSessionComponent { public class RedisSessionComponent {
@Autowired @Autowired private RedisTemplate redisTemplate;
public RedisTemplate redisTemplate; @Autowired private DeviceInfomationService deviceInfomationService;
private final long timeoutSeconds = 60;
public void update(IotDeviceSessionForRedisContext context){
public void save(String deviceCode, String deviceType){ String deviceId = IotUtils.transDeviceCodeToId(context.getDeviceCode());
long timeoutSeconds = 60;
String deviceId = IotUtils.transDeviceCodeToId(deviceCode);
IotDeviceSessionForRedisContext context = new IotDeviceSessionForRedisContext();
context.setDeviceId(deviceId);
context.setDeviceType(deviceType);
context.setDeviceCode(deviceCode);
context.setRegTime(new Date()); context.setRegTime(new Date());
redisTemplate.opsForValue().set(getRedisKey(deviceId), context, timeoutSeconds, TimeUnit.SECONDS); String key = getRedisKeyByDeviceId(deviceId);
log.info("key={}", key);
redisTemplate.opsForValue().set(key, context, timeoutSeconds, TimeUnit.SECONDS);
}
public void clearControlByDeviceCode(String deviceCode, ChannelContext channelContext){
IotDeviceSessionForRedisContext context = getByDeviceCode(deviceCode);
context.setControlRealName("");
context.setControlChannelContext(null);
channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, "");
redisTemplate.opsForValue().set(getRedisKeyByDeviceCode(deviceCode), context, timeoutSeconds, TimeUnit.SECONDS);
}
public void clearControlByDeviceId(String deviceId, ChannelContext channelContext){
IotDeviceSessionForRedisContext context = getByDeviceId(deviceId);
context.setControlRealName("");
context.setControlChannelContext(null);
channelContext.set(ChannelContextConstant.CONTROL_DEVICE_ID, "");
redisTemplate.opsForValue().set(getRedisKeyByDeviceId(deviceId), context, timeoutSeconds, TimeUnit.SECONDS);
}
public void deleteByDeviceId(String deviceId){
redisTemplate.delete(getRedisKeyByDeviceCode(deviceId));
} }
public IotDeviceSessionForRedisContext getByDeviceCode(String deviceCode){ public IotDeviceSessionForRedisContext getByDeviceCode(String deviceCode){
@@ -33,19 +60,56 @@ public class RedisSessionComponent {
} }
public IotDeviceSessionForRedisContext getByDeviceId(String deviceId){ public IotDeviceSessionForRedisContext getByDeviceId(String deviceId){
return (IotDeviceSessionForRedisContext) redisTemplate.opsForValue().get(getRedisKey(deviceId)); return (IotDeviceSessionForRedisContext) redisTemplate.opsForValue().get(getRedisKeyByDeviceId(deviceId));
} }
public String getRedisKey(String deviceCode){ public String getRedisKeyByDeviceCode(String deviceCode){
String deviceId = IotUtils.transDeviceCodeToId(deviceCode); String deviceId = IotUtils.transDeviceCodeToId(deviceCode);
return getRedisKeyByDeviceId(deviceId);
}
public String getRedisKeyByDeviceId(String deviceId){
String redisKey = IotDeviceSessionForRedisContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY + "-" + deviceId; String redisKey = IotDeviceSessionForRedisContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY + "-" + deviceId;
return redisKey; return redisKey;
} }
public void update(IotDeviceSessionForRedisContext context){ public void regDevice(ChannelContext channelContext, String deviceCode, String deviceType){
long timeoutSeconds = 60; IotDeviceSessionForRedisContext deviceContext = getByDeviceCode(deviceCode);
String deviceId = IotUtils.transDeviceCodeToId(context.getDeviceCode()); if(deviceContext != null && Tio.getByBsId(channelContext.getTioConfig(), deviceCode) != null){
context.setRegTime(new Date()); return;
redisTemplate.opsForValue().set(getRedisKey(deviceId), context, timeoutSeconds, TimeUnit.SECONDS); }
TenantContextHolder.setIgnore(true);
try{
String deviceId = IotUtils.transDeviceCodeToId(deviceCode);
DeviceInfomationDO deviceInfo = deviceInfomationService.getDeviceInfomation(Long.valueOf(deviceId));
IotDeviceSessionForRedisContext context = new IotDeviceSessionForRedisContext();
context.setDeviceId(deviceId);
context.setDeviceType(deviceType);
context.setDeviceCode(deviceCode);
if(deviceInfo != null){
context.setDeviceName(deviceInfo.getProductName());
context.setTenantId(deviceInfo.getTenantId().toString());
deviceInfo.setIsConnect("1");
deviceInfo.setLastConnectTime(LocalDateTime.now());
deviceInfomationService.updateDeviceInfomation(deviceInfo);
}
context.setRegTime(new Date());
context.setControlRealName( "");
redisTemplate.opsForValue().set(getRedisKeyByDeviceId(deviceId), context, timeoutSeconds, TimeUnit.SECONDS);
channelContext.set("regTime", new Date());
//绑定业务id
Tio.bindBsId(channelContext, deviceCode);
//设备注册事件
IotDeviceRegisterPublisher.publishEvent(deviceCode, deviceType);
}catch (Exception e){
e.printStackTrace();
log.error("设备注册异常:{}", e.getMessage());
}finally {
TenantContextHolder.clear();
}
} }
} }

View File

@@ -2,6 +2,7 @@ package com.zt.plat.module.qms.iot.tcpserver.handler;
import com.zt.plat.module.qms.iot.tcpserver.IotDeviceType; import com.zt.plat.module.qms.iot.tcpserver.IotDeviceType;
import com.zt.plat.module.qms.iot.tcpserver.IotPacket; import com.zt.plat.module.qms.iot.tcpserver.IotPacket;
import com.zt.plat.module.qms.iot.tcpserver.IotUtils;
import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant; import com.zt.plat.module.qms.iot.tcpserver.core.ChannelContextConstant;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionContext;
import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionForRedisContext; import com.zt.plat.module.qms.iot.tcpserver.core.IotDeviceSessionForRedisContext;
@@ -9,7 +10,6 @@ import com.zt.plat.module.qms.iot.tcpserver.device.RedisSessionComponent;
import com.zt.plat.module.qms.iot.tcpserver.device.handler.IotDeviceBalanceHandler; import com.zt.plat.module.qms.iot.tcpserver.device.handler.IotDeviceBalanceHandler;
import com.zt.plat.module.qms.iot.tcpserver.device.handler.IotDeviceThermometerHandler; import com.zt.plat.module.qms.iot.tcpserver.device.handler.IotDeviceThermometerHandler;
import com.zt.plat.module.qms.iot.tcpserver.device.handler.IotDeviceWeighbridgeHandler; import com.zt.plat.module.qms.iot.tcpserver.device.handler.IotDeviceWeighbridgeHandler;
import com.zt.plat.module.qms.iot.tcpserver.publisher.IotDeviceRegisterPublisher;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -17,7 +17,6 @@ import org.springframework.util.ObjectUtils;
import tech.zzjc.tio.core.ChannelContext; import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio; import tech.zzjc.tio.core.Tio;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -83,47 +82,20 @@ public class IotDeviceHandler implements IotHander {
return null; return null;
} }
if(regFlag){ if(regFlag){
regDevice(channelContext, deviceCode, deviceType); redisSessionComponent.regDevice(channelContext, deviceCode, deviceType);
return null; return null;
} }
IotDeviceSessionForRedisContext deviceContext = redisSessionComponent.getByDeviceCode(deviceCode); IotDeviceSessionForRedisContext deviceContext = redisSessionComponent.getByDeviceCode(deviceCode);
if(deviceContext == null){ if(deviceContext == null || Tio.getByBsId(channelContext.getTioConfig(), deviceCode) == null){
regDevice(channelContext, deviceCode, deviceType); redisSessionComponent.regDevice(channelContext, deviceCode, deviceType);
}else{ }else{
//更新过期时间 //更新过期时间
redisSessionComponent.save(deviceCode, deviceType); redisSessionComponent.update(deviceContext);
} }
//在sessionContext记录设备id //在sessionContext记录设备id
IotDeviceSessionContext sessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY); IotDeviceSessionContext sessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
sessionContext.setDeviceCode(deviceCode); sessionContext.setDeviceCode(deviceCode);
// if (reginfo.startsWith("iot-") && regs.length == 3) {//设备数据携带注册 sessionContext.setDeviceId(IotUtils.transDeviceCodeToId(deviceCode));
// deviceType = regs[1];
// deviceCode = regs[2];
// deviceData = infos[1];
// //判断是否注册过
// if (StringUtils.isBlank(sessionContext.getDeviceId())) {
// sessionContext.setDeviceId(new BigInteger(deviceCode, Character.MAX_RADIX).toString());
// sessionContext.setDeviceType(deviceType);
// sessionContext.setDeviceCode(deviceCode);
// saveRegisterInfoToRedis(deviceCode, deviceType);
// channelContext.set("regTime", new Date());
//
// //绑定业务id
// Tio.bindBsId(channelContext, deviceCode);
//
// //设备注册事件
// IotDeviceRegisterPublisher.publishEvent(deviceCode, deviceType);
// }
// } else {
// deviceType = sessionContext.getDeviceType();
// deviceCode = sessionContext.getDeviceCode();
// deviceData = text;
// if (Tio.getByBsId(channelContext.getTioConfig(), deviceCode) == null) {
// log.info("{}, 数据传输过程中。未绑定业务id消失重新绑定", realClient);
// //绑定业务id
// Tio.bindBsId(channelContext, deviceCode);
// }
// }
IotDataHander iotDataHander = handlerMap.get(deviceType); IotDataHander iotDataHander = handlerMap.get(deviceType);
if (iotDataHander == null) { if (iotDataHander == null) {
log.error("{}, 找不到处理类,设备类型:{}", realClient, deviceType); log.error("{}, 找不到处理类,设备类型:{}", realClient, deviceType);
@@ -132,20 +104,4 @@ public class IotDeviceHandler implements IotHander {
iotDataHander.hander(null, deviceData.trim(), channelContext); iotDataHander.hander(null, deviceData.trim(), channelContext);
return null; return null;
} }
public void regDevice(ChannelContext channelContext, String deviceCode, String deviceType){
redisSessionComponent.save(deviceCode, deviceType);
channelContext.set("regTime", new Date());
//绑定业务id
Tio.bindBsId(channelContext, deviceCode);
//设备注册事件
IotDeviceRegisterPublisher.publishEvent(deviceCode, deviceType);
}
} }

View File

@@ -14,6 +14,7 @@ import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio; import tech.zzjc.tio.core.Tio;
import tech.zzjc.tio.starter.TioServerBootstrap; import tech.zzjc.tio.starter.TioServerBootstrap;
@@ -55,6 +56,7 @@ public class IotDeviceRegisterListener {
Map<String, Object> source = (Map<String, Object>) event.getSource(); Map<String, Object> source = (Map<String, Object>) event.getSource();
DeviceInfomationDO deviceInfo = (DeviceInfomationDO) source.get(EventConstant.EVENT_IOT_DEVICE_REGISTER); DeviceInfomationDO deviceInfo = (DeviceInfomationDO) source.get(EventConstant.EVENT_IOT_DEVICE_REGISTER);
Long deviceId = deviceInfo.getId(); Long deviceId = deviceInfo.getId();
String deviceType = deviceInfo.getCollectDeviceType();
final String bsId = Long.toString(deviceId, Character.MAX_RADIX); final String bsId = Long.toString(deviceId, Character.MAX_RADIX);
if("temp".equals(deviceInfo.getCollectDeviceType())) { if("temp".equals(deviceInfo.getCollectDeviceType())) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
@@ -68,27 +70,7 @@ public class IotDeviceRegisterListener {
} }
}, 1, 1, TimeUnit.SECONDS); }, 1, 1, TimeUnit.SECONDS);
} }
TenantContextHolder.setIgnore(true); ChannelContext channelContext = Tio.getByBsId(tioServerBootstrap.getServerTioConfig(), bsId);
try{ redisSessionComponent.regDevice(channelContext, bsId, deviceType);
deviceInfo = deviceInfomationService.getDeviceInfomation(deviceId);
// ChannelContext channelContext = Tio.getByBsId(tioServerBootstrap.getServerTioConfig(), bsId);
// channelContext.set("TenantId", deviceInfo.getTenantId());
// IotDeviceSessionContext sessionContext = (IotDeviceSessionContext) channelContext.get(IotDeviceSessionContext.DEFAULT_DEVICE_SESSION_CONTEXT_KEY);
// sessionContext.setDeviceName(deviceInfo.getDeviceCode());
IotDeviceSessionForRedisContext context = redisSessionComponent.getByDeviceCode(bsId);
context.setDeviceName(deviceInfo.getProductName());
context.setTenantId(deviceInfo.getTenantId().toString());
redisSessionComponent.update(context);
deviceInfo.setIsConnect("1");
deviceInfo.setLastConnectTime(LocalDateTime.now());
deviceInfomationService.updateDeviceInfomation(deviceInfo);
}catch (Exception e){
e.printStackTrace();
log.error("设备注册异常:{}", e.getMessage());
}finally {
TenantContextHolder.clear();
}
} }
} }