2021与蓝度共同重构项目,服务端
MercuryZ
2022-10-18 ea94079e74182be590b9fff356c97f522d9a7828
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5AtmosphereNewHeartbeatReportInnerFrame.java
@@ -5,6 +5,7 @@
import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC16Utils;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRCUtils;
import lombok.Data;
import java.math.BigDecimal;
@@ -15,7 +16,7 @@
 */
@Data
public class A5AtmosphereNewHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5AtmosphereNewHeartbeatReportInnerFrame> {
    //ff03200241000000000000000000000009000a198a186327b8000c000000000000000b8c35c1cad6bf
    //010326FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B341022277F000D05B5000000015DDD0000FFFF000070C9    主动上报心跳包
    private HeartBeatDataPackage heartBeatDataPackage;
    @Override
@@ -26,7 +27,7 @@
        }
        //校验
        hex = hex.replaceAll(" ", "");
        if (hex.length() < 74) {
        if (hex.length() != 86) {
            return null;
        }
@@ -44,9 +45,9 @@
        setHeartBeatDataPackage(heartBeatDataPackage);
        setCrc16(hex.substring(hex.length() - 4));
        //  校验CRC32
        //  校验CRC16
        String frame = hex.substring(0, hex.length() - 4);
        this.setValidate(getCrc16().equals(CRC16Utils.getCRC16(frame)));
        this.setValidate(getCrc16().equals(CRCUtils.getCRC16(frame)));
        return this;
    }
