From c52bb823756424384d5da8b26c4e8690ad921073 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Fri, 11 Oct 2024 09:57:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0IEC61850=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iec61850bean/ServerAssociation.java | 12 ++--- .../cac/controller/IecServerController.java | 36 +++++++++++++++ src/main/java/com/xydl/cac/iec/IecServer.java | 43 ++++++++++++++++++ .../com/xydl/cac/iec/IecServerService.java | 44 +++++++++++++++++++ 4 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/xydl/cac/controller/IecServerController.java create mode 100644 src/main/java/com/xydl/cac/iec/IecServer.java create mode 100644 src/main/java/com/xydl/cac/iec/IecServerService.java diff --git a/src/main/java/com/beanit/iec61850bean/ServerAssociation.java b/src/main/java/com/beanit/iec61850bean/ServerAssociation.java index dde88d3..1ddbb95 100644 --- a/src/main/java/com/beanit/iec61850bean/ServerAssociation.java +++ b/src/main/java/com/beanit/iec61850bean/ServerAssociation.java @@ -424,16 +424,16 @@ final class ServerAssociation { try { buffer = acseAssociation.receive(pduBuffer); } catch (EOFException e) { - logger.debug("Connection was closed by client."); +// logger.debug("Connection was closed by client."); return null; } catch (SocketTimeoutException e) { - logger.warn( - "Message fragment timeout occured while receiving request. Closing association.", e); +// logger.warn( +// "Message fragment timeout occured while receiving request. Closing association.", e); return null; } catch (IOException e) { - logger.warn( - "IOException at lower layers while listening for incoming request. Closing association.", - e); +// logger.warn( +// "IOException at lower layers while listening for incoming request. Closing association.", +// e); return null; } catch (DecodingException e) { logger.error("Error decoding request at OSI layers.", e); diff --git a/src/main/java/com/xydl/cac/controller/IecServerController.java b/src/main/java/com/xydl/cac/controller/IecServerController.java new file mode 100644 index 0000000..a95a7db --- /dev/null +++ b/src/main/java/com/xydl/cac/controller/IecServerController.java @@ -0,0 +1,36 @@ +package com.xydl.cac.controller; + +import com.xydl.cac.iec.IecServerService; +import com.xydl.cac.model.Response; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@Api(tags = {"Iec服务端接口"}) +@RequestMapping("iecserver") +@Slf4j +public class IecServerController extends BasicController { + + @Resource + IecServerService iecServerService; + + @GetMapping("start") + @ApiOperation("启动IEC服务端") + public Response start() throws Exception { + iecServerService.startServer(); + return Response.success("OK"); + } + + @GetMapping("stop") + @ApiOperation("停止IEC服务端") + public Response stop() throws Exception { + iecServerService.stop(); + return Response.success("OK"); + } +} diff --git a/src/main/java/com/xydl/cac/iec/IecServer.java b/src/main/java/com/xydl/cac/iec/IecServer.java new file mode 100644 index 0000000..bfef48d --- /dev/null +++ b/src/main/java/com/xydl/cac/iec/IecServer.java @@ -0,0 +1,43 @@ +package com.xydl.cac.iec; + +import com.beanit.iec61850bean.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; + +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@Slf4j +public class IecServer extends Thread 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("已启动IEC服务端."); + } + + public void close() { + if (serverSap != null) { + serverSap.stop(); + log.info("已停止IEC服务端."); + } + } + + @Override + public List write(List bdas) { + return null; + } + + @Override + public void serverStoppedListening(ServerSap serverSAP) { + + } +} diff --git a/src/main/java/com/xydl/cac/iec/IecServerService.java b/src/main/java/com/xydl/cac/iec/IecServerService.java new file mode 100644 index 0000000..99a2f61 --- /dev/null +++ b/src/main/java/com/xydl/cac/iec/IecServerService.java @@ -0,0 +1,44 @@ +package com.xydl.cac.iec; + +import com.xydl.cac.entity.IcdFile; +import com.xydl.cac.repository.IcdFileRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.PreDestroy; +import javax.annotation.Resource; +import java.util.List; + +@Service +@Slf4j +public class IecServerService { + @Resource + IcdFileRepository fileRepository; + + 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; + } catch (Exception e) { + log.error("启动IEC服务端异常.", e); + } + } + } + } + + @PreDestroy + public void stop() { + if (iecServer != null) { + iecServer.close(); + started = false; + } + } +}