| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.request; |
| | | |
| | | import com.sandu.common.execption.BusinessException; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.AtmoFunctionCode; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * 大气设备修正数据 |
| | |
| | | * @date 2022/7/29 10:32 |
| | | */ |
| | | public class AtmosphereModifiedDataReqInnerFrame implements IRequestInnerFrame { |
| | | //TODO |
| | | private String functionCode; |
| | | private String value; |
| | | |
| | | public AtmosphereModifiedDataReqInnerFrame(String functionType, Double valueOfReal, Double valueOfStandard) { |
| | | public AtmosphereModifiedDataReqInnerFrame(String functionType, String valueOfReal, String valueOfStandard) { |
| | | //传感器数值 |
| | | BigDecimal value1; |
| | | //标准值 |
| | | BigDecimal value2; |
| | | //修正值 |
| | | Double subtract; |
| | | //整数 |
| | | int i; |
| | | //小数 |
| | | int y; |
| | | |
| | | int z; |
| | | |
| | | switch (functionType) { |
| | | //设置数据修正值-温度 |
| | | case "温度": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_temperature.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | i = Integer.valueOf((int) (subtract * 100)) / 100; |
| | | y = Integer.valueOf((int) (subtract * 100)) % 100; |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(i) + hex10To16(y); |
| | | } else { |
| | | value = hex10To16(-i + 128) + hex10To16(-y); |
| | | } |
| | | break; |
| | | //设置数据修正值-湿度 |
| | | case "湿度": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_humidity.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | i = Integer.valueOf((int) (subtract * 100)) / 100; |
| | | y = Integer.valueOf((int) (subtract * 100)) % 100; |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(i) + hex10To16(y); |
| | | } else { |
| | | value = hex10To16(-i + 128) + hex10To16(-y); |
| | | } |
| | | break; |
| | | //设置数据修正值-风速 |
| | | case "风速": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_windSpeed.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 10)); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-风向 |
| | | case "风向": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_windDirection.getCode(); |
| | | //TODO |
| | | break; |
| | | // //设置数据修正值-风力 |
| | | // case "风力": |
| | | // functionCode = AtmoFunctionCode.Setting_Data_Correction_windPower.getCode(); |
| | | // throw new BusinessException("风力不需要设置数据修正值!"); |
| | | //设置数据修正值-气压 |
| | | case "气压": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_airPressure.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100)); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-光强 |
| | | case "光强": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_lightIntensity.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-噪音 |
| | | case "噪音": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_noise.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 10)); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-PM2.5 |
| | | case "PM2.5": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_PM2_5.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-PM10 |
| | | case "PM10": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_PM10.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-TSP |
| | | case "TSP": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_tsp.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-雨量 |
| | | case "雨量": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_rainfall.getCode(); |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_rain.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 10)); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-雨量 |
| | | case "甲醛": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_ech2o.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-TVOC |
| | | case "TVOC": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_tvoc.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-eCO2 |
| | | case "二氧化碳": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_eCO2.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-SO2二氧化硫 |
| | | case "二氧化硫": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_SO2.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-NO2二氧化氮 |
| | | case "二氧化氮": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_NO2.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-CO一氧化碳 |
| | | case "一氧化碳": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_CO.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-O3臭氧 |
| | | case "臭氧": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_O3.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | //设置数据修正值-F氟化物 |
| | | case "氟化物": |
| | | functionCode = AtmoFunctionCode.Setting_Data_Correction_F.getCode(); |
| | | value1 = new BigDecimal(valueOfReal); |
| | | value2 = new BigDecimal(valueOfStandard); |
| | | subtract = value1.subtract(value2).doubleValue(); |
| | | |
| | | z = Integer.valueOf((int) (subtract * 100) / 100); |
| | | |
| | | if (subtract > 0) { |
| | | value = hex10To16(z); |
| | | } else { |
| | | value = hex10To16(-z + 32768); |
| | | } |
| | | break; |
| | | default: |
| | | |
| | | } |
| | | |
| | | System.out.println(value); |
| | | } |
| | | |
| | | @Override |
| | | public String getEncodeFrame() { |
| | | String payloadLength = "0004"; |
| | | String payload = "FFFF"; |
| | | String payload = "FFFF" + value; |
| | | String frame = functionCode + payloadLength + payload; |
| | | return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase()); |
| | | } |
| | | |
| | | /** |
| | | * 十进制转十六进制 |
| | | * |
| | | * @param value |
| | | * @return |
| | | */ |
| | | private static String hex10To16(int value) { |
| | | return String.format("%02X", value); |
| | | } |
| | | } |