feat: 增加61850订阅实时数据

iec104
huangfeng 8 months ago
parent e1248945a5
commit 2ceaadb1e2

@ -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<Urcb> 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

@ -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;

@ -0,0 +1,8 @@
package com.xydl.cac.service;
public interface RealTimeService {
void start();
void stop();
}

@ -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<String, IecClient> clientMap = new HashMap<>();
@Override
public void start() {
List<IcdFile> icdFileList = fileRepository.findAll();
if (CollectionUtils.isEmpty(icdFileList)) {
return;
}
for (IcdFile icdFile : icdFileList) {
List<IcdIed> 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<String> it = clientMap.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
IecClient iecClient = clientMap.get(key);
iecClient.disconnect();
clientMap.remove(key);
}
}
}

@ -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 {

Loading…
Cancel
Save