1、完善代码;
2、增加查询系统CPU、内存、JVM、系统、磁盘等信息的工具类。
14个文件已修改
8个文件已添加
1088 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-common/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/CodeV1_0_1.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataAlarmVo.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCd99Vo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA0Vo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA1Vo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/upVos/DataCdA2Vo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/DoubleUtil.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/IPUtils.java 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysCpuUtil.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysFileSysUtil.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysJvmUtil.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysMemoryUtil.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysSysUtil.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/SysUtil.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/pom.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/MwInfoDeal.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/MwInfoVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealAlarmStatus.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pom.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,15 +103,19 @@
            sv.saveRmAlarmStateLast(po) ;
        }else{
            if(po.sendMsTime == null){
                po.sendMsTime = System.currentTimeMillis() ;
                this.sendMessage(controller, alarmVo);
            }else{
                Long now = System.currentTimeMillis() ;
                if(((now - po.sendMsTime) / (1000 * 60)) > ServerProperties.sendDingDingAlarmMsInterval){
                    //大于规定的间隔时间
                    po.sendMsTime = System.currentTimeMillis() ;
                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){
                        //大于规定的间隔时间
                        po.sendMsTime = System.currentTimeMillis() ;
                        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>