From dc95197957bd8107fc8a009df72231f35dffa9a3 Mon Sep 17 00:00:00 2001 From: yiming Date: Thu, 13 Oct 2022 13:14:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhehekeji/web/pojo/street/StreetVO.java | 5 ++ .../zhehekeji/web/service/InitService.java | 6 +++ .../zhehekeji/web/service/StreetService.java | 17 +++++++ .../web/service/client/ClientChanel.java | 18 ++++++++ .../service/client/NettyConnectHandler.java | 46 +++++-------------- .../web/service/client/NettyServer.java | 1 + 6 files changed, 59 insertions(+), 34 deletions(-) diff --git a/web/src/main/java/com/zhehekeji/web/pojo/street/StreetVO.java b/web/src/main/java/com/zhehekeji/web/pojo/street/StreetVO.java index 06146e6..e2c4a2d 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/street/StreetVO.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/street/StreetVO.java @@ -25,6 +25,11 @@ public class StreetVO extends Street { private Integer rightSensorGunPort; + /** + * 客户端在线状态 1:在线 + */ + private Integer connectStatus; + @JsonProperty(value="RFIDIp") private String RFIDIp; diff --git a/web/src/main/java/com/zhehekeji/web/service/InitService.java b/web/src/main/java/com/zhehekeji/web/service/InitService.java index 479a30b..7c2a73a 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -11,6 +11,7 @@ import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl; import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.SensorGunMapper; import com.zhehekeji.web.mapper.StreetMapper; +import com.zhehekeji.web.service.client.ClientChanel; import com.zhehekeji.web.service.client.NettyServer; import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.putian.PuTianNettyClient; @@ -86,6 +87,11 @@ public class InitService implements ApplicationRunner { LoginThread loginThread = new LoginThread(camera); loginThread.start(); }); + //所有客户端的IP 标识保存到map内存 + List streets = streetMapper.selectByMap(new HashMap<>()); + streets.forEach(street -> { + ClientChanel.putIp(street.getPlcIp(),street.getPlcId()); + }); ConfigProperties.KSEC ksec = configProperties.getKsec(); if(ksec != null){ StreetConn.init(1,"ksec"); diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetService.java b/web/src/main/java/com/zhehekeji/web/service/StreetService.java index f1c4259..1af6d90 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -16,6 +16,7 @@ import com.zhehekeji.web.mapper.SensorGunMapper; import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.pojo.street.StreetSearch; import com.zhehekeji.web.pojo.street.StreetVO; +import com.zhehekeji.web.service.client.ClientChanel; import com.zhehekeji.web.service.robotic.NettyClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -85,6 +86,9 @@ public class StreetService { } catch (DuplicateKeyException e) { Assert.isTrue(false, "PLC ID已存在"); } + if(!StringUtils.isEmpty(street.getPlcIp())){ + ClientChanel.putIp(street.getPlcIp(),street.getPlcId()); + } if(configProperties.getServerMode().equals(0)){ StreetConn.init(street.getId(), street.getPlcId()); Thread thread = new Thread(new Runnable() { @@ -147,6 +151,10 @@ public class StreetService { lightSourceMapper.deleteByMap(map); rfidMapper.deleteByMap(map); StreetConn.del(id); + if(!StringUtils.isEmpty(street.getPlcIp())){ + ClientChanel.deleteIp(street.getPlcIp()); + } + } //只是为了删除缓存 @@ -177,6 +185,9 @@ public class StreetService { } catch (DuplicateKeyException e) { Assert.isTrue(false, "PLC ID已存在"); } + if(!StringUtils.isEmpty(street.getPlcIp())){ + ClientChanel.putIp(street.getPlcIp(),street.getPlcId()); + } List list = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",street.getId())); if(list.size() == 0){ if(!StringUtils.isEmpty(streetVO.getLightSourceIp()) && streetVO.getLightSourcePort() != null && streetVO.getLightSourcePort() != 0){ @@ -204,6 +215,12 @@ public class StreetService { public PageInfo page(StreetSearch search) { PageHelper.startPage(search.getPageNum(), search.getPageSize()); List streetVOS = streetMapper.list(); + streetVOS.forEach(streetVO -> { + //存在chanel则认为在线 + if(ClientChanel.get(streetVO.getPlcId()) != null){ + streetVO.setConnectStatus(1); + } + }); return new PageInfo<>(streetVOS); } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java b/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java index 4761e5e..e1d6039 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java @@ -23,6 +23,23 @@ public class ClientChanel { */ private static Map channelMap = new HashMap<>(); + /** + * key :IP + * value: 巷道标识符 + */ + private static Map IPMap = new HashMap<>(); + + public static void putIp(String ip,String ID){ + IPMap.put(ip,ID); + } + + public static void deleteIp(String ip){ + IPMap.remove(ip); + } + + public static String getIDFromIp(String ip){ + return IPMap.get(ip); + } public static void connect(String key, Channel channel){ channelMap.put(key,channel); @@ -43,4 +60,5 @@ public class ClientChanel { tcpLogger.info("no connect client:{}",key); } } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java b/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java index 4c6ac8f..16c3480 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java @@ -1,40 +1,28 @@ package com.zhehekeji.web.service.client; -import com.zhehekeji.web.service.StreetConn; -import com.zhehekeji.web.service.ksec.KsecInfo; -import com.zhehekeji.web.service.ksec.KsecNettyClient; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.timeout.IdleStateEvent; import lombok.extern.slf4j.Slf4j; +import java.net.InetSocketAddress; + /** - * 与PLC心跳 处理 + * 客户端的上下线 * * @author Administrator * */ @Slf4j public class NettyConnectHandler extends ChannelInboundHandlerAdapter { - /** 客户端请求的心跳命令 */ - private KsecInfo heart; - - - private KsecNettyClient nettyClient; - - public NettyConnectHandler(KsecInfo ksecInfo, KsecNettyClient nettyClient){ - - this.heart = ksecInfo; - this.nettyClient = nettyClient; - } /** * 建立连接时 */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { - log.info("upPc connected "); - StreetConn.conn(1); + InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = socketAddress.getAddress().getHostAddress(); + log.info("ip:{} connected",clientIp); ctx.fireChannelActive(); } @@ -43,22 +31,12 @@ public class NettyConnectHandler extends ChannelInboundHandlerAdapter { */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.info("upPc closed"); + InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = socketAddress.getAddress().getHostAddress(); + log.info("ip:{} disconnected",clientIp); + String ID = ClientChanel.getIDFromIp(clientIp); + //设置客户端下线 + ClientChanel.disConnect(ID); } - /** - * 心跳请求处理,每4秒发送一次心跳请求; - * - */ - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { - if (obj instanceof IdleStateEvent) { - log.debug("upPc send heart"); - ctx.channel().writeAndFlush(heart); - IdleStateEvent event = (IdleStateEvent) obj; - } - - } - - } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java b/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java index cf53775..da90a3d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java @@ -37,6 +37,7 @@ public class NettyServer { .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) { + ch.pipeline().addLast(new NettyConnectHandler()); ch.pipeline().addLast(new Decoder(plcService)); ch.pipeline().addLast(new Encoder()); }}); // 子处理器,用于处理workerGroup