| | |
| | | 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; |
| | |
| | | */ |
| | | @Data |
| | | public class A5AtmosphereNewHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5AtmosphereNewHeartbeatReportInnerFrame> { |
| | | //ff03200241000000000000000000000009000a198a186327b8000c000000000000000b8c35c1cad6bf |
| | | //010326FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B341022277F000D05B5000000015DDD0000FFFF000070C9 主动上报心跳包 |
| | | private HeartBeatDataPackage heartBeatDataPackage; |
| | | |
| | | @Override |
| | |
| | | } |
| | | //校验 |
| | | hex = hex.replaceAll(" ", ""); |
| | | if (hex.length() < 74) { |
| | | if (hex.length() != 86) { |
| | | return null; |
| | | } |
| | | |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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); |
| | | } |