Browse Source

中山站上报智巡最新代码

dev-zs
fyj 2 years ago
parent
commit
55deaa37b8
  1. 8
      device_cars/pom.xml
  2. 17
      device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java
  3. 10
      device_cars/src/main/java/com/xr/device_car/config/utils/EnumUtil.java
  4. 74
      device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterConfigController.java
  5. 5
      device_cars/src/main/java/com/xr/device_car/modules/analysis/mapper/MeterReadingRecordMapper.java
  6. 20
      device_cars/src/main/java/com/xr/device_car/modules/analysis/scheduled/Task.java
  7. 3
      device_cars/src/main/java/com/xr/device_car/modules/analysis/service/MeterReadingRecordService.java
  8. 4
      device_cars/src/main/java/com/xr/device_car/modules/analysis/service/UdpClientService.java
  9. 9
      device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/MeterReadingRecordServiceImpl.java
  10. 9
      device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/UdpClientServiceImpl.java
  11. 2
      device_cars/src/main/resources/application-dev.yml
  12. 44
      device_cars/src/main/resources/application-prod.yml
  13. 2
      device_cars/src/main/resources/application.yml
  14. 8
      device_cars/src/main/resources/modules/analysis/MeterReadingRecordMapper.xml
  15. 8
      device_iec104/pom.xml
  16. 10
      device_iec61850clent/pom.xml
  17. 2
      device_iec61850clent/src/main/java/com/xr/iec61850clent/Iec61850ClentApplication.java
  18. 7
      device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/IEC61850Config.java
  19. 2
      device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/ModeUtil.java
  20. 2
      device_iec61850clent/src/main/java/com/xr/iec61850clent/models/controller/AiInterfaceController.java
  21. 162
      device_iec61850clent/src/main/java/com/xr/iec61850clent/models/entity/MeterConfig.java
  22. 88
      device_iec61850clent/src/main/java/com/xr/iec61850clent/models/iec61850run/Iec61850clent.java
  23. BIN
      device_iec61850clent/src/main/resources/IEC61850.xlsx
  24. 26
      device_iec61850clent/src/main/resources/application-prod.yml
  25. 8
      device_iec61850server/pom.xml
  26. 10
      device_udpclent/pom.xml
  27. 57
      device_udpclent/src/main/java/com/xr/device_udpclent/common/UdpClientConfig.java
  28. 52
      device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/EnumUtil.java
  29. 21
      device_udpclent/src/main/java/com/xr/device_udpclent/models/controller/UdpClentController.java
  30. 78
      device_udpclent/src/main/java/com/xr/device_udpclent/models/scheduled/UdpClentScheduled.java
  31. 4
      device_udpclent/src/main/java/com/xr/device_udpclent/models/service/UdpClientService.java
  32. 9
      device_udpclent/src/main/java/com/xr/device_udpclent/models/service/impl/UdpClientServiceImpl.java
  33. 2
      device_udpclent/src/main/resources/application-dev.yml
  34. 50
      device_udpclent/src/main/resources/application-prod.yml
  35. 2
      device_udpclent/src/main/resources/application.yml
  36. 51
      device_udpclent/src/main/resources/logback.xml
  37. 6
      device_udpclent/src/main/resources/mapper/MeterReadingRecordMapper.xml

8
device_cars/pom.xml

@ -413,6 +413,14 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>

17
device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java

@ -16,17 +16,24 @@ public class UdbConfig {
public static String getUdbConfig(List<MeterConfig> list){
StringBuffer buffer=new StringBuffer();
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
buffer.append(new Date().getTime()+ new Random().nextInt(9000)+1000).append("\t");
buffer.append("<!Entity=表计识别信息转发配置 ver='V1.0' time='"+sdf.format(new Date())+"'(文件最新时间)!>");
//buffer.append(new Date().getTime()+ new Random().nextInt(9000)+1000).append("\t");
buffer.append("<!Entity=联动信息转发配置 ver='V1.0' time='"+sdf.format(new Date())+"'(文件最新时间)!>");
buffer.append("<DeviceInfo::设备资源信息>");
int i=1;
buffer.append("@序号").append("\t").append("站序号").append("\t").append("监控索引号").append("\t").append("设备名称").append("\t").append("设备类型")
.append("\t").append("实物ID").append("\t").append("是否联动信号").append("\n");
for(MeterConfig config:list){
buffer.append("站序号").append("\t");//站序号
buffer.append("#"+i).append("\t"); //序号
buffer.append("1").append("\t");//站序号
buffer.append(config.getId()).append("\t");//监控索引号
buffer.append("中山站").append("/").append(config.getOwningInterval()).append("/").append(config.getDeviceName()).append("/").append(config.getMeterName()).append("\t");//设备名称=站名称+间隔名称+设备名称+开关名称
buffer.append(config.getMeterCode()).append("\t");//实物ID目前取表计ID
buffer.append("否").append(";");//是否联动信号目前取否,目前结尾符号位;
buffer.append("遥测").append("\t");
buffer.append(config.getId()).append("\t");//实物ID目前取表计ID
buffer.append("否").append("\n");//是否联动信号目前取否,目前结尾符号位;
i++;
}
buffer.append("</DeviceInfo::设备资源信息>");
System.out.println(buffer.toString());
return buffer.toString();
}

10
device_cars/src/main/java/com/xr/device_car/config/utils/EnumUtil.java

@ -1,5 +1,7 @@
package com.xr.device_car.config.utils;
import io.netty.buffer.ByteBuf;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
@ -39,4 +41,12 @@ public class EnumUtil {
}
return Arrays.stream(ts).filter(predicate).findAny();
}
public static String byteBufTo16Str(ByteBuf byteBuf){
StringBuilder sb = new StringBuilder();
for (int i = byteBuf.readerIndex(); i < byteBuf.writerIndex(); i++) {
sb.append(String.format("%02X", byteBuf.getByte(i))+" ");
}
return sb.toString();
}
}

