package com.sandu.ximon.admin.manager.iot.frame.inner.report; import cn.hutool.core.util.StrUtil; import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; 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 lombok.Data; import java.math.BigDecimal; /** * @author ZZQ * @date 2022/4/25 10:55 */ @Data public class A5AtmosphereNewHeartbeatReportInnerFrame extends BaseResponseInnerFrame { //ff03200241000000000000000000000009000a198a186327b8000c000000000000000b8c35c1cad6bf private HeartBeatDataPackage heartBeatDataPackage; @Override public A5AtmosphereNewHeartbeatReportInnerFrame transformFrame(String hex) { // 长度不一致时,返回null if (StrUtil.isBlank(hex)) { return null; } //校验 hex = hex.replaceAll(" ", ""); if (hex.length() < 74) { return null; } // MQTT通信方式(1) setConnectType(hex.substring(0, 2)); // 功能码(1) setFunctionCode(hex.substring(2, 4)); // 负荷长度(2) setPayloadLength(hex.substring(4, 6)); String heartBeatData = hex.substring(0, hex.length() - 4); HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage(); heartBeatDataPackage.transformFrame(heartBeatData); setHeartBeatDataPackage(heartBeatDataPackage); setCrc16(hex.substring(hex.length() - 4)); // 校验CRC32 String frame = hex.substring(0, hex.length() - 4); this.setValidate(getCrc16().equals(CRC16Utils.getCRC16(frame))); return this; } @Data public static class HeartBeatDataPackage implements IResponseInnerFrame { //("噪声") private BigDecimal noise; //("硫化氢") private BigDecimal hydrogenSulfide; //("SO2 浓度") private BigDecimal so2; //("NO2 浓度") private BigDecimal no2; //("CO 浓度") private BigDecimal co; //("O3 浓度") private BigDecimal o3; //("PM2.5 浓度") private BigDecimal pm2point5; //("PM10") private BigDecimal pm10; //("空气温度") private BigDecimal airTemperature; //("空气湿度") private BigDecimal airHumidity; //("大气压强") private BigDecimal airPressure; //("风速") private BigDecimal windSpeed; //("风向") private BigDecimal windDirection; //("10 分钟雨量") private BigDecimal tenRainfallMin; //("辐射") private BigDecimal radiation; //("光照") private BigDecimal illumination; @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 //噪声 this.noise = BigDecimal.valueOf(parseVal(hex, 6, 10) / 10.0); //硫化氢 this.hydrogenSulfide = BigDecimal.valueOf(parseVal(hex, 10, 14) / 1.0); //SO2 浓度 this.so2 = BigDecimal.valueOf(parseVal(hex, 14, 18) / 1.0); //NO2 浓度 this.no2 = BigDecimal.valueOf(parseVal(hex, 18, 22) / 1.0); //CO 浓度 this.co = BigDecimal.valueOf(parseVal(hex, 22, 26) / 1.0); //O3 浓度 this.o3 = BigDecimal.valueOf(parseVal(hex, 26, 30) / 1.0); //PM2.5 浓度 this.pm2point5 = BigDecimal.valueOf(parseVal(hex, 30, 34) / 1.0); //PM10 浓度 this.pm10 = BigDecimal.valueOf(parseVal(hex, 34, 38) / 1.0); //空气温度 this.airTemperature = BigDecimal.valueOf(parseVal(hex, 38, 42) / 100.0 - 40); //空气湿度 this.airHumidity = BigDecimal.valueOf(parseVal(hex, 42, 46) / 100.0); //大气压强 this.airPressure = BigDecimal.valueOf(parseVal(hex, 46, 50) / 10.0); //风速 this.windSpeed = BigDecimal.valueOf(parseVal(hex, 50, 54) / 100.0); //风向 this.windDirection = BigDecimal.valueOf(parseVal(hex, 54, 58) / 10.0); //10 分钟雨量 this.tenRainfallMin = BigDecimal.valueOf(parseVal(hex, 58, 62) / 10.0); //辐射 this.radiation = BigDecimal.valueOf(parseVal(hex, 62, 66) / 1.0); //光照 this.illumination = BigDecimal.valueOf(parseVal(hex, 66, 70) / 100.0); return this; } private Integer parseVal(String frame, int start, int end) { return Integer.parseInt(frame.substring(start, end), 16); } } }