diff --git a/device_cars/pom.xml b/device_cars/pom.xml index 530a228..ac4909f 100644 --- a/device_cars/pom.xml +++ b/device_cars/pom.xml @@ -413,6 +413,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + diff --git a/device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java b/device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java index 9efbac5..7f368bf 100644 --- a/device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java +++ b/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 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(""); + //buffer.append(new Date().getTime()+ new Random().nextInt(9000)+1000).append("\t"); + buffer.append(""); buffer.append(""); + 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(""); + System.out.println(buffer.toString()); return buffer.toString(); } diff --git a/device_cars/src/main/java/com/xr/device_car/config/utils/EnumUtil.java b/device_cars/src/main/java/com/xr/device_car/config/utils/EnumUtil.java index 568b5ea..e831f80 100644 --- a/device_cars/src/main/java/com/xr/device_car/config/utils/EnumUtil.java +++ b/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(); + } } diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterConfigController.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterConfigController.java index a370df7..181ddd0 100644 --- a/device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterConfigController.java +++ b/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 query=new QueryWrapper<>(); query.eq("status",1); List 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 getConfigList(List list,int min,int max){ + List 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; + } + } diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/mapper/MeterReadingRecordMapper.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/mapper/MeterReadingRecordMapper.java index c226bf0..fe27af7 100644 --- a/device_cars/src/main/java/com/xr/device_car/modules/analysis/mapper/MeterReadingRecordMapper.java +++ b/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 { + void deleteToZt(); + + void deleteToLog(); + + } diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/scheduled/Task.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/scheduled/Task.java new file mode 100644 index 0000000..91e0692 --- /dev/null +++ b/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(); + } + +} diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/MeterReadingRecordService.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/MeterReadingRecordService.java index 17892c0..19a5cba 100644 --- a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/MeterReadingRecordService.java +++ b/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 { + void deleteToZt(); + void deleteToLog(); + } diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/UdpClientService.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/UdpClientService.java index 2019a7b..aac09a5 100644 --- a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/UdpClientService.java +++ b/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); } diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/MeterReadingRecordServiceImpl.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/MeterReadingRecordServiceImpl.java index a4be538..bbd3a09 100644 --- a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/MeterReadingRecordServiceImpl.java +++ b/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 implements MeterReadingRecordService{ + @Override + public void deleteToZt() { + ((MeterReadingRecordMapper)this.baseMapper).deleteToZt(); + } + + @Override + public void deleteToLog() { + ((MeterReadingRecordMapper)this.baseMapper).deleteToLog(); + } } diff --git a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/UdpClientServiceImpl.java b/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/UdpClientServiceImpl.java index 3a99836..ddaabed 100644 --- a/device_cars/src/main/java/com/xr/device_car/modules/analysis/service/impl/UdpClientServiceImpl.java +++ b/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"); diff --git a/device_cars/src/main/resources/application-dev.yml b/device_cars/src/main/resources/application-dev.yml index 6788324..3aa2509 100644 --- a/device_cars/src/main/resources/application-dev.yml +++ b/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 \ No newline at end of file diff --git a/device_cars/src/main/resources/application-prod.yml b/device_cars/src/main/resources/application-prod.yml index c805c60..9ba8158 100644 --- a/device_cars/src/main/resources/application-prod.yml +++ b/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 \ No newline at end of file + 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 \ No newline at end of file diff --git a/device_cars/src/main/resources/application.yml b/device_cars/src/main/resources/application.yml index 8d7945b..c854e41 100644 --- a/device_cars/src/main/resources/application.yml +++ b/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 diff --git a/device_cars/src/main/resources/modules/analysis/MeterReadingRecordMapper.xml b/device_cars/src/main/resources/modules/analysis/MeterReadingRecordMapper.xml index d3d7e83..98d50db 100644 --- a/device_cars/src/main/resources/modules/analysis/MeterReadingRecordMapper.xml +++ b/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 + + + delete from meter_reading_record WHERE DATE(create_time) = DATE(NOW() - INTERVAL 1 DAY); + + + + delete from send_udp_log WHERE DATE(request_time) = DATE(NOW() - INTERVAL 1 DAY); + diff --git a/device_iec104/pom.xml b/device_iec104/pom.xml index f092840..886e829 100644 --- a/device_iec104/pom.xml +++ b/device_iec104/pom.xml @@ -97,6 +97,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 6 + 6 + + diff --git a/device_iec61850clent/pom.xml b/device_iec61850clent/pom.xml index 26d7703..479c8d6 100644 --- a/device_iec61850clent/pom.xml +++ b/device_iec61850clent/pom.xml @@ -13,7 +13,7 @@ device_iec61850clent Demo project for Spring Boot - 8 + 1.8 @@ -123,6 +123,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + diff --git a/device_iec61850clent/src/main/java/com/xr/iec61850clent/Iec61850ClentApplication.java b/device_iec61850clent/src/main/java/com/xr/iec61850clent/Iec61850ClentApplication.java index 242f3a8..9b0ff9b 100644 --- a/device_iec61850clent/src/main/java/com/xr/iec61850clent/Iec61850ClentApplication.java +++ b/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); diff --git a/device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/IEC61850Config.java b/device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/IEC61850Config.java index 0a6b804..925d529 100644 --- a/device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/IEC61850Config.java +++ b/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> CURRENT_CONFIG = new ThreadLocal<>(); + private static final ThreadLocal> CURRENT_CONFIG = new ThreadLocal>(); @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 dataList = new ArrayList<>(); + List dataList = new ArrayList(); 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; } diff --git a/device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/ModeUtil.java b/device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/ModeUtil.java index dffddc3..e1d309b 100644 --- a/device_iec61850clent/src/main/java/com/xr/iec61850clent/common/util/ModeUtil.java +++ b/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 modelNodes=new ArrayList<>(node.getChildren()); + List modelNodes=new ArrayList(node.getChildren()); for (ModelNode modelNode:modelNodes){ FcModelNode fcModelNode=(FcModelNode) modelNode; if(fcModelNode.toString().contains("f:")){ diff --git a/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/controller/AiInterfaceController.java b/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/controller/AiInterfaceController.java index 053715d..ddf20ed 100644 --- a/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/controller/AiInterfaceController.java +++ b/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 queryWrapper=new QueryWrapper<>(); + QueryWrapper queryWrapper=new QueryWrapper(); queryWrapper.eq("meter_id",meterId); Integer meterT = null; if(meterType.equals("floatocr")){//数值型 diff --git a/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/entity/MeterConfig.java b/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/entity/MeterConfig.java index 3126703..739a454 100644 --- a/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/entity/MeterConfig.java +++ b/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(); + } } \ No newline at end of file diff --git a/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/iec61850run/Iec61850clent.java b/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/iec61850run/Iec61850clent.java index 0b8496d..5e0ad9c 100644 --- a/device_iec61850clent/src/main/java/com/xr/iec61850clent/models/iec61850run/Iec61850clent.java +++ b/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 dataSets=new ArrayList<>(serverModel.getDataSets()); for (DataSet dataSet:dataSets){ List 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 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 queryWrapper=new QueryWrapper<>(); + queryWrapper.eq("is_jz",1); + List 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(); } diff --git a/device_iec61850clent/src/main/resources/IEC61850.xlsx b/device_iec61850clent/src/main/resources/IEC61850.xlsx index 90e4037..df2be4b 100644 Binary files a/device_iec61850clent/src/main/resources/IEC61850.xlsx and b/device_iec61850clent/src/main/resources/IEC61850.xlsx differ diff --git a/device_iec61850clent/src/main/resources/application-prod.yml b/device_iec61850clent/src/main/resources/application-prod.yml index 04106c4..351fd73 100644 --- a/device_iec61850clent/src/main/resources/application-prod.yml +++ b/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: diff --git a/device_iec61850server/pom.xml b/device_iec61850server/pom.xml index 5168b4f..060f077 100644 --- a/device_iec61850server/pom.xml +++ b/device_iec61850server/pom.xml @@ -118,6 +118,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 7 + 7 + + diff --git a/device_udpclent/pom.xml b/device_udpclent/pom.xml index 73f3db6..f9ce4bf 100644 --- a/device_udpclent/pom.xml +++ b/device_udpclent/pom.xml @@ -162,7 +162,15 @@ - + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + diff --git a/device_udpclent/src/main/java/com/xr/device_udpclent/common/UdpClientConfig.java b/device_udpclent/src/main/java/com/xr/device_udpclent/common/UdpClientConfig.java deleted file mode 100644 index 1890b46..0000000 --- a/device_udpclent/src/main/java/com/xr/device_udpclent/common/UdpClientConfig.java +++ /dev/null @@ -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() { - @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); - } - -} diff --git a/device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/EnumUtil.java b/device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/EnumUtil.java new file mode 100644 index 0000000..08b2716 --- /dev/null +++ b/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 map = new ConcurrentHashMap<>(); + + /** + * 根据条件获取枚举对象 + * + * @param className 枚举类 + * @param predicate 筛选条件 + * @param + * @return + */ + public static Optional getEnumObject(Class className, Predicate 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(); + } +} diff --git a/device_udpclent/src/main/java/com/xr/device_udpclent/models/controller/UdpClentController.java b/device_udpclent/src/main/java/com/xr/device_udpclent/models/controller/UdpClentController.java deleted file mode 100644 index 7bf3db0..0000000 --- a/device_udpclent/src/main/java/com/xr/device_udpclent/models/controller/UdpClentController.java +++ /dev/null @@ -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); - } - -} diff --git a/device_udpclent/src/main/java/com/xr/device_udpclent/models/scheduled/UdpClentScheduled.java b/device_udpclent/src/main/java/com/xr/device_udpclent/models/scheduled/UdpClentScheduled.java index a13934b..98424e7 100644 --- a/device_udpclent/src/main/java/com/xr/device_udpclent/models/scheduled/UdpClentScheduled.java +++ b/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 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; } } diff --git a/device_udpclent/src/main/java/com/xr/device_udpclent/models/service/UdpClientService.java b/device_udpclent/src/main/java/com/xr/device_udpclent/models/service/UdpClientService.java index b6ceb15..c62e78c 100644 --- a/device_udpclent/src/main/java/com/xr/device_udpclent/models/service/UdpClientService.java +++ b/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); } diff --git a/device_udpclent/src/main/java/com/xr/device_udpclent/models/service/impl/UdpClientServiceImpl.java b/device_udpclent/src/main/java/com/xr/device_udpclent/models/service/impl/UdpClientServiceImpl.java index 9b4ac2e..d360045 100644 --- a/device_udpclent/src/main/java/com/xr/device_udpclent/models/service/impl/UdpClientServiceImpl.java +++ b/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"); diff --git a/device_udpclent/src/main/resources/application-dev.yml b/device_udpclent/src/main/resources/application-dev.yml index 0e4a957..95a2024 100644 --- a/device_udpclent/src/main/resources/application-dev.yml +++ b/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\\ diff --git a/device_udpclent/src/main/resources/application-prod.yml b/device_udpclent/src/main/resources/application-prod.yml index bfe21b6..63591d8 100644 --- a/device_udpclent/src/main/resources/application-prod.yml +++ b/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} diff --git a/device_udpclent/src/main/resources/application.yml b/device_udpclent/src/main/resources/application.yml index 9297701..0be90c8 100644 --- a/device_udpclent/src/main/resources/application.yml +++ b/device_udpclent/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: dev #开发环境 + active: prod #开发环境 # active: test #测试环境5 #active: prod #生产环境 application: diff --git a/device_udpclent/src/main/resources/logback.xml b/device_udpclent/src/main/resources/logback.xml new file mode 100644 index 0000000..8c2587c --- /dev/null +++ b/device_udpclent/src/main/resources/logback.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + + ${LOG_HOME}/udpClient.log.%d{yyyy-MM-dd}.log + + 30 + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + 10MB + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/device_udpclent/src/main/resources/mapper/MeterReadingRecordMapper.xml b/device_udpclent/src/main/resources/mapper/MeterReadingRecordMapper.xml index 3ecbaf2..de8091f 100644 --- a/device_udpclent/src/main/resources/mapper/MeterReadingRecordMapper.xml +++ b/device_udpclent/src/main/resources/mapper/MeterReadingRecordMapper.xml @@ -30,8 +30,10 @@