74
device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterConfigController.java

@ -13,6 +13,8 @@ import com.xr.device_car.modules.analysis.scheduled.TaskScheduler;
import com.xr.device_car.modules.analysis.service.*;
import com.xr.device_car.modules.analysis.vo.MeterMaxMinSaveVo;
import com.xr.device_car.modules.system.entity.UserInfo;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
@ -28,9 +30,12 @@ import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
@RestController
@RequestMapping("analysis/meterConfig")
@ -257,11 +262,57 @@ public class MeterConfigController {
@RequestMapping("/sendSynchronizationUdp")
public Result<?> sendSynchronizationUdp(){
try{
// 每次发送的最大长度
final int MAX_LENGTH = 200;
QueryWrapper<MeterConfig> query=new QueryWrapper<>();
query.eq("status",1);
List<MeterConfig> list = meterConfigService.list(query);
String sendMsg = UdbConfig.getUdbConfig(list);
udpClientService.sendData(sendMsg);
byte[]b = sendMsg.getBytes("GB2312");
// 计算需要分成多少段发送
int parts = b.length / MAX_LENGTH + (b.length % MAX_LENGTH == 0 ? 0 : 1);
int s = 1;
for (int i = 0; i < parts; i++) {
if(i==parts-1){
s=0;
}else{
s=1;
}
// 计算每一段的起始索引和结束索引
int start = i * MAX_LENGTH;
System.out.println(start);
int end = Math.min((i + 1) * MAX_LENGTH, b.length);
// 根据起始索引和结束索引截取字节数组的一部分
byte[] segment = java.util.Arrays.copyOfRange(b, start, end);
ByteBuf buf = Unpooled.buffer();
buf.writeBytes(new byte[]{(byte) 0xEB, (byte) 0x90,(byte) 0xEB, (byte) 0x90,(byte)0x43});
buf.writeShortLE(0x03);
buf.writeByte(s);
buf.writeShort(i);
buf.writeInt(start);
buf.writeByte(segment.length);
buf.writeBytes(segment);
//Checksum checksum = new CRC32();
byte c = 0;
int startIndex = 5; // 从第6位开始,索引是5(因为索引从0开始)
int endIndex = buf.readableBytes() - 1; // 到倒数第二位结束
// 截取并处理指定范围内的字节
if (startIndex <= endIndex) {
// 临时存放截取的字节
byte[] slice = new byte[endIndex - startIndex + 1];
// 从ByteBuf中获取数据
buf.getBytes(startIndex, slice);
c=checksum8(slice);
// 更新Checksum对象
//checksum.update(slice, 0, slice.length);
}
buf.writeByte(c);
System.out.println(EnumUtil.byteBufTo16Str(buf));
udpClientService.sendData(buf);
Thread.sleep(100);
}
}catch (Exception e){
e.printStackTrace();
return Result.OK("同步失败!");
@ -269,4 +320,25 @@ public class MeterConfigController {
return Result.OK("同步成功!");
}
public List<MeterConfig> getConfigList(List<MeterConfig> list,int min,int max){
List<MeterConfig> list1=new ArrayList<>();
for(MeterConfig config:list){
if(config.getId()>min && config.getId()<=max){
list1.add(config);
}
}
return list1;
}
// 8位和校验实现
private byte checksum8(byte[] data) {
byte sum = 0;
for (byte b : data) {
sum += b&0xff;
}
return sum;
}
}

5
device_cars/src/main/java/com/xr/device_car/modules/analysis/mapper/MeterReadingRecordMapper.java

@ -11,6 +11,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface MeterReadingRecordMapper extends BaseMapper<MeterReadingRecord> {
void deleteToZt();
void deleteToLog();
}

20
device_cars/src/main/java/com/xr/device_car/modules/analysis/scheduled/Task.java

@ -0,0 +1,20 @@
package com.xr.device_car.modules.analysis.scheduled;
import com.xr.device_car.modules.analysis.service.MeterReadingRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class Task {
@Autowired
private MeterReadingRecordService meterReadingRecordService;
@Scheduled(cron = "0 0 18 * * ?")
public void runTask(){
meterReadingRecordService.deleteToZt();
meterReadingRecordService.deleteToLog();
}
}

3
device_cars/src/main/java/com/xr/device_car/modules/analysis/service/MeterReadingRecordService.java

@ -10,4 +10,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface MeterReadingRecordService extends IService<MeterReadingRecord> {
void deleteToZt();
void deleteToLog();
}

4
device_cars/src/main/java/com/xr/device_car/modules/analysis/service/UdpClientService.java

@ -1,7 +1,9 @@
package com.xr.device_car.modules.analysis.service;
import io.netty.buffer.ByteBuf;
public interface UdpClientService {
void sendData(String data);
void sendData(ByteBuf data);
}

9
device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/MeterReadingRecordServiceImpl.java

@ -17,6 +17,15 @@ import org.springframework.stereotype.Service;
public class MeterReadingRecordServiceImpl extends ServiceImpl<MeterReadingRecordMapper, MeterReadingRecord>
implements MeterReadingRecordService{
@Override
public void deleteToZt() {
((MeterReadingRecordMapper)this.baseMapper).deleteToZt();
}
@Override
public void deleteToLog() {
((MeterReadingRecordMapper)this.baseMapper).deleteToLog();
}
}

9
device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/UdpClientServiceImpl.java

@ -3,6 +3,7 @@ package com.xr.device_car.modules.analysis.service.impl;
import com.xr.device_car.modules.analysis.entity.SendUdpLog;
import com.xr.device_car.modules.analysis.service.SendUdpLogService;
import com.xr.device_car.modules.analysis.service.UdpClientService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.DatagramPacket;
@ -28,14 +29,14 @@ public class UdpClientServiceImpl implements UdpClientService {
@Override
public void sendData(String data) {
public void sendData(ByteBuf byteBuf) {
SendUdpLog sendUdpLog =new SendUdpLog();
sendUdpLog.setRequestMsg(data);
sendUdpLog.setRequestMsg(byteBuf.toString());
sendUdpLog.setRequestTime(new Date());
sendUdpLog.setMessageId(data.split("\t")[0]);
sendUdpLog.setMessageId(new Date().getTime()+"");
try {
udpChannel.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer(data, CharsetUtil.UTF_8), udpServerAddress)).sync();
Unpooled.copiedBuffer(byteBuf), udpServerAddress)).sync();
sendUdpLog.setRequestStatus("0");
} catch (Exception e) {
sendUdpLog.setRequestStatus("1");

2
device_cars/src/main/resources/application-dev.yml

@ -90,5 +90,5 @@ minio:
secretKey: minioadmin
udp:
server:
host: localhost
host: 192.168.1.100
port: 9300

44
device_cars/src/main/resources/application-prod.yml

@ -13,13 +13,13 @@ spring:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.252:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.252:3306/image_analysis_zs?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/image_analysis?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
#Hikari连接池配置
@ -31,13 +31,13 @@ spring:
#自动提交从池中返回的连接
auto-commit: true
#连接允许在池中闲置的最长时间
idle-timeout: 300000
idle-timeout: 30000
#连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置
pool-name: DatebookHikariCP
#池中连接最长生命周期
max-lifetime: 18000000
#等待来自池的连接的最大毫秒数
connection-timeout: 300000
connection-timeout: 30000
#验证该连接是否是有效的查询语句
connection-test-query: select 1 from dual
cloud:
@ -47,9 +47,9 @@ spring:
enabled: false
# redis 相关
redis:
host: ${REDIS_URL:192.168.1.252}
host: ${REDIS_URL:localhost}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:}
password: ${REDIS_PWD:111111}
timeout: 10000
jedis:
pool:
@ -60,27 +60,21 @@ spring:
swagger:
show: true
analysis:
url: http://192.168.1.252:9000/vi/syncrec
url: http://192.168.1.123:9000/vi/syncrec
upLoad:
path: /home/project/upload
url: http://192.168.1.252:85/upload/
path: D:\\images\\images\\
url: http://localhost:85/upload/
file: D:\\images\\images\\
python:
path: C:\\Users\\admin\\Anaconda3\\envs\\myconda310\\python.exe
modelPath: D:\\smartGrid\\smartGrid\\models
netty:
address: 192.168.1.252
port: 2405
address: 192.168.3.20
port: 2404
data:
pathUrl: http://192.168.1.252:8081/api/dataAnalysisCamera/getComer
udp:
server:
host: localhost
port: 9300
minio:
url: http://192.168.1.210:9000
accessKey: minioadmin
secretKey: minioadmin
pathUrl: http://192.168.1.82:8081/api/dataAnalysisCamera/getComer
#pathUrl: http://192.168.1.44:8081/api/dataAnalysisCamera/getComer
eureka:
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
@ -89,4 +83,12 @@ eureka:
healthcheck:
enabled: true
service-url:
defaultZone: http://localhost:8084/eureka
defaultZone: http://localhost:8084/eureka
minio:
url: http://192.168.1.210:9000
accessKey: minioadmin
secretKey: minioadmin
udp:
server:
host: 192.168.1.100
port: 9300

2
device_cars/src/main/resources/application.yml

@ -2,7 +2,7 @@ spring:
profiles:
#active: dev #开发环境
# active: test #测试环境5
active: dev #生产环境
active: prod #生产环境
# active: prod #生产环境
application:
name: deviceCars

8
device_cars/src/main/resources/modules/analysis/MeterReadingRecordMapper.xml

@ -25,4 +25,12 @@
reading_time,reading_value,create_user,
create_time,update_user,update_time
</sql>
<delete id="deleteToZt">
delete from meter_reading_record WHERE DATE(create_time) = DATE(NOW() - INTERVAL 1 DAY);
</delete>
<delete id="deleteToLog">
delete from send_udp_log WHERE DATE(request_time) = DATE(NOW() - INTERVAL 1 DAY);
</delete>
</mapper>

8
device_iec104/pom.xml

@ -97,6 +97,14 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>

10
device_iec61850clent/pom.xml

@ -13,7 +13,7 @@
<name>device_iec61850clent</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- netflix-eureka-client依赖-->
@ -123,6 +123,14 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>

2
device_iec61850clent/src/main/java/com/xr/iec61850clent/Iec61850ClentApplication.java

@ -30,7 +30,7 @@ public class Iec61850ClentApplication implements CommandLineRunner {
@Override
@Async
public void run(String[] args){
Iec61850clent iec61850clent=new Iec61850clent(args,"192.168.1.83",102);
Iec61850clent iec61850clent=new Iec61850clent(args,"192.168.1.93",102);
executor.execute(iec61850clent);
// Iec61850clent iec61850clent1=new Iec61850clent(args,"192.168.1.138",102);
// executor.submit(iec61850clent1);

7
device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/IEC61850Config.java

@ -21,7 +21,7 @@ import java.util.List;
@Component
public class IEC61850Config {
private static final ThreadLocal<List<ExcelConfig>> CURRENT_CONFIG = new ThreadLocal<>();
private static final ThreadLocal<List<ExcelConfig>> CURRENT_CONFIG = new ThreadLocal<List<ExcelConfig>>();
@PostConstruct
public void setExcelConfig(){
@ -33,7 +33,7 @@ public class IEC61850Config {
InputStream inputStream = IEC61850Config.class.getClassLoader().getResourceAsStream("IEC61850.xlsx");
XSSFWorkbook wb = null;
XSSFSheet sheet = null; // 创建工作sheet
List<ExcelConfig> dataList = new ArrayList<>();
List<ExcelConfig> dataList = new ArrayList<ExcelConfig>();
try {
wb = ExcelUtil.getWorkbook(inputStream);
sheet = ExcelUtil.getFirstSheet(wb);
@ -140,7 +140,8 @@ public class IEC61850Config {
CURRENT_CONFIG.set(list);
}
for(ExcelConfig config:list){
String node1 = config.getName()+config.getConnectId()+config.getAddress()+config.getGgio()+"."+config.getAng();
float address = Float.valueOf(config.getAddress());
String node1 = config.getName()+config.getConnectId()+(int)address+config.getGgio()+"."+config.getAng();
if(ip.equals(config.getDeviceIp()) && node.equals(node1)){
return config;
}

2
device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/ModeUtil.java

@ -32,7 +32,7 @@ public class ModeUtil {
lds5000.setClentIp(eunm.getDeviceIp());
lds5000.setNode(node.getReference().toString());
lds5000.setFc(node.getFc().toString());
List<ModelNode> modelNodes=new ArrayList<>(node.getChildren());
List<ModelNode> modelNodes=new ArrayList<ModelNode>(node.getChildren());
for (ModelNode modelNode:modelNodes){
FcModelNode fcModelNode=(FcModelNode) modelNode;
if(fcModelNode.toString().contains("f:")){

2
device_iec61850clent/src/main/java/com/xr/iec61850clent/models/controller/AiInterfaceController.java

@ -62,7 +62,7 @@ public class AiInterfaceController {
meterReadingRecord.setMeterTypeId(meterConfig.getTypeId());
meterReadingRecord.setOwningInterval(meterConfig.getOwningInterval());
String meterType = MapUtil.getStr(map,"meter_type");
QueryWrapper<MeterGiveAlarm> queryWrapper=new QueryWrapper<>();
QueryWrapper<MeterGiveAlarm> queryWrapper=new QueryWrapper<MeterGiveAlarm>();
queryWrapper.eq("meter_id",meterId);
Integer meterT = null;
if(meterType.equals("floatocr")){//数值型

162
device_iec61850clent/src/main/java/com/xr/iec61850clent/models/entity/MeterConfig.java

@ -19,19 +19,9 @@ public class MeterConfig implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* ids5000表id
*/
private Integer ids5000Id;
/**
* 间隔类型 1 分钟 2 小时 3
*/
private Integer intervalType;
/**
* 电压等级(1安全电压2低压3高压4超高压5特高压)
*/
@ -52,16 +42,6 @@ public class MeterConfig implements Serializable {
*/
private String deviceName;
/**
* y坐标
*/
private Double locationY;
/**
* x坐标
*/
private Double locationX;
/**
* 设备类型
*/
@ -82,15 +62,11 @@ public class MeterConfig implements Serializable {
*/
private Integer cameraId;
/**
* 告警最小值
*/
private Double warningMax;
@TableField(exist = false)
private String cameraType;
/**
* 告警最大值
*/
private Double warningMin;
@TableField(exist = false)
private String cameraName;
/**
* 表计类型配置编号
@ -108,15 +84,30 @@ public class MeterConfig implements Serializable {
private Date firstTime;
/**
* 焦距类型 1定焦2变焦
* 算法类型 1usb2mipi 3内部算法
*/
private String focalLength;
private String algorithmType;
/**
* 执行间隔时间
*/
private Integer intervalTime;
/**
* 执行间隔类型 1分钟 2 小时 3
*/
private Integer intervalType;
/**
* 告警最大值
*/
private Double warningMax;
/**
* 告警最小值
*/
private Double warningMin;
/**
* 焦距数量
*/
@ -133,9 +124,9 @@ public class MeterConfig implements Serializable {
private String remarks;
/**
* 61850读数模型
* 初始化状态
*/
private String iec61850mx;
private String initStatus;
/**
* 创建人
@ -152,11 +143,116 @@ public class MeterConfig implements Serializable {
*/
private String updateUser;
private int isJz;
private String jzVal;
/**
* 修改时间
*/
private Date updateTime;
@TableField(exist = false)
private String ip;
@TableField(exist = false)
private String typeAlias;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
MeterConfig other = (MeterConfig) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getVoltageClass() == null ? other.getVoltageClass() == null : this.getVoltageClass().equals(other.getVoltageClass()))
&& (this.getOwningInterval() == null ? other.getOwningInterval() == null : this.getOwningInterval().equals(other.getOwningInterval()))
&& (this.getIdentificationInterval() == null ? other.getIdentificationInterval() == null : this.getIdentificationInterval().equals(other.getIdentificationInterval()))
&& (this.getDeviceName() == null ? other.getDeviceName() == null : this.getDeviceName().equals(other.getDeviceName()))
&& (this.getDeviceType() == null ? other.getDeviceType() == null : this.getDeviceType().equals(other.getDeviceType()))
&& (this.getMeterCode() == null ? other.getMeterCode() == null : this.getMeterCode().equals(other.getMeterCode()))
&& (this.getMeterName() == null ? other.getMeterName() == null : this.getMeterName().equals(other.getMeterName()))
&& (this.getCameraId() == null ? other.getCameraId() == null : this.getCameraId().equals(other.getCameraId()))
&& (this.getTypeId() == null ? other.getTypeId() == null : this.getTypeId().equals(other.getTypeId()))
&& (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
&& (this.getFirstTime() == null ? other.getFirstTime() == null : this.getFirstTime().equals(other.getFirstTime()))
&& (this.getAlgorithmType() == null ? other.getAlgorithmType() == null : this.getAlgorithmType().equals(other.getAlgorithmType()))
&& (this.getIntervalTime() == null ? other.getIntervalTime() == null : this.getIntervalTime().equals(other.getIntervalTime()))
&& (this.getFocalNumber() == null ? other.getFocalNumber() == null : this.getFocalNumber().equals(other.getFocalNumber()))
&& (this.getParameterConfig() == null ? other.getParameterConfig() == null : this.getParameterConfig().equals(other.getParameterConfig()))
&& (this.getRemarks() == null ? other.getRemarks() == null : this.getRemarks().equals(other.getRemarks()))
&& (this.getCreateUser() == null ? other.getCreateUser() == null : this.getCreateUser().equals(other.getCreateUser()))
&& (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
&& (this.getUpdateUser() == null ? other.getUpdateUser() == null : this.getUpdateUser().equals(other.getUpdateUser()))
&& (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getVoltageClass() == null) ? 0 : getVoltageClass().hashCode());
result = prime * result + ((getOwningInterval() == null) ? 0 : getOwningInterval().hashCode());
result = prime * result + ((getIdentificationInterval() == null) ? 0 : getIdentificationInterval().hashCode());
result = prime * result + ((getDeviceName() == null) ? 0 : getDeviceName().hashCode());
result = prime * result + ((getDeviceType() == null) ? 0 : getDeviceType().hashCode());
result = prime * result + ((getMeterCode() == null) ? 0 : getMeterCode().hashCode());
result = prime * result + ((getMeterName() == null) ? 0 : getMeterName().hashCode());
result = prime * result + ((getCameraId() == null) ? 0 : getCameraId().hashCode());
result = prime * result + ((getTypeId() == null) ? 0 : getTypeId().hashCode());
result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
result = prime * result + ((getFirstTime() == null) ? 0 : getFirstTime().hashCode());
result = prime * result + ((getAlgorithmType() == null) ? 0 : getAlgorithmType().hashCode());
result = prime * result + ((getIntervalTime() == null) ? 0 : getIntervalTime().hashCode());
result = prime * result + ((getFocalNumber() == null) ? 0 : getFocalNumber().hashCode());
result = prime * result + ((getParameterConfig() == null) ? 0 : getParameterConfig().hashCode());
result = prime * result + ((getRemarks() == null) ? 0 : getRemarks().hashCode());
result = prime * result + ((getCreateUser() == null) ? 0 : getCreateUser().hashCode());
result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
result = prime * result + ((getUpdateUser() == null) ? 0 : getUpdateUser().hashCode());
result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
return result;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", voltageClass=").append(voltageClass);
sb.append(", owningInterval=").append(owningInterval);
sb.append(", identificationInterval=").append(identificationInterval);
sb.append(", deviceName=").append(deviceName);
sb.append(", deviceType=").append(deviceType);
sb.append(", meterCode=").append(meterCode);
sb.append(", meterName=").append(meterName);
sb.append(", cameraId=").append(cameraId);
sb.append(", typeId=").append(typeId);
sb.append(", status=").append(status);
sb.append(", firstTime=").append(firstTime);
sb.append(", algorithmType=").append(algorithmType);
sb.append(", intervalTime=").append(intervalTime);
sb.append(", focalNumber=").append(focalNumber);
sb.append(", parameterConfig=").append(parameterConfig);
sb.append(", remarks=").append(remarks);
sb.append(", createUser=").append(createUser);
sb.append(", createTime=").append(createTime);
sb.append(", updateUser=").append(updateUser);
sb.append(", updateTime=").append(updateTime);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}

88
device_iec61850clent/src/main/java/com/xr/iec61850clent/models/iec61850run/Iec61850clent.java

@ -130,17 +130,12 @@ public class Iec61850clent extends Thread{
MeterConfigService meterConfigService=SpringUtils.getBean(MeterConfigService.class);
MeterReadingRecordService meterReadingRecordService=SpringUtils.getBean(MeterReadingRecordService.class);
MeterTypeService meterTypeService=SpringUtils.getBean(MeterTypeService.class);
int i=0;
while (true){
try {
if(i>0){
sleep(2*60*1000);
association.getAllDataValues();
System.out.println("更新模型成功!");
System.out.println(Arrays.toString(new Collection[]{serverModel.getDataSets()}));
}else{
i++;
}
DataSet dSet = serverModel.getDataSet("TEMPLATELD0/LLN0.dsMeasureInfo1");
association.getDataSetValues(dSet);
System.out.println("更新模型成功!");
System.out.println(Arrays.toString(new Collection[]{serverModel.getDataSets()}));
List<DataSet> dataSets=new ArrayList<>(serverModel.getDataSets());
for (DataSet dataSet:dataSets){
List<FcModelNode> fas=dataSet.getMembers();
@ -154,12 +149,6 @@ public class Iec61850clent extends Thread{
queryWrapper.eq("clent_ip",host);
Lds5000 lds=lds5000Service.getOne(queryWrapper);
if (lds != null) {
QueryWrapper<Lds5000> q=new QueryWrapper<>();
q.eq("f",lds5000.getF());
q.eq("node",lds5000.getNode());
q.eq("clent_ip",host);
Lds5000 l=lds5000Service.getOne(q);
if(l==null){//值发生改变
lds.setUpdateTime(new Date());
lds.setF(lds5000.getF());
lds5000Service.updateById(lds);
@ -172,7 +161,47 @@ public class Iec61850clent extends Thread{
meterReadingRecord.setMeterId(config.getId());
meterReadingRecord.setReadingType(lds5000.getType());
if(node.getFc().name().equals("MX")){
meterReadingRecord.setReadingValue(lds5000.getF());
String value = "0";
float f = Float.valueOf(lds5000.getF());
if(config.getTypeId() == 3 || config.getTypeId() == 5 || config.getTypeId() == 7){//油位计,保留2位小数
value = String.format("%.2f", f);
}
if(config.getTypeId() == 4 || config.getTypeId() == 11){//开关计数器
//处理为整数
int s = (int) f;
value = s+"";
}
if(config.getTypeId() == 8){//档位数据处理
//处理为整数
int s = (int) f;
if(s>7){
int t = s-7;
if(t == 9){
value = "9A";
}
if(t == 10){
value = "9B";
}
if(t == 11){
value = "9C";
}
if(t>11){
value = t-2+"";
}
}else {
value=s+"";
}
}
if(config.getTypeId() == 10){//放电计数器
int s = Math.round(f);
if(s>=10){
value = 0+"";
}
}
if(config.getIsJz() == 1){
value = config.getJzVal();
}
meterReadingRecord.setReadingValue(value);
}else{
meterReadingRecord.setReadingValue(lds5000.getStVal());
}
@ -183,9 +212,10 @@ public class Iec61850clent extends Thread{
meterReadingRecord.setCreateTime(new Date());
meterReadingRecord.setMeterTypeId(config.getTypeId());
meterReadingRecord.setOwningInterval(config.getOwningInterval());
meterReadingRecordService.save(meterReadingRecord);
abnormalReadingJudgment(meterReadingRecord);
}
if(config.getIsJz()!=1){
meterReadingRecordService.save(meterReadingRecord);
}
//abnormalReadingJudgment(meterReadingRecord);
}
}else{
lds5000.setCreateTime(new Date());
@ -193,6 +223,26 @@ public class Iec61850clent extends Thread{
}
}
}
QueryWrapper<MeterConfig> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("is_jz",1);
List<MeterConfig> meterConfigs=meterConfigService.list(queryWrapper);
for (MeterConfig config:meterConfigs){
MeterReadingRecord meterReadingRecord=new MeterReadingRecord();
meterReadingRecord.setMeterId(config.getId());
meterReadingRecord.setReadingType(config.getTypeId());
meterReadingRecord.setReadingTime(new Date());
meterReadingRecord.setReadingType(2);
meterReadingRecord.setReadingValue(config.getJzVal());
meterReadingRecord.setMeterTypeName("");
meterReadingRecord.setMeterCode(config.getMeterCode());
meterReadingRecord.setReadingTime(new Date());
meterReadingRecord.setCreateUser("SYSTEM");
meterReadingRecord.setCreateTime(new Date());
meterReadingRecord.setMeterTypeId(config.getTypeId());
meterReadingRecord.setOwningInterval(config.getOwningInterval());
meterReadingRecordService.save(meterReadingRecord);
}
sleep(10*60*1000);
} catch (Exception e) {
e.printStackTrace();
}

BIN
device_iec61850clent/src/main/resources/IEC61850.xlsx

Binary file not shown.

26
device_iec61850clent/src/main/resources/application-prod.yml

@ -11,39 +11,21 @@ spring:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.93:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.93:3306/image_analysis_zs?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/image_analysis?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
db3:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.93:3306/modbusrtu?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/modbusrtu?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
# db1:
# driver-class-name: com.mysql.jdbc.Driver
# type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:mysql://localhost:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
# username: root
# password: 123456
# db2:
# driver-class-name: com.mysql.jdbc.Driver
# type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:mysql://localhost:3306/image_analysis?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
# username: root
# password: 123456
# db3:
# driver-class-name: com.mysql.jdbc.Driver
# type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:mysql://localhost:3306/modbusrtu?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
# username: root
# password: 123456
#Hikari连接池配置
hikari:
#池中维护的最小空闲连接数
@ -63,7 +45,7 @@ spring:
#验证该连接是否是有效的查询语句
connection-test-query: select 1 from dual
mybatis-plus:
mapper-locations: classpath:mappers/*Mapper.xml
mapper-locations: classpath:mappers/**/*Mapper.xml
type-aliases-package: com.xr.iec61850clent
# 在查询语句的是否,对Map或者是entity进行映射赋值的时候null也进行映射。默认false,不进行映射
configuration:

8
device_iec61850server/pom.xml

@ -118,6 +118,14 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>

10
device_udpclent/pom.xml

@ -162,7 +162,15 @@
</execution>
</executions>
</plugin>
</plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

57
device_udpclent/src/main/java/com/xr/device_udpclent/common/UdpClientConfig.java

@ -1,57 +0,0 @@
package com.xr.device_udpclent.common;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.util.CharsetUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetSocketAddress;
@Configuration
public class UdpClientConfig {
@Value("${udp.server.host}")
private String serverHost;
@Value("${udp.server.port}")
private int serverPort;
@Bean
public DatagramChannel udpChannel() {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new SimpleChannelInboundHandler<DatagramPacket>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
// 处理接收到的数据
String data = msg.content().toString(CharsetUtil.UTF_8);
System.out.println("Received data: " + data);
}
});
return (DatagramChannel) bootstrap.bind(0).sync().channel();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Bean
public InetSocketAddress udpServerAddress() {
return new InetSocketAddress(serverHost, serverPort);
}
}

52
device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/EnumUtil.java

@ -0,0 +1,52 @@
package com.xr.device_udpclent.common.utils;
import io.netty.buffer.ByteBuf;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
/**
* @Classname EnumUtil
* @Description TODO
* @Author Created by gaoby
* @Date 2023/3/8 16:28 下午
* @Version 1.0
*/
public class EnumUtil {
private static Map<Class, Object> map = new ConcurrentHashMap<>();
/**
* 根据条件获取枚举对象
*
* @param className 枚举类
* @param predicate 筛选条件
* @param <T>
* @return
*/
public static <T> Optional<T> getEnumObject(Class<T> className, Predicate<T> predicate) {
if (!className.isEnum()) {
return null;
}
Object obj = map.get(className);
T[] ts = null;
if (obj == null) {
ts = className.getEnumConstants();
map.put(className, ts);
} else {
ts = (T[]) obj;
}
return Arrays.stream(ts).filter(predicate).findAny();
}
public static String byteBufTo16Str(ByteBuf byteBuf){
StringBuilder sb = new StringBuilder();
for (int i = byteBuf.readerIndex(); i < byteBuf.writerIndex(); i++) {
sb.append(String.format("%02X", byteBuf.getByte(i))+" ");
}
return sb.toString();
}
}

21
device_udpclent/src/main/java/com/xr/device_udpclent/models/controller/UdpClentController.java

@ -1,21 +0,0 @@
package com.xr.device_udpclent.models.controller;
import com.xr.device_udpclent.models.service.UdpClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("udp")
public class UdpClentController {
@Autowired
private UdpClientService udpClientService;
@GetMapping("/sendData")
public void sendData(String data) {
udpClientService.sendData(data);
}
}

78
device_udpclent/src/main/java/com/xr/device_udpclent/models/scheduled/UdpClentScheduled.java

@ -2,14 +2,21 @@ package com.xr.device_udpclent.models.scheduled;
import cn.hutool.extra.spring.SpringUtil;
import com.xr.device_udpclent.common.config.udp.UdbConfig;
import com.xr.device_udpclent.common.utils.EnumUtil;
import com.xr.device_udpclent.models.entity.MeterReadingRecord;
import com.xr.device_udpclent.models.service.MeterReadingRecordService;
import com.xr.device_udpclent.models.service.UdpClientService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
@Component
@ -24,15 +31,80 @@ public class UdpClentScheduled {
@Scheduled(cron = "0 0/3 * * * ?")
//定时发送监测数据
public void udpTask(){
public void udpTask() throws UnsupportedEncodingException, InterruptedException {
if(meterReadingRecordService == null){
meterReadingRecordService = SpringUtil.getBean(MeterReadingRecordService.class);
}
List<MeterReadingRecord> list = meterReadingRecordService.selectMaxReading();
for (MeterReadingRecord record:list){
String writeValue = UdbConfig.getTestMsg(record);
udpClientService.sendData(writeValue);
ByteBuf buf = Unpooled.buffer();
ByteBuf checksumBuffer = Unpooled.buffer(Long.BYTES);
buf.writeBytes(new byte[]{(byte) 0xEB, (byte) 0x90,(byte) 0xEB, (byte) 0x90,(byte)0x55});
buf.writeShortLE(3);
buf.writeShort(record.getMeterId());
buf.writeByte(2);
String s="在线监测";
byte [] sx=s.getBytes("GB2312");
buf.writeByte(sx.length);
buf.writeBytes(sx);
byte [] sz = record.getReadingValue().getBytes("GB2312");
buf.writeByte(sz.length);
buf.writeBytes(sz);
buf.writeBytes(generateCP56Time2a());
// 计算要校验的部分的开始索引和结束索引
byte c = 0;
int startIndex = 5; // 从第6位开始,索引是5(因为索引从0开始)
int endIndex = buf.readableBytes() - 1; // 到倒数第二位结束
// 截取并处理指定范围内的字节
if (startIndex <= endIndex) {
// 临时存放截取的字节
byte[] slice = new byte[endIndex - startIndex + 1];
// 从ByteBuf中获取数据
buf.getBytes(startIndex, slice);
c=checksum8(slice);
// 更新Checksum对象
//checksum.update(slice, 0, slice.length);
}
buf.writeByte(c);
// 将checksumBuffer追加到buffer末尾
buf.writeBytes(checksumBuffer);
System.out.println(EnumUtil.byteBufTo16Str(buf));
udpClientService.sendData(buf);
Thread.sleep(100);
}
}
private byte[] generateCP56Time2a() {
Calendar calendar = Calendar.getInstance();
int milliseconds = calendar.get(Calendar.MILLISECOND);
int minute = calendar.get(Calendar.MINUTE);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH) + 1; // Calendar.MONTH is zero based
int year = calendar.get(Calendar.YEAR) % 100; // Last two digits of the year
byte[] cp56Time2a = new byte[7];
cp56Time2a[0] = (byte)(milliseconds & 0xFF);
cp56Time2a[1] = (byte)((milliseconds >> 8) & 0xFF);
cp56Time2a[2] = (byte)(minute & 0xFF);
cp56Time2a[3] = (byte)(hour & 0xFF);
cp56Time2a[4] = (byte)(dayOfMonth & 0xFF);
cp56Time2a[5] = (byte)(month & 0xFF);
cp56Time2a[6] = (byte)(year & 0xFF);
return cp56Time2a;
}
// 8位和校验实现
private byte checksum8(byte[] data) {
byte sum = 0;
for (byte b : data) {
sum += b&0xff;
}
return sum;
}
}

4
device_udpclent/src/main/java/com/xr/device_udpclent/models/service/UdpClientService.java

@ -1,7 +1,9 @@
package com.xr.device_udpclent.models.service;
import io.netty.buffer.ByteBuf;
public interface UdpClientService {
void sendData(String data);
void sendData(ByteBuf byteBuf);
}

9
device_udpclent/src/main/java/com/xr/device_udpclent/models/service/impl/UdpClientServiceImpl.java

@ -3,6 +3,7 @@ package com.xr.device_udpclent.models.service.impl;
import com.xr.device_udpclent.models.entity.SendUdpLog;
import com.xr.device_udpclent.models.service.SendUdpLogService;
import com.xr.device_udpclent.models.service.UdpClientService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.DatagramPacket;
@ -26,14 +27,14 @@ public class UdpClientServiceImpl implements UdpClientService {
private SendUdpLogService sendUdpLogService;
@Override
public void sendData(String data) {
public void sendData(ByteBuf byteBuf) {
SendUdpLog sendUdbLog=new SendUdpLog();
sendUdbLog.setRequestMsg(data);
sendUdbLog.setRequestMsg(byteBuf.toString());
sendUdbLog.setRequestTime(new Date());
sendUdbLog.setMessageId(data.split("\t")[0]);
sendUdbLog.setMessageId(new Date().getTime()+"");
try {
udpChannel.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer(data, CharsetUtil.UTF_8), udpServerAddress)).sync();
Unpooled.copiedBuffer(byteBuf), udpServerAddress)).sync();
sendUdbLog.setRequestStatus("0");
} catch (Exception e) {
sendUdbLog.setRequestStatus("1");

2
device_udpclent/src/main/resources/application-dev.yml

@ -88,7 +88,7 @@ logging:
logging: debug
udp:
server:
host: localhost
host: 192.168.1.100
port: 9300
upLoad:
path: D:\\images\\images\\

50
device_udpclent/src/main/resources/application-prod.yml

@ -1,5 +1,5 @@
server:
port: 8081
port: 8091
servlet:
context-path: /api
spring:
@ -11,13 +11,13 @@ spring:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.252:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/device_system?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://192.168.1.252:3306/image_analysis_zs?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
url: jdbc:mysql://192.168.1.94:3306/image_analysis?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456
#Hikari连接池配置
@ -43,18 +43,30 @@ spring:
timeout-seconds: 1000
config:
enabled: false
# redis 相关
redis:
host: ${REDIS_URL:localhost}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:111111}
timeout: 10000
jedis:
pool:
max-active: 1000
max-wait: -1ms
max-idle: 10
min-idle: 5
stream:
kafka:
binder:
brokers: localhost:9092 #Kafka的消息中间件服务器
zk-nodes: localhost:2181 #Zookeeper的节点,如果集群,后面加,号分隔
auto-create-topics: false #如果设置为false,就不会自动创建Topic 有可能你Topic还没创建就直接调用了。
# kafka:
# bootstrap-servers: localhost:9092
# consumer:
# group-id: ai-consumer-group
#kafka:
# topic: ai-topic
# # redis 相关
# redis:
# host: ${REDIS_URL:localhost}
# port: ${REDIS_PORT:6379}
# password: ${REDIS_PWD:111111}
# timeout: 10000
# jedis:
# pool:
# max-active: 1000
# max-wait: -1ms
# max-idle: 10
# min-idle: 5
mybatis-plus:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.xr.device_udpclent
@ -76,14 +88,14 @@ logging:
logging: debug
udp:
server:
host: localhost
host: 192.168.1.100
port: 9300
python:
path: C:\\Users\\admin\\Anaconda3\\envs\\myconda310\\python.exe
modelPath: D:\\smartGrid\\smartGrid\\models
upLoad:
path: D:\\images\\images\\
url: http://localhost:85/upload/
python:
path: C:\\Users\\admin\\Anaconda3\\envs\\myconda310\\python.exe
modelPath: D:\\smartGrid\\smartGrid\\models
eureka:
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}

2
device_udpclent/src/main/resources/application.yml

@ -1,6 +1,6 @@
spring:
profiles:
active: dev #开发环境
active: prod #开发环境
# active: test #测试环境5
#active: prod #生产环境
application:

51
device_udpclent/src/main/resources/logback.xml

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home" />
<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/udpClient.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.mybatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</configuration>

6
device_udpclent/src/main/resources/mapper/MeterReadingRecordMapper.xml

@ -30,8 +30,10 @@
</sql>
<select id="selectMaxReading" resultMap="BaseResultMap">
select a.meter_id,a.reading_time,b.reading_value from (select id,meter_id,max(reading_time) reading_time from meter_abnormal_record
GROUP BY meter_id) a LEFT JOIN (select id,reading_value from meter_abnormal_record) b
select a.meter_id,b.reading_time,b.reading_value
from (select meter_id,max(id) id
from meter_reading_record GROUP BY meter_id)
a LEFT JOIN (select id,reading_time,reading_value from meter_reading_record) b
on a.id = b.id LEFT JOIN meter_config c on a.meter_id=c.id where c.status=1
</select>
</mapper>

Loading…
Cancel
Save