package com.sandu.ximon.admin.manager.iot.frame.inner.request; 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; /** * 大气设备修正数据 * * @author ZZQ * @date 2022/7/29 10:32 */ public class AtmosphereModifiedDataReqInnerFrame implements IRequestInnerFrame { private String functionCode; private String value; 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(); //TODO break; //设置数据修正值-气压 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_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" + 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); } }