diff --git a/src/main/java/com/xydl/cac/iec/IecClient.java b/src/main/java/com/xydl/cac/iec/IecClient.java index e728032..7899a0f 100644 --- a/src/main/java/com/xydl/cac/iec/IecClient.java +++ b/src/main/java/com/xydl/cac/iec/IecClient.java @@ -4,12 +4,14 @@ import com.beanit.iec61850bean.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.nio.charset.StandardCharsets; +import java.util.Optional; @Slf4j public class IecClient implements ClientEventListener { @@ -60,9 +62,24 @@ public class IecClient implements ClientEventListener { return null; } + public void enableReporting() throws Exception { + if (!CollectionUtils.isEmpty(serverModel.getUrcbs())) { + Optional optional = serverModel.getUrcbs().stream().findFirst(); + Urcb urcb = optional.get(); + clientAssociation.enableReporting(urcb); + } + } + @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); + } + } + } } @Override diff --git a/src/main/java/com/xydl/cac/iec/IecServerService.java b/src/main/java/com/xydl/cac/iec/IecServerService.java index b1bdeab..d657935 100644 --- a/src/main/java/com/xydl/cac/iec/IecServerService.java +++ b/src/main/java/com/xydl/cac/iec/IecServerService.java @@ -2,6 +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 lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -14,8 +15,11 @@ import java.util.List; @Service @Slf4j public class IecServerService { + @Resource IcdFileRepository fileRepository; + @Resource + RealTimeService realTimeService; IecServer iecServer = new IecServer(); boolean started = false; @@ -28,6 +32,8 @@ public class IecServerService { try { iecServer.startServer(icdFile.getXml(), 102); started = true; + + realTimeService.start(); } catch (Exception e) { log.error("启动IEC61850服务端异常.", e); } @@ -37,6 +43,7 @@ public class IecServerService { @PreDestroy public void stop() { + realTimeService.stop(); if (iecServer != null) { iecServer.close(); started = false; diff --git a/src/main/java/com/xydl/cac/service/RealTimeService.java b/src/main/java/com/xydl/cac/service/RealTimeService.java new file mode 100644 index 0000000..a5abe24 --- /dev/null +++ b/src/main/java/com/xydl/cac/service/RealTimeService.java @@ -0,0 +1,8 @@ +package com.xydl.cac.service; + +public interface RealTimeService { + + void start(); + + void stop(); +} diff --git a/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java new file mode 100644 index 0000000..93199d3 --- /dev/null +++ b/src/main/java/com/xydl/cac/service/impl/RealTimeServiceImpl.java @@ -0,0 +1,64 @@ +package com.xydl.cac.service.impl; + +import com.xydl.cac.entity.IcdFile; +import com.xydl.cac.entity.IcdIed; +import com.xydl.cac.iec.IecClient; +import com.xydl.cac.repository.*; +import com.xydl.cac.service.RealTimeService; +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.HashMap; +import java.util.Iterator; +import java.util.List; + + +@Service +@Slf4j +public class RealTimeServiceImpl implements RealTimeService { + + @Resource + IcdFileRepository fileRepository; + @Resource + IcdIedRepository iedRepository; + + HashMap clientMap = new HashMap<>(); + + @Override + public void start() { + List icdFileList = fileRepository.findAll(); + if (CollectionUtils.isEmpty(icdFileList)) { + return; + } + for (IcdFile icdFile : icdFileList) { + List iedList = iedRepository.findByIcdFileId(icdFile.getId()); + if (!CollectionUtils.isEmpty(iedList)) { + for (IcdIed ied : iedList) { + try { + IecClient iecClient = new IecClient(); + iecClient.connect(ied.getIp(), 102, ied.getApTitle(), icdFile.getXml()); + iecClient.enableReporting(); + clientMap.put(ied.getIp(), iecClient); + } catch (Exception ex) { + log.error("61850连接异常, ied=" + ied.getName() + ", ip=" + ied.getIp(), ex); + } + } + } + } + } + + @PreDestroy + @Override + public void stop() { + Iterator it = clientMap.keySet().iterator(); + while (it.hasNext()) { + String key = it.next(); + IecClient iecClient = clientMap.get(key); + iecClient.disconnect(); + clientMap.remove(key); + } + } +} diff --git a/src/main/java/com/xydl/cac/task/AmpliDownloadTask.java b/src/main/java/com/xydl/cac/task/AmpliDownloadTask.java index 3179180..551e932 100644 --- a/src/main/java/com/xydl/cac/task/AmpliDownloadTask.java +++ b/src/main/java/com/xydl/cac/task/AmpliDownloadTask.java @@ -75,7 +75,8 @@ public class AmpliDownloadTask { } } catch (Exception e) { log.error("AmpliDownloadTask.downloadServer error.", e); - String str = "SFTP下载文件异常: " + e.getMessage(); + String str = "SFTP下载文件异常: " + config.getName() + " " + + config.getIp() + " " + e.getMessage(); webSocketServer.sendMessage(str); dingTalkPushUtil.pushText(str); } finally {