From 711d9616cd84725b37ca252b4fdb1787870a8466 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Fri, 11 Oct 2024 14:10:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8A=8A=E8=AE=A2=E9=98=85=E5=88=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0=E5=88=B0=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cac/controller/IecServerController.java | 5 ++ src/main/java/com/xydl/cac/iec/IecClient.java | 24 ++++++---- src/main/java/com/xydl/cac/iec/IecServer.java | 35 +++++++++----- .../com/xydl/cac/iec/IecServerService.java | 30 +++++------- .../cac/service/impl/RealTimeServiceImpl.java | 46 +++++++++++++++++++ 5 files changed, 101 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/xydl/cac/controller/IecServerController.java b/src/main/java/com/xydl/cac/controller/IecServerController.java index 88f6a7f..d45de55 100644 --- a/src/main/java/com/xydl/cac/controller/IecServerController.java +++ b/src/main/java/com/xydl/cac/controller/IecServerController.java @@ -2,6 +2,7 @@ package com.xydl.cac.controller; import com.xydl.cac.iec.IecServerService; import com.xydl.cac.model.Response; +import com.xydl.cac.service.RealTimeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -20,17 +21,21 @@ public class IecServerController extends BasicController { @Resource IecServerService iecServerService; + @Resource + RealTimeService realTimeService; @GetMapping("start") @ApiOperation("启动IEC服务端") public Response start() throws Exception { iecServerService.startServer(); + realTimeService.start(); return Response.success("OK"); } @GetMapping("stop") @ApiOperation("停止IEC服务端") public Response stop() throws Exception { + realTimeService.stop(); iecServerService.stop(); return Response.success("OK"); } diff --git a/src/main/java/com/xydl/cac/iec/IecClient.java b/src/main/java/com/xydl/cac/iec/IecClient.java index 7899a0f..458083c 100644 --- a/src/main/java/com/xydl/cac/iec/IecClient.java +++ b/src/main/java/com/xydl/cac/iec/IecClient.java @@ -1,6 +1,7 @@ package com.xydl.cac.iec; import com.beanit.iec61850bean.*; +import com.xydl.cac.service.impl.RealTimeServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -19,6 +20,7 @@ public class IecClient implements ClientEventListener { ClientSap clientSap = new ClientSap(); ClientAssociation clientAssociation = null; ServerModel serverModel; + Urcb urcb = null; public void connect(String host, int port, String apTitle, String xml) throws Exception { InputStream in = IOUtils.toInputStream(xml, StandardCharsets.UTF_8); @@ -64,21 +66,25 @@ public class IecClient implements ClientEventListener { public void enableReporting() throws Exception { if (!CollectionUtils.isEmpty(serverModel.getUrcbs())) { - Optional optional = serverModel.getUrcbs().stream().findFirst(); - Urcb urcb = optional.get(); + Optional optional = serverModel.getUrcbs().stream().findAny(); + urcb = optional.get(); clientAssociation.enableReporting(urcb); } } + public void disableReporting() { + if (urcb != null) { + try { + clientAssociation.disableReporting(urcb); + } catch (Exception ignore) { + } + } + } + @Override public void newReport(Report report) { - if (report != null && report.getValues() != null) { - for (FcModelNode node : report.getValues()) { - if (node instanceof FcDataObject) { - String str = ((FcDataObject) node).toString(); - log.info(str); - } - } + if (report != null) { + RealTimeServiceImpl.processReport(report); } } diff --git a/src/main/java/com/xydl/cac/iec/IecServer.java b/src/main/java/com/xydl/cac/iec/IecServer.java index 48d0163..34be53f 100644 --- a/src/main/java/com/xydl/cac/iec/IecServer.java +++ b/src/main/java/com/xydl/cac/iec/IecServer.java @@ -6,22 +6,26 @@ import org.apache.commons.io.IOUtils; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; @Slf4j -public class IecServer extends Thread implements ServerEventListener { +public class IecServer implements ServerEventListener { ServerSap serverSap = null; ServerModel serversServerModel = null; - - public void startServer(String xml, int port) throws Exception { - InputStream in = IOUtils.toInputStream(xml, StandardCharsets.UTF_8); - serverSap = new ServerSap(port, 0, null, SclParser.parse(in).get(0), null); - - serverSap.setPort(port); - serverSap.startListening(this); - serversServerModel = serverSap.getModelCopy(); - this.start(); - log.info("已启动IEC61850服务端."); + public boolean started = false; + + public void start(String xml, int port) throws Exception { + if (!started) { + InputStream in = IOUtils.toInputStream(xml, StandardCharsets.UTF_8); + serverSap = new ServerSap(port, 0, null, SclParser.parse(in).get(0), null); + + serverSap.setPort(port); + serverSap.startListening(this); + serversServerModel = serverSap.getModelCopy(); + started = true; + log.info("已启动IEC61850服务端在" + port + "端口"); + } } public void close() { @@ -29,6 +33,15 @@ public class IecServer extends Thread implements ServerEventListener { serverSap.stop(); log.info("已停止IEC61850服务端."); } + started = false; + } + + public void updateBda(BasicDataAttribute bda) { + BasicDataAttribute node = (BasicDataAttribute) serversServerModel.findModelNode(bda.getReference(), bda.getFc()); + node.setValueFrom(bda); + List bdas = new ArrayList<>(); + bdas.add(node); + serverSap.setValues(bdas); } @Override diff --git a/src/main/java/com/xydl/cac/iec/IecServerService.java b/src/main/java/com/xydl/cac/iec/IecServerService.java index d657935..39b822e 100644 --- a/src/main/java/com/xydl/cac/iec/IecServerService.java +++ b/src/main/java/com/xydl/cac/iec/IecServerService.java @@ -2,7 +2,7 @@ package com.xydl.cac.iec; import com.xydl.cac.entity.IcdFile; import com.xydl.cac.repository.IcdFileRepository; -import com.xydl.cac.service.RealTimeService; +import com.xydl.cac.service.impl.RealTimeServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -18,42 +18,34 @@ public class IecServerService { @Resource IcdFileRepository fileRepository; - @Resource - RealTimeService realTimeService; IecServer iecServer = new IecServer(); - boolean started = false; public void startServer() { - if (!started) { - List icdFileList = fileRepository.findAll(); - if (!CollectionUtils.isEmpty(icdFileList)) { - IcdFile icdFile = icdFileList.get(0); - try { - iecServer.startServer(icdFile.getXml(), 102); - started = true; - - realTimeService.start(); - } catch (Exception e) { - log.error("启动IEC61850服务端异常.", e); - } + List icdFileList = fileRepository.findAll(); + if (!CollectionUtils.isEmpty(icdFileList)) { + IcdFile icdFile = icdFileList.get(0); + try { + iecServer.start(icdFile.getXml(), 102); + RealTimeServiceImpl.iecServer = iecServer; + } catch (Exception e) { + log.error("启动IEC61850服务端异常.", e); } } } @PreDestroy public void stop() { - realTimeService.stop(); + RealTimeServiceImpl.iecServer = null; if (iecServer != null) { iecServer.close(); - started = false; } } public HashMap status() { HashMap map = new HashMap<>(); map.put("port", 102); - map.put("started", started); + map.put("started", iecServer.started); return map; } } diff --git a/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java index 93199d3..f3c329a 100644 --- a/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java @@ -1,8 +1,10 @@ package com.xydl.cac.service.impl; +import com.beanit.iec61850bean.*; import com.xydl.cac.entity.IcdFile; import com.xydl.cac.entity.IcdIed; import com.xydl.cac.iec.IecClient; +import com.xydl.cac.iec.IecServer; import com.xydl.cac.repository.*; import com.xydl.cac.service.RealTimeService; import lombok.extern.slf4j.Slf4j; @@ -25,6 +27,8 @@ public class RealTimeServiceImpl implements RealTimeService { @Resource IcdIedRepository iedRepository; + public static HashMap dataMap = new HashMap<>(); + public static IecServer iecServer = null; HashMap clientMap = new HashMap<>(); @Override @@ -57,8 +61,50 @@ public class RealTimeServiceImpl implements RealTimeService { while (it.hasNext()) { String key = it.next(); IecClient iecClient = clientMap.get(key); + iecClient.disableReporting(); iecClient.disconnect(); clientMap.remove(key); } } + + public static void processReport(Report report) { + if (!CollectionUtils.isEmpty(report.getValues())) { + for (FcModelNode node : report.getValues()) { + processNodeValue(node); + } + } + } + + private static void processNodeValue(FcModelNode node) { + if (node instanceof FcDataObject) { + FcDataObject fcnode = (FcDataObject) node; + if (!CollectionUtils.isEmpty(fcnode.getChildren())) { + for (ModelNode child : fcnode.getChildren()) { + if (child instanceof BasicDataAttribute) { + BasicDataAttribute bda = (BasicDataAttribute) child; + processBdaNodeValue(bda); + } else if (child instanceof ConstructedDataAttribute) { + ConstructedDataAttribute cda = (ConstructedDataAttribute) child; + if (!CollectionUtils.isEmpty(cda.getChildren())) { + for (ModelNode cchild : cda.getChildren()) { + if (cchild instanceof BasicDataAttribute) { + BasicDataAttribute bda = (BasicDataAttribute) cchild; + processBdaNodeValue(bda); + } + } + } + } + } + } + } + } + + private static void processBdaNodeValue(BasicDataAttribute bda) { + String ref = bda.getReference().toString(); + String value = bda.getValueString(); + dataMap.put(ref, value); + if (iecServer != null) { + iecServer.updateBda(bda); + } + } }