From 299d7811870d32a3f4ba863cc96315899ab1421f Mon Sep 17 00:00:00 2001 From: huangfeng Date: Tue, 29 Oct 2024 09:45:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=2061850=E6=9C=8D=E5=8A=A1=E7=AB=AF?= =?UTF-8?q?=E5=8F=AF=E5=90=AF=E5=8A=A8=E5=A4=9A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cac/controller/IecServerController.java | 29 +++++--- .../java/com/xydl/cac/entity/IcdFile.java | 4 + src/main/java/com/xydl/cac/iec/IecServer.java | 3 +- .../com/xydl/cac/iec/IecServerService.java | 73 +++++++++++-------- .../com/xydl/cac/iec/RealTimeDataService.java | 9 ++- 5 files changed, 74 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/xydl/cac/controller/IecServerController.java b/src/main/java/com/xydl/cac/controller/IecServerController.java index 1661edb..f1f9a20 100644 --- a/src/main/java/com/xydl/cac/controller/IecServerController.java +++ b/src/main/java/com/xydl/cac/controller/IecServerController.java @@ -62,24 +62,33 @@ public class IecServerController extends BasicController { @PostMapping("start") @ApiOperation("启动IEC服务端") - public Response start(@Validated @NotNull(message = "fileId不能为空!") Integer fileId) throws Exception { - iecServerService.startServer(fileId); + public Response start(Integer fileId, Integer port) throws Exception { + if (fileId == null) { + throw new BusinessException("fileId不能为空!"); + } + if (port == null) { + throw new BusinessException("port不能为空!"); + } + iecServerService.startServer(fileId, port); return Response.success("OK"); } @PostMapping("stop") @ApiOperation("停止IEC服务端") - public Response stop() throws Exception { - iecServerService.stopServer(); + public Response stop(Integer fileId) throws Exception { + if (fileId == null) { + throw new BusinessException("fileId不能为空!"); + } + iecServerService.stopServer(fileId); return Response.success("OK"); } - @GetMapping("status") - @ApiOperation("查看IEC服务端状态") - public Response> status() throws Exception { - HashMap map = iecServerService.status(); - return Response.success(map); - } +// @GetMapping("status") +// @ApiOperation("查看IEC服务端状态") +// public Response> status() throws Exception { +// HashMap map = iecServerService.status(); +// return Response.success(map); +// } @GetMapping("listParamindex") @ApiOperation("查询该IED下的paramindex数据") diff --git a/src/main/java/com/xydl/cac/entity/IcdFile.java b/src/main/java/com/xydl/cac/entity/IcdFile.java index 51837c9..7e7d004 100644 --- a/src/main/java/com/xydl/cac/entity/IcdFile.java +++ b/src/main/java/com/xydl/cac/entity/IcdFile.java @@ -46,6 +46,10 @@ public class IcdFile { @Column(name = "start") private Integer start; + @ApiModelProperty(name = "端口") + @Column(name = "port") + private Integer port; + @Transient private List configList; @Transient diff --git a/src/main/java/com/xydl/cac/iec/IecServer.java b/src/main/java/com/xydl/cac/iec/IecServer.java index acb53a9..b13a706 100644 --- a/src/main/java/com/xydl/cac/iec/IecServer.java +++ b/src/main/java/com/xydl/cac/iec/IecServer.java @@ -19,7 +19,7 @@ public class IecServer implements ServerEventListener { ServerModel serversServerModel = null; public boolean started = false; public String filename = null; - public Integer fileId = null; + public Integer port = null; IcdTransformService _transformService; public IecServer(IcdTransformService transformService) { @@ -35,6 +35,7 @@ public class IecServer implements ServerEventListener { serverSap.startListening(this); serversServerModel = serverSap.getModelCopy(); started = true; + this.port = port; log.info("已启动IEC61850服务端在" + port + "端口"); } } diff --git a/src/main/java/com/xydl/cac/iec/IecServerService.java b/src/main/java/com/xydl/cac/iec/IecServerService.java index a4f18fe..2d4553e 100644 --- a/src/main/java/com/xydl/cac/iec/IecServerService.java +++ b/src/main/java/com/xydl/cac/iec/IecServerService.java @@ -24,22 +24,20 @@ public class IecServerService { @Resource IcdTransformService transformService; - IecServer iecServer = null; - @PostConstruct private void init() { - iecServer = new IecServer(transformService); List list = fileRepository.findBySrvAndStart(Constants.Server, Constants.TRUE); if (!CollectionUtils.isEmpty(list)) { - IcdFile icdFile = list.get(0); - try { - this.startServer(icdFile.getId()); - } catch (Exception ignore) { + for (IcdFile icdFile : list) { + try { + this.startServer(icdFile.getId(), icdFile.getPort()); + } catch (Exception ignore) { + } } } } - public void startServer(Integer fileId) throws BusinessException { + public void startServer(Integer fileId, int port) throws BusinessException { Optional optional = fileRepository.findById(fileId); if (!optional.isPresent()) { throw new BusinessException("未找到该文件"); @@ -49,44 +47,57 @@ public class IecServerService { throw new BusinessException("该文件不是服务端文件"); } try { - iecServer.start(icdFile.getXml(), 102); + IecServer iecServer = new IecServer(transformService); + iecServer.start(icdFile.getXml(), port); iecServer.filename = icdFile.getFilename(); - iecServer.fileId = icdFile.getId(); - RealTimeDataService.iecServer = iecServer; + RealTimeDataService.iecServerMap.put(fileId, iecServer); icdFile.setStart(Constants.TRUE); + icdFile.setPort(port); fileRepository.save(icdFile); } catch (Exception e) { + icdFile.setStart(Constants.FALSE); + fileRepository.save(icdFile); log.error("启动IEC61850服务端异常.", e); + throw new BusinessException(e.getMessage()); } } - public void stopServer() { - this.stop(); - if (iecServer.fileId != null) { - Optional optional = fileRepository.findById(iecServer.fileId); - if (optional.isPresent()) { - IcdFile icdFile = optional.get(); - icdFile.setStart(Constants.FALSE); - fileRepository.save(icdFile); - } + public void stopServer(Integer fileId) { + this.onlyStopServer(fileId); + Optional optional = fileRepository.findById(fileId); + if (optional.isPresent()) { + IcdFile icdFile = optional.get(); + icdFile.setStart(Constants.FALSE); + fileRepository.save(icdFile); + } + } + + private void onlyStopServer(Integer fileId) { + IecServer iecServer = RealTimeDataService.iecServerMap.get(fileId); + if (iecServer != null) { + log.info("关闭IecServer服务, port=" + iecServer.port); + iecServer.close(); + RealTimeDataService.iecServerMap.remove(fileId); } } @PreDestroy private void stop() { - log.info("关闭IecServer服务."); - RealTimeDataService.iecServer = null; - iecServer.close(); + Iterator it = RealTimeDataService.iecServerMap.keySet().iterator(); + while (it.hasNext()) { + Integer key = it.next(); + this.onlyStopServer(key); + } } - public HashMap status() { - HashMap map = new HashMap<>(); - map.put("port", 102); - map.put("started", iecServer.started); - map.put("filename", iecServer.filename); - map.put("fileId", iecServer.fileId); - return map; - } +// public HashMap status() { +// HashMap map = new HashMap<>(); +// map.put("port", 102); +// map.put("started", iecServer.started); +// map.put("filename", iecServer.filename); +// map.put("fileId", iecServer.fileId); +// return map; +// } public List listParamindex(Integer fileId) throws Exception { Optional optional = fileRepository.findById(fileId); diff --git a/src/main/java/com/xydl/cac/iec/RealTimeDataService.java b/src/main/java/com/xydl/cac/iec/RealTimeDataService.java index 5dff2fb..42bd51f 100644 --- a/src/main/java/com/xydl/cac/iec/RealTimeDataService.java +++ b/src/main/java/com/xydl/cac/iec/RealTimeDataService.java @@ -27,7 +27,7 @@ public class RealTimeDataService { @Resource IcdIedRepository iedRepository; - public static IecServer iecServer = null; + public static HashMap iecServerMap = new HashMap<>(); public static boolean inDoing = false; HashMap clientMap = new HashMap<>(); @@ -65,6 +65,8 @@ public class RealTimeDataService { iedRepository.save(ied); clientMap.put(ied.getId(), iecClient); } catch (Exception ex) { + ied.setStart(Constants.FALSE); + iedRepository.save(ied); String err = "61850订阅异常, ied=" + ied.getName() + ", ip=" + ied.getIp(); log.error(err, ex); throw new BusinessException(err); @@ -135,7 +137,10 @@ public class RealTimeDataService { } private static void processBdaNodeValue(BasicDataAttribute bda) { - if (iecServer != null) { + Iterator it = RealTimeDataService.iecServerMap.keySet().iterator(); + while (it.hasNext()) { + Integer key = it.next(); + IecServer iecServer = RealTimeDataService.iecServerMap.get(key); iecServer.updateBda(bda); } IEDCollectService.updateLastData(bda);