@@ -84,47 +85,137 @@
        private BigDecimal radiation;
        //("光照")
        private BigDecimal illumination;
        //紫外指数
        private BigDecimal ultraviolet;
        //CO2
        private BigDecimal co2;
        //负氧离子
        private BigDecimal o2;
        @Override
        public HeartBeatDataPackage transformFrame(String hex) {
            //ff   03  20   0241000000000000000000000009000a198a186327b8000c000000000000000b8c35c1ca(参考值)
            // 0241 0000  0000 0000 0000 0000 0009  000a  198a  1863  27b8  000c  0000  0000  0000  000b  8c35  c1ca
//            010326FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B341022277F000D05B5000000015DDD0000FFFF000070C9    主动上报心跳包
//            01:系统地址
//            03:功能码
//            26:数据段字 节数量
//            FFFF:噪声-------》
//            FFFF:硫化氢-------》
//            FFFF:SO2 浓度-------》
//            FFFF:NO2 浓度-------》
//            FFFF:CO 浓度-------》
//            FFFF:O3 浓度-------》
//            FFFF:PM2.5 浓度-------》
//            FFFF:PM10 浓度-------》
//            1B34:空气温度-------》29.64℃
//            1022:空气湿度-------》41.30%
//            277F:大气压强-------》101.11hPa
//            000D:风速-------》0.13m/s
//            05B5:风向-------》146.1°
//            0000:连续雨量-------》0mm
//            0001:辐射-------》1W/㎡
//            5DDD:光照-------》240.29Klux
//            0000:紫外指数-------》
//            FFFF:CO2-------》
//            0000:负氧离子-------》
//            70C9:CRC16 校验位
            //噪声
            this.noise = BigDecimal.valueOf(parseVal(hex, 6, 10) / 10.0);
            if (isValidData(hex, 6, 10)) {
                this.noise = new BigDecimal(parseVal(hex, 6, 10)).divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP);
            }
            //硫化氢
            this.hydrogenSulfide = BigDecimal.valueOf(parseVal(hex, 10, 14) / 1.0);
            if (isValidData(hex, 10, 14)) {
                this.hydrogenSulfide = new BigDecimal(parseVal(hex, 10, 14));
            }
            //SO2 浓度
            this.so2 = BigDecimal.valueOf(parseVal(hex, 14, 18) / 1.0);
            if (isValidData(hex, 14, 18)) {
                this.so2 = new BigDecimal(parseVal(hex, 14, 18));
            }
            //NO2 浓度
            this.no2 = BigDecimal.valueOf(parseVal(hex, 18, 22) / 1.0);
            if (isValidData(hex, 18, 22)) {
                this.no2 = new BigDecimal(parseVal(hex, 18, 22));
            }
            //CO 浓度
            this.co = BigDecimal.valueOf(parseVal(hex, 22, 26) / 1.0);
            if (isValidData(hex, 22, 26)) {
                this.co = new BigDecimal(parseVal(hex, 22, 26));
            }
            //O3 浓度
            this.o3 = BigDecimal.valueOf(parseVal(hex, 26, 30) / 1.0);
            if (isValidData(hex, 26, 30)) {
                this.o3 = new BigDecimal(parseVal(hex, 26, 30));
            }
            //PM2.5 浓度
            this.pm2point5 = BigDecimal.valueOf(parseVal(hex, 30, 34) / 1.0);
            if (isValidData(hex, 30, 34)) {
                this.pm2point5 = new BigDecimal(parseVal(hex, 30, 34));
            }
            //PM10 浓度
            this.pm10 = BigDecimal.valueOf(parseVal(hex, 34, 38) / 1.0);
            if (isValidData(hex, 34, 38)) {
                this.pm10 = new BigDecimal(parseVal(hex, 34, 38));
            }
            //空气温度
            this.airTemperature = BigDecimal.valueOf(parseVal(hex, 38, 42) / 100.0 - 40);
            if (isValidData(hex, 38, 42)) {
                this.airTemperature = new BigDecimal(parseVal(hex, 38, 42)).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(40));
            }
            //空气湿度
            this.airHumidity = BigDecimal.valueOf(parseVal(hex, 42, 46) / 100.0);
            if (isValidData(hex, 42, 46)) {
                this.airHumidity = new BigDecimal(parseVal(hex, 42, 46)).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
            }
            //大气压强
            this.airPressure = BigDecimal.valueOf(parseVal(hex, 46, 50) / 10.0);
            if (isValidData(hex, 46, 50)) {
                this.airPressure = new BigDecimal(parseVal(hex, 46, 50)).divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP);
            }
            //风速
            this.windSpeed = BigDecimal.valueOf(parseVal(hex, 50, 54) / 100.0);
            if (isValidData(hex, 50, 54)) {
                this.windSpeed = new BigDecimal(parseVal(hex, 50, 54)).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
            }
            //风向
            this.windDirection = BigDecimal.valueOf(parseVal(hex, 54, 58) / 10.0);
            if (isValidData(hex, 54, 58)) {
                this.windDirection = new BigDecimal(parseVal(hex, 54, 58)).divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP);
            }
            //10 分钟雨量
            this.tenRainfallMin = BigDecimal.valueOf(parseVal(hex, 58, 62) / 10.0);
            if (isValidData(hex, 58, 62)) {
                this.tenRainfallMin = new BigDecimal(parseVal(hex, 58, 62)).divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP);
            }
            //辐射
            this.radiation = BigDecimal.valueOf(parseVal(hex, 62, 66) / 1.0);
            if (isValidData(hex, 62, 66)) {
                this.radiation = new BigDecimal(parseVal(hex, 62, 66));
            }
            //光照
            this.illumination = BigDecimal.valueOf(parseVal(hex, 66, 70) / 100.0);
            if (isValidData(hex, 66, 70)) {
                this.illumination = new BigDecimal(parseVal(hex, 66, 70)).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
            }
            //紫外指数
            if (isValidData(hex, 70, 74)) {
                this.ultraviolet = new BigDecimal(parseVal(hex, 70, 74)).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP);
            }
            //CO2
            if (isValidData(hex, 74, 78)) {
                this.co2 = new BigDecimal(parseVal(hex, 74, 78));
            }
            //负氧离子
            if (isValidData(hex, 78, 82)) {
                this.o2 = BigDecimal.valueOf(parseVal(hex, 78, 82) * 10.0);
                this.o2 = new BigDecimal(parseVal(hex, 78, 82)).multiply(new BigDecimal(1));
            }
            return this;
        }
        /**
         * 判断该大气设备是否有对应的感应器
         *
         * @param value
         * @param startIndex
         * @param endIndex
         * @return
         */
        private boolean isValidData(String value, int startIndex, int endIndex) {
            //FFFF是代表这个设备不支持这个数据项。0000是表示支持但是数据为零
            if ("FFFF".equals(value.substring(startIndex, endIndex))) {
                return false;
            } else {
                return true;
            }
        }
        private Integer parseVal(String frame, int start, int end) {
            return Integer.parseInt(frame.substring(start, end), 16);
        }