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.CRC32Utils; import lombok.Data; import lombok.ToString; /** * @author chenjiantian * @date 2021/12/6 18:20 * A5-84-01 * 大气心跳包 应答 */ @Data @ToString(callSuper = true) public class A5AtmosphereHeartbeatReportInnerFrame extends BaseResponseInnerFrame { // 目标地址 2 private String destinationAddress; // 心跳包数据 58 private HeartBeatDataPackage heartBeatDataPackage; private String originFrame; @Override public A5AtmosphereHeartbeatReportInnerFrame transformFrame(String hex) { // 长度不一致时,返回null if (StrUtil.isBlank(hex)) { return null; } // MQTT通信方式(1) setConnectType(hex.substring(0, 2)); // 功能码(1) setFunctionCode(hex.substring(2, 4)); // 负荷长度(2) setPayloadLength(hex.substring(4, 8)); setDestinationAddress(hex.substring(8, 12)); String heartBeatData = hex.substring(12, 76); HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage(); heartBeatDataPackage.transformFrame(heartBeatData); setHeartBeatDataPackage(heartBeatDataPackage); setCrc32(hex.substring(hex.length() - 8)); // 校验CRC32 String frame = hex.substring(2, hex.length() - 8); this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); return this; } @Data public static class HeartBeatDataPackage implements IResponseInnerFrame { // 设备型号 2 private String deviceType; // 模块预热状态标志 1 private String moduleWarmUpStatusFlag; // 温度值 private Double temperature; // 湿度值 private Double humidity; // 风速 private Double windSpeed; // 风向 private Double windDirection; // 大气压 private Integer pressure; // 光强 private Integer lightIntensity; // 噪音 private Double noise; // PM2.5 private Integer pm25; // PM10 private Integer pm10; // 雨量 private Double rainfall; // SO2二氧化硫相对值 private Integer so2; // 甲醛相对值 private Integer ech2o; // NO2二氧化氮 private Integer no2; // TVOC private Integer tvoc; // CO一氧化碳 private Integer co; // 二氧化碳 private Integer co2; // O3臭氧 private Integer o3; // F氟化物 private Integer fluoride; @Override public HeartBeatDataPackage transformFrame(String hex) { if (hex.length() != 64) { return null; } Integer type = 0; this.deviceType = hex.substring(0, 4); if (this.deviceType.equals(DeviceType.SENSOR_V1.getType())) { type = 1; } this.moduleWarmUpStatusFlag = hex.substring(4, 6); this.temperature = Double.parseDouble( parseVal(hex, 6, 8) + "." + parseVal(hex, 8, 10) ); this.humidity = Double.parseDouble( parseVal(hex, 10, 12) + "." + parseVal(hex, 12, 14) ); this.windSpeed = parseVal(hex, 14, 18) * .1; this.windDirection = parseVal(hex, 18, 22) * .1; this.pressure = parseVal(hex, 22, 26); this.lightIntensity = parseVal(hex, 26, 32); this.noise = parseVal(hex, 32, 36) * .1; this.pm25 = parseVal(hex, 36, 40); this.pm10 = parseVal(hex, 40, 44); this.rainfall = parseVal(hex, 44, 48) * .1; /** * 以下区分版本 */ if (type.equals(1)) { this.ech2o = parseVal(hex, 48, 52); this.tvoc = parseVal(hex, 52, 56); this.co2 = parseVal(hex, 56, 60); } else { this.so2 = parseVal(hex, 48, 52); this.ech2o = parseVal(hex, 48, 52); this.tvoc = parseVal(hex, 52, 56); this.no2 = parseVal(hex, 52, 56); this.co = parseVal(hex, 56, 60); this.co2 = parseVal(hex, 56, 60); } this.o3 = parseVal(hex, 60, 62); this.fluoride = parseVal(hex, 62, 64); return this; } private Integer parseVal(String frame, int start, int end) { return Integer.parseInt(frame.substring(start, end), 16); } } public enum DeviceType { SENSOR_V1("0101"); private String type; DeviceType(String type) { this.type = type; } public String getType() { return type; } } }