pipIrr-platform/pipIrr-common/pom.xml
@@ -132,6 +132,23 @@ <artifactId>quartz</artifactId> </dependency> <!-- 获得系统信息 --> <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.12.1</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.12.1</version> </dependency> <!-- Hutool是一个小而全的Java工具类库(https://github.com/dromara/hutool) --> <dependency> <groupId>cn.hutool</groupId> pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/CodeV1_0_1.java
@@ -39,10 +39,10 @@ public static final String cd_95 = "95" ;//复位终端参数和状态(未实现) public static final String cd_97 = "97" ;//APP远程开阀 public static final String cd_98 = "98" ;//APP远程关阀 public static final String cd_99 = "99" ;//定时关阀开阀 public static final String cd_A0 = "A0" ;//定量关阀开阀 public static final String cd_A1 = "A1" ;//定时关阀计划开阀 public static final String cd_A2 = "A2" ;//定量关阀计划开阀 public static final String cd_99 = "99" ;//定时关阀式开阀 public static final String cd_A0 = "A0" ;//定量关阀式开阀 public static final String cd_A1 = "A1" ;//定时关阀式计划开阀 public static final String cd_A2 = "A2" ;//定量关阀式计划开阀 public static final String cd_B0 = "B0" ;//查询实时数据(未实现) public static final String cd_C0 = "C0" ;//遥测站整点上报实时数据 ok @@ -84,10 +84,10 @@ (code.equals(cd_95) ? "复位终端参数和状态" : (code.equals(cd_97) ? "APP远程开阀" : (code.equals(cd_98) ? "APP远程关阀" : (code.equals(cd_99) ? "定时关阀开阀" : (code.equals(cd_A0) ? "定量关阀开阀" : (code.equals(cd_A1) ? "定时关阀计划开阀" : (code.equals(cd_A2) ? "定量关阀计划开阀" : (code.equals(cd_99) ? "定时关阀式开阀" : (code.equals(cd_A0) ? "定量关阀式开阀" : (code.equals(cd_A1) ? "定时关阀式计划开阀" : (code.equals(cd_A2) ? "定量关阀式计划开阀" : (code.equals(cd_B0) ? "查询实时数据" : (code.equals(cd_C0) ? "自报(整点)实时数据" : ""))))))))))))))))))))))))))))))))))))))))))) ; pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataAlarmVo.java
@@ -26,13 +26,13 @@ txt += "蓄电池电压报警" ; } if(meter != null && meter == 1){ txt += ",流量计故障报警" ; txt += "、流量计故障报警" ; } if(valve != null && valve == 1){ txt += ",阀门故障报警" ; txt += "、阀门故障报警" ; } if(loss != null && loss == 1){ txt += ",漏损报警" ; txt += "、漏损报警" ; } return txt ; } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd99Vo.java
@@ -15,7 +15,7 @@ public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 定时关阀开阀应答:\n"); sb.append(" 定时关阀式开阀应答:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); @@ -29,7 +29,7 @@ public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("定时关阀开阀命令回复:\n"); sb.append("定时关阀式开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA0Vo.java
@@ -15,7 +15,7 @@ public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 定量关阀开阀应答:\n"); sb.append(" 定量关阀式开阀应答:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); @@ -29,7 +29,7 @@ public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("定量关阀开阀命令回复:\n"); sb.append("定量关阀式开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA1Vo.java
@@ -15,7 +15,7 @@ public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 定时关阀开阀应答:\n"); sb.append(" 定时关阀式开阀应答:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); @@ -29,7 +29,7 @@ public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("定时关阀开阀命令回复:\n"); sb.append("定时关阀式开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA2Vo.java
@@ -15,7 +15,7 @@ public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 定量关阀开阀应答:\n"); sb.append(" 定量关阀式开阀应答:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); @@ -29,7 +29,7 @@ public String comLog(){ StringBuilder sb = new StringBuilder() ; sb.append("定量关阀开阀命令回复:\n"); sb.append("定量关阀式开阀命令回复:\n"); sb.append(" 虚拟卡号:"); sb.append(cardNo); sb.append("\n"); pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/DoubleUtil.java
New file @@ -0,0 +1,103 @@ package com.dy.common.util; import java.math.BigDecimal; import java.math.RoundingMode; /** * @Author: liurunyu * @Date: 2024/8/2 13:58 * @Description 精准的double计算 */ public class DoubleUtil { /** 默认除法运算精度 */ private static final int DEF_DIV_SCALE = 10; /** 这个类不能实例化 */ private DoubleUtil() { } /** * 提供精确的加法运算。 * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); if (b1.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.doubleValue(); } return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = BigDecimal.ONE; return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/IPUtils.java
New file @@ -0,0 +1,341 @@ package com.dy.common.util; import jakarta.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 获取IP方法 * * @author liurunyu */ public class IPUtils { /** * 检查IP是否合法 * * @param ip * @return */ public static boolean ipValid(String ip) { String regex0 = "(2[0-4]\\d)" + "|(25[0-5])"; String regex1 = "1\\d{2}"; String regex2 = "[1-9]\\d"; String regex3 = "\\d"; String regex = "(" + regex0 + ")|(" + regex1 + ")|(" + regex2 + ")|(" + regex3 + ")"; regex = "(" + regex + ").(" + regex + ").(" + regex + ").(" + regex + ")"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(ip); return m.matches(); } /** * 获取本地ip 适合windows与linux * * @return */ public static String getLocalIP() { String localIP = "127.0.0.1"; try { Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces(); while (netInterfaces.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement(); InetAddress ip = ni.getInetAddresses().nextElement(); if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) { localIP = ip.getHostAddress(); break; } } } catch (Exception e) { try { localIP = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e1) { e1.printStackTrace(); } } return localIP; } /** * 获取客户端IP * * @param request 请求对象 * @return IP地址 */ public static String getClientIp(HttpServletRequest request) { if (request == null) { return "unknown"; } String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); } /** * 检查是否为内部IP地址 * * @param ip IP地址 * @return 结果 */ public static boolean internalIp(String ip) { byte[] addr = textToNumericFormatV4(ip); return internalIp(addr) || "127.0.0.1".equals(ip); } /** * 检查是否为内部IP地址 * * @param addr byte地址 * @return 结果 */ private static boolean internalIp(byte[] addr) { if (addr == null || addr.length < 2) { return true; } final byte b0 = addr[0]; final byte b1 = addr[1]; // 10.x.x.x/8 final byte SECTION_1 = 0x0A; // 172.16.x.x/12 final byte SECTION_2 = (byte) 0xAC; final byte SECTION_3 = (byte) 0x10; final byte SECTION_4 = (byte) 0x1F; // 192.168.x.x/16 final byte SECTION_5 = (byte) 0xC0; final byte SECTION_6 = (byte) 0xA8; switch (b0) { case SECTION_1: return true; case SECTION_2: if (b1 >= SECTION_3 && b1 <= SECTION_4) { return true; } case SECTION_5: switch (b1) { case SECTION_6: return true; } default: return false; } } /** * 把ip转化为整数 * * @param ip * @return */ public static long translateIP2Int(String ip) { String[] intArr = ip.split("\\."); int[] ipInt = new int[intArr.length]; for (int i = 0; i < intArr.length; i++) { ipInt[i] = Integer.parseInt(intArr[i]) ; } return ipInt[0] * 256 * 256 * 256 + +ipInt[1] * 256 * 256 + ipInt[2] * 256 + ipInt[3]; } /** * 将IPv4地址转换成字节 * * @param text IPv4地址 * @return byte 字节 */ public static byte[] textToNumericFormatV4(String text) { if (text.length() == 0) { return null; } byte[] bytes = new byte[4]; String[] elements = text.split("\\.", -1); try { long l; int i; switch (elements.length) { case 1: l = Long.parseLong(elements[0]); if ((l < 0L) || (l > 4294967295L)) { return null; } bytes[0] = (byte) (int) (l >> 24 & 0xFF); bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 2: l = Integer.parseInt(elements[0]); if ((l < 0L) || (l > 255L)) { return null; } bytes[0] = (byte) (int) (l & 0xFF); l = Integer.parseInt(elements[1]); if ((l < 0L) || (l > 16777215L)) { return null; } bytes[1] = (byte) (int) (l >> 16 & 0xFF); bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 3: for (i = 0; i < 2; ++i) { l = Integer.parseInt(elements[i]); if ((l < 0L) || (l > 255L)) { return null; } bytes[i] = (byte) (int) (l & 0xFF); } l = Integer.parseInt(elements[2]); if ((l < 0L) || (l > 65535L)) { return null; } bytes[2] = (byte) (int) (l >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 4: for (i = 0; i < 4; ++i) { l = Integer.parseInt(elements[i]); if ((l < 0L) || (l > 255L)) { return null; } bytes[i] = (byte) (int) (l & 0xFF); } break; default: return null; } } catch (NumberFormatException e) { return null; } return bytes; } /** * 获取IP地址 * * @return 本地IP地址 */ public static String getHostIp() { try { return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { } return "127.0.0.1"; } /** * 获取主机名 * * @return 本地主机名 */ public static String getHostName() { try { return InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { } return "未知"; } /** * 从多级反向代理中获得第一个非unknown IP地址 * * @param ip 获得的IP地址 * @return 第一个非unknown IP地址 */ public static String getMultistageReverseProxyIp(String ip) { // 多级反向代理检测 if (ip != null && ip.indexOf(",") > 0) { final String[] ips = ip.trim().split(","); for (String subIp : ips) { if (false == isUnknown(subIp)) { ip = subIp; break; } } } return ip; } /** * 检测给定字符串是否为未知,多用于检测HTTP请求相关 * * @param checkString 被检测的字符串 * @return 是否未知 */ public static boolean isUnknown(String checkString) { return isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); } private static boolean isBlank(final CharSequence cs) { final int strLen = length(cs); if (strLen == 0) { return true; } for (int i = 0; i < strLen; i++) { if (!Character.isWhitespace(cs.charAt(i))) { return false; } } return true; } public static int length(final CharSequence cs) { return cs == null ? 0 : cs.length(); } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysCpuUtil.java
New file @@ -0,0 +1,110 @@ package com.dy.common.util; import lombok.Data; import oshi.hardware.CentralProcessor; import oshi.util.Util; /** * @Author: liurunyu * @Date: 2024/8/2 11:17 * @Description */ public class SysCpuUtil { private static final int OSHI_WAIT_SECOND = 1000; /** * 得到CPU信息 */ public static CpuInfoVo info(CentralProcessor processor){ /** * 获取系统范围内的CPU负载计数器。返回一个包含八个元素的数组,表示在用户(0)、尼斯(1)、系统(2)、空闲(3)、 * IOwait(4)、硬件中断(IRQ)(5)、软件中断/DPC(SoftIRQ))(6)或窃取(7)状态下花费的毫秒数。使用 * {@link-shi.hardware.TickType#getIndex()}检索相应的索引。通过测量一个时间间 * 隔内滴答声之间的差异,可以计算出该时间间隔内的CPU负载。 * 在某些逻辑处理器数量可变的操作系统上,此阵列的大小可能会发生变化,并且可能与其他每处理器方法不一致。 * 请注意,虽然滴答计数器以毫秒为单位,但它们可能会随着(依赖于平台的)时钟滴答声以更大的增量前进。例如,默认 * 情况下,Windows时钟节拍为1/64秒(约15或16毫秒),Linux时钟节拍取决于分布和配置,但通常为1/100秒(10 * 毫秒)。 * Windows上没有Nice和IOWait信息,macOS上没有IOWait和IRQ信息,因此这些标记将始终为零。 * 要使用此方法计算总空闲时间,请同时包括Idle和IOWait标记。同样,应将IRQ、SoftIRQ和Steal标记添加到系统值 * 中以获得总和。系统计时还包括执行其他虚拟主机(窃取)的时间。 * * * @return一个由8个长值组成的数组,表示在User、Nice、System、Idle、IOwait、IRQ、SoftIRQ和Steal状态下花费的时间。 */ long[] prevTicks = processor.getSystemCpuLoadTicks(); Util.sleep(OSHI_WAIT_SECOND); long[] ticks = processor.getSystemCpuLoadTicks(); long nice = ticks[1] - prevTicks[1]; long irq = ticks[5] - prevTicks[5]; long softIrq = ticks[6] - prevTicks[6]; long steal = ticks[7] - prevTicks[7]; long cSys = ticks[2] - prevTicks[2]; long user = ticks[0] - prevTicks[0]; long ioWait = ticks[4] - prevTicks[4]; long idle = ticks[3] - prevTicks[3]; /* long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; long softIrq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; long ioWait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; */ long totalCpu = user + nice + cSys + idle + ioWait + irq + softIrq + steal; CpuInfoVo vo = new CpuInfoVo() ; vo.cores = processor.getLogicalProcessorCount() ; vo.totalRate = totalCpu ; vo.sysRate = cSys ; vo.userRate = user ; vo.waitRate = ioWait ; vo.freeRate = idle ; return vo ; } @Data public static class CpuInfoVo{ /** * 核心数 */ public int cores; /** * CPU总的使用率 */ public double totalRate; /** * CPU系统使用率 */ public double sysRate; /** * CPU用户使用率 */ public double userRate; /** * CPU当前等待率 */ public double waitRate; /** * CPU当前空闲率 */ public double freeRate; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" CPU信息:\n"); sb.append(" 核心数:" + cores + "\n"); sb.append(" CPU总的使用率:" + totalRate + "\n"); sb.append(" CPU系统使用率:" + sysRate + "\n"); sb.append(" CPU用户使用率:" + userRate + "\n"); sb.append(" CPU当前等待率:" + waitRate + "\n"); sb.append(" CPU当前空闲率:" + freeRate + "\n"); return sb.toString() ; } } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysFileSysUtil.java
New file @@ -0,0 +1,113 @@ package com.dy.common.util; import lombok.Data; import oshi.software.os.FileSystem; import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import java.util.LinkedList; import java.util.List; /** * @Author: liurunyu * @Date: 2024/8/2 13:54 * @Description */ public class SysFileSysUtil { /** * 磁盘信息 */ public static LinkedList<SysFile> info(OperatingSystem os) { LinkedList<SysFile> sysFiles = new LinkedList<SysFile>(); FileSystem fileSystem = os.getFileSystem(); List<OSFileStore> fsArray = fileSystem.getFileStores(); for (OSFileStore fs : fsArray) { long free = fs.getUsableSpace(); long total = fs.getTotalSpace(); long used = total - free; SysFile sysFile = new SysFile(); sysFile.setDirName(fs.getMount()); sysFile.setSysTypeName(fs.getType()); sysFile.setTypeName(fs.getName()); sysFile.setTotal(convertFileSize(total)); sysFile.setFree(convertFileSize(free)); sysFile.setUsed(convertFileSize(used)); sysFile.setUsage(DoubleUtil.mul(DoubleUtil.div(used, total, 4), 100)); sysFiles.add(sysFile); } return sysFiles ; } /** * 字节转换 * * @param size 字节大小 * @return 转换后值 */ public static String convertFileSize(long size) { long kb = 1024; long mb = kb * 1024; long gb = mb * 1024; if (size >= gb) { return String.format("%.1f GB", (float) size / gb); } else if (size >= mb) { float f = (float) size / mb; return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); } else if (size >= kb) { float f = (float) size / kb; return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); } else { return String.format("%d B", size); } } @Data public static class SysFile{ /** * 盘符路径 */ public String dirName; /** * 盘符类型 */ public String sysTypeName; /** * 文件类型 */ public String typeName; /** * 总大小 */ public String total; /** * 剩余大小 */ public String free; /** * 已经使用量 */ public String used; /** * 资源的使用率 */ public double usage; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 磁盘" + dirName + "\n"); sb.append(" 盘符类型:" + sysTypeName + "\n"); sb.append(" 文件类型:" + typeName + "\n"); sb.append(" 总大小:" + total + "\n"); sb.append(" 剩余大小:" + free + "\n"); sb.append(" 已经使用量:" + used + "\n"); sb.append(" 资源使用率:" + usage + "\n"); return sb.toString() ; } } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysJvmUtil.java
New file @@ -0,0 +1,78 @@ package com.dy.common.util; import lombok.Data; import java.net.UnknownHostException; import java.text.DecimalFormat; import java.util.Properties; /** * @Author: liurunyu * @Date: 2024/8/2 13:52 * @Description */ public class SysJvmUtil { /** Java虚拟机信息 */ public static JvmInfoVo info() throws UnknownHostException { JvmInfoVo vo = new JvmInfoVo() ; Properties props = System.getProperties(); vo.setTotal(toMbytes(Runtime.getRuntime().totalMemory())); vo.setMax(toMbytes(Runtime.getRuntime().maxMemory())); vo.setFree(toMbytes(Runtime.getRuntime().freeMemory())); vo.setVersion(props.getProperty("java.version")); vo.setHome(props.getProperty("java.home")); return vo ; } private static double toMbytes(double value){ return value/1000000.0 ; } @Data public static class JvmInfoVo { /** 当前JVM占用的内存总数(M) */ public double total; /** JVM最大可用内存总数(M) */ public double max; /** JVM空闲内存(M) */ public double free; /** JDK版本 */ public String version; /** JDK路径 */ public String home; public String toString(){ DecimalFormat df = new DecimalFormat("#.####"); // 设定格式 StringBuilder sb = new StringBuilder() ; sb.append(" JVM信息:\n"); sb.append(" JVM最大可用内存总数(M):" + df.format(max) + "\n"); sb.append(" JVM占用的内存数(M):" + df.format(total) + "\n"); sb.append(" JVM空闲内存数(M):" + df.format(free) + "\n"); sb.append(" JDK版本:" + version + "\n"); sb.append(" JDK路径:" + home + "\n"); return sb.toString() ; } } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysMemoryUtil.java
New file @@ -0,0 +1,58 @@ package com.dy.common.util; import lombok.Data; import oshi.hardware.GlobalMemory; import java.text.DecimalFormat; /** * @Author: liurunyu * @Date: 2024/8/2 13:42 * @Description */ public class SysMemoryUtil { /** * 内存信息 */ public static MemInfoVo info(GlobalMemory memory) { MemInfoVo vo = new MemInfoVo() ; vo.setTotal(toGbytes(memory.getTotal())); vo.setUsed(toGbytes(memory.getTotal() - memory.getAvailable())); vo.setFree(toGbytes(memory.getAvailable())); return vo ; } private static double toGbytes(double value){ return value/1000000000.0 ; } @Data public static class MemInfoVo { /** * 内存总量 */ public double total; /** * 已用内存 */ public double used; /** * 剩余内存 */ public double free; public String toString(){ DecimalFormat df = new DecimalFormat("#.####"); // 设定格式 StringBuilder sb = new StringBuilder() ; sb.append(" 内存信息:\n"); sb.append(" 内存总量(G):" + df.format(total) + "\n"); sb.append(" 已用内存(G):" + df.format(used) + "\n"); sb.append(" 剩余内存(G):" + df.format(free) + "\n"); return sb.toString() ; } } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysSysUtil.java
New file @@ -0,0 +1,68 @@ package com.dy.common.util; import lombok.Data; import java.util.Properties; /** * @Author: liurunyu * @Date: 2024/8/2 13:46 * @Description */ public class SysSysUtil { /** * 设置服务器信息 */ public static SysInfoVo info() { SysInfoVo vo = new SysInfoVo() ; Properties props = System.getProperties(); vo.setComputerName(IPUtils.getHostName()); vo.setComputerIp(IPUtils.getHostIp()); vo.setOsName(props.getProperty("os.name")); vo.setOsArch(props.getProperty("os.arch")); vo.setUserDir(props.getProperty("user.dir")); return vo ; } @Data public static class SysInfoVo{ /** * 服务器名称 */ public String computerName; /** * 服务器Ip */ public String computerIp; /** * 项目路径 */ public String userDir; /** * 操作系统 */ public String osName; /** * 系统架构 */ public String osArch; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append(" 系统信息:\n"); sb.append(" 主机名称:" + computerName + "\n"); sb.append(" 主机IP:" + computerIp + "\n"); sb.append(" 项目路径:" + userDir + "\n"); sb.append(" 操作系统:" + osName + "\n"); sb.append(" 系统架构:" + osArch + "\n"); return sb.toString() ; } } } pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysUtil.java
New file @@ -0,0 +1,64 @@ package com.dy.common.util; import lombok.Data; import oshi.SystemInfo; import oshi.hardware.HardwareAbstractionLayer; import java.util.LinkedList; /** * @Author: liurunyu * @Date: 2024/8/2 15:37 * @Description */ public class SysUtil { public static InfoVo info() throws Exception { InfoVo vo = new InfoVo() ; SystemInfo si = new SystemInfo(); HardwareAbstractionLayer hal = si.getHardware(); vo.cpuInfoVo = SysCpuUtil.info(hal.getProcessor()); vo.memInfoVo = SysMemoryUtil.info(hal.getMemory()); vo.sysInfoVo = SysSysUtil.info(); vo.jvmInfoVo = SysJvmUtil.info(); vo.sysFiles = SysFileSysUtil.info(si.getOperatingSystem()); return vo ; } @Data public static class InfoVo { public SysCpuUtil.CpuInfoVo cpuInfoVo ; public SysJvmUtil.JvmInfoVo jvmInfoVo ; public SysMemoryUtil.MemInfoVo memInfoVo ; public LinkedList<SysFileSysUtil.SysFile> sysFiles ; public SysSysUtil.SysInfoVo sysInfoVo ; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append("系统信息:\n"); sb.append(" " + (cpuInfoVo != null?cpuInfoVo.toString():"") + "\n"); sb.append(" " + (jvmInfoVo != null?jvmInfoVo.toString():"") + "\n"); sb.append(" " + (memInfoVo != null?memInfoVo.toString():"") + "\n"); if(sysFiles != null && sysFiles.size() > 0){ for(SysFileSysUtil.SysFile f : sysFiles){ sb.append(" " + f.toString() + "\n"); } } sb.append(" " + (sysInfoVo != null?sysInfoVo.toString():"") + "\n"); return sb.toString() ; } } public static void main(String[] args) throws Exception{ SysUtil.InfoVo vo = SysUtil.info() ; System.out.println(vo.toString()); } } pipIrr-platform/pipIrr-global/pom.xml
@@ -146,6 +146,12 @@ <groupId>com.aliyun</groupId> <artifactId>alibaba-dingtalk-service-sdk</artifactId> <version>2.0.0</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-codec</groupId> pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/pom.xml
@@ -130,6 +130,12 @@ <groupId>com.aliyun</groupId> <artifactId>alibaba-dingtalk-service-sdk</artifactId> <version>2.0.0</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-codec</groupId> @@ -137,6 +143,22 @@ <version>1.15</version> </dependency> <!-- 获得系统信息 --> <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.12.1</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.12.1</version> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -60,11 +60,11 @@ // try { // URL url = Server.class.getResource("/config/this.licence"); // if(!new Lnp(null).parese(url.getPath())){ // System.out.println("zhzc licence error!") ; // System.out.println("licence error!") ; // return ; // } // } catch (Exception e) { // System.out.println("zhzc licence error!") ; // System.out.println("licence error!") ; // return ; // } //Server sv = new Server(); @@ -295,7 +295,8 @@ ///////////////// //RMI模块 //RMI模块 暂时不应用 /* RmiConfigVo rmiVo = new RmiConfigVo(); rmiVo.enable = conf.getSetAttrBoolean(doc, "config.rmi", "enable", null, null) ; if(rmiVo.enable){ @@ -311,7 +312,7 @@ RmiSvUrl = "[ip]:" + rmiVo.port + "/" + rmiVo.context ; units.add(rmiUnit) ; } */ ///////////////// //RTU上行数据处理模块 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/MwInfoDeal.java
@@ -1,10 +1,13 @@ package com.dy.rtuMw.server.local.localProtocol; import com.dy.common.threadPool.TreadPoolFactory; import com.dy.common.util.*; import com.dy.rtuMw.server.forTcp.TcpDownCommandCache; import com.dy.rtuMw.server.forTcp.TcpSessionCache; import com.dy.rtuMw.server.rtuData.RtuDataCache; import com.dy.rtuMw.server.rtuData.TaskPool; import oshi.SystemInfo; import oshi.hardware.HardwareAbstractionLayer; /** * @Author: liurunyu @@ -13,7 +16,7 @@ */ public class MwInfoDeal { public MwInfoVo deal(){ public MwInfoVo deal() throws Exception{ MwInfoVo vo = new MwInfoVo() ; Integer[] info = TcpSessionCache.info() ; vo.rtuTotalConnect = info[0] ; @@ -39,6 +42,12 @@ vo.taskTreePoolTotalInstance = TaskPool.totalTasks() ; SystemInfo si = new SystemInfo(); HardwareAbstractionLayer hal = si.getHardware(); vo.memInfoVo = SysMemoryUtil.info(hal.getMemory()); vo.sysInfoVo = SysSysUtil.info(); vo.jvmInfoVo = SysJvmUtil.info(); return vo ; } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/MwInfoVo.java
@@ -1,6 +1,9 @@ package com.dy.rtuMw.server.local.localProtocol; import com.dy.common.util.*; import lombok.Data; import java.util.LinkedList; /** * @Author: liurunyu @@ -28,6 +31,10 @@ public Integer taskTreePoolTotalInstance = 0 ;//任务树池任务实例总数 public SysJvmUtil.JvmInfoVo jvmInfoVo ; public SysMemoryUtil.MemInfoVo memInfoVo ; public SysSysUtil.SysInfoVo sysInfoVo ; public String toString(){ StringBuilder sb = new StringBuilder() ; sb.append("通信中间件运行信息:\n"); @@ -45,6 +52,15 @@ sb.append(" 长线程池配置最大线程数:" + longMaxThread + "\n"); sb.append(" 长线程池配置最小线程数:" + longMinThread + "\n"); sb.append(" 任务树池任务实例总数:" + taskTreePoolTotalInstance + "\n"); if(jvmInfoVo != null){ sb.append(jvmInfoVo.toString()) ; } if(memInfoVo != null){ sb.append(memInfoVo.toString()) ; } if(sysInfoVo != null){ sb.append(sysInfoVo.toString()) ; } sb.append("\n"); return sb.toString() ; pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealAlarmStatus.java
@@ -103,9 +103,12 @@ sv.saveRmAlarmStateLast(po) ; }else{ if(po.sendMsTime == null){ if(alarmVo.hasAlarm()) { po.sendMsTime = System.currentTimeMillis() ; this.sendMessage(controller, alarmVo); } }else{ if(alarmVo.hasAlarm()){ Long now = System.currentTimeMillis() ; if(((now - po.sendMsTime) / (1000 * 60)) > ServerProperties.sendDingDingAlarmMsInterval){ //大于规定的间隔时间 @@ -113,6 +116,7 @@ this.sendMessage(controller, alarmVo); } } } po = this.update(controller, po, rtuDt, dV1_0_1, alarmVo, stateVo) ; sv.updateRmAlarmStateLast(po); } pipIrr-platform/pipIrr-mw/pom.xml
@@ -122,6 +122,22 @@ <artifactId>jdom2</artifactId> </dependency> <!-- 获得系统信息 --> <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.12.1</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.12.1</version> </dependency> <!-- 测试 --> <dependency>