package com.mh.user.utils; import com.alibaba.fastjson2.JSON; import com.mh.common.utils.StringUtils; import com.mh.user.entity.*; import com.mh.user.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ThreadPoolExecutor; /** * @author ljf * @title : * @description : 解析485接收的数据 * @updateTime 2020-04-23 * @throws : */ @Slf4j public class AnalysisReceiveOrder485 { // 调用service ApplicationContext context = SpringBeanUtil.getApplicationContext(); ThreadPoolExecutor threadPoolService = ThreadPoolService.getInstance(); DataResultService dataResultService = context.getBean(DataResultService.class); NowDataService nowDataService = context.getBean(NowDataService.class); NowPublicDataService nowPublicDataService = context.getBean(NowPublicDataService.class); PumpSetService pumpSetService = context.getBean(PumpSetService.class); DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); BuildingService buildingService = context.getBean(BuildingService.class); /** * 解析电表返回的数据 * * @param dataStr */ public void analysisMeterOrder485(final String dataStr, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { if (dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50) { String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 //返回的校验码与重新生成的校验码进行校验 if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { //表号,12位 String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); meterId = String.format("%012d", Long.parseLong(meterId)); String data = ""; StringBuilder stringBuilder = new StringBuilder(); if (dataStr.length() == 36) { for (int i = 0; i < 4; i++) { String data1 = checkStr.substring(32 - 2 * (i + 1), 32 - 2 * i); stringBuilder.append(data1); } } else { for (int i = 0; i < 4; i++) { String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); stringBuilder.append(data1); } } data = stringBuilder.toString(); data = ExchangeStringUtil.cutThree(data); // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 data = String.format("%08d", Long.parseLong(data)); data = data.substring(0, 6) + "." + data.substring(6, 8); log.info("电表表号:" + meterId + ",电表读数:" + data); try { DataResultEntity dataResultEntity = new DataResultEntity(); dataResultEntity.setDeviceAddr(meterId);//通讯编号 dataResultEntity.setDeviceType("电表"); dataResultEntity.setBuildingId(buildingId); dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 Date date = new Date(); dataResultEntity.setCurDate(date); //当前日期 dataResultService.saveDataResult(dataResultEntity); log.info("电表数据保存数据库成功! 楼栋名称:" + buildingName); } catch (Exception e) { log.error("电表数据保存数据库失败!楼栋名称:" + buildingName, e); } } else { log.info("电表报文检验失败: " + dataStr); } } // }); } public String analysisMeterOrder4852(final String dataStr, final String registerAddr, final String brand, String buildingId, final String buildingName) { Date date = new Date(); String data = ""; if (dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50) { String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 //返回的校验码与重新生成的校验码进行校验 if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { log.info("电表报文检验成功: " + dataStr); //表号,12位 String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); meterId = String.format("%012d", Long.parseLong(meterId)); StringBuilder stringBuilder = new StringBuilder(); if (dataStr.length() == 36) { for (int i = 0; i < 4; i++) { String data1 = checkStr.substring(32 - 2 * (i + 1), 32 - 2 * i); stringBuilder.append(data1); } } else { for (int i = 0; i < 4; i++) { String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); stringBuilder.append(data1); } } data = stringBuilder.toString(); data = ExchangeStringUtil.cutThree(data); // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 data = String.format("%08d", Long.parseLong(data)); data = data.substring(0, 6) + "." + data.substring(6, 8); log.info("电表表号:" + meterId + ",电表读数:" + data); try { DataResultEntity dataResultEntity = new DataResultEntity(); dataResultEntity.setDeviceAddr(meterId);//通讯编号 dataResultEntity.setDeviceType("电表"); dataResultEntity.setBuildingId(buildingId); dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 dataResultEntity.setCurDate(date); //当前日期 dataResultService.saveDataResult(dataResultEntity); log.info("电表数据保存数据库成功! 楼栋名称:" + buildingName); } catch (Exception e) { log.error("电表数据保存数据库失败!楼栋名称:" + buildingName, e); } } else { log.info("电表报文检验失败: " + dataStr); } } if (!data.equals("")) { data = String.valueOf(Double.valueOf(data)); //00010.76,去除读数前面带0的情况 } return data; } // 水表 public void analysisWtMeterOrder485(final String dataStr, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { String data = ""; String meterId = ""; if (dataStr.length() == 44 || dataStr.length() == 70) { String checkStr = dataStr.substring(0, dataStr.length() - 4);//减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { meterId = checkStr.substring(16, 18) + checkStr.substring(14, 16) + checkStr.substring(12, 14) + checkStr.substring(10, 12)// 表号 + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6); meterId = String.format("%014d", Long.parseLong(meterId)); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 4; i++) { //String data1 = checkStr.substring(checkStr.length() - 2 * (i + 1), checkStr.length() - 2 * i); String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); stringBuilder.append(data1); } data = stringBuilder.toString(); // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 data = String.format("%08d", Long.parseLong(data)); data = data.substring(0, 6) + "." + data.substring(6, 8); } else { log.info("水表报文检验失败: " + dataStr); } } else if (dataStr.length() == 18) { String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); String sValue = null; if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { meterId = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { data = String.valueOf(Integer.parseInt(ExchangeStringUtil.hexToDec(checkStr.substring(6, 14))) / 10); //读数 } } else { log.info("水表报文检验失败: " + dataStr); } } log.info("水表表号: " + meterId + ",水表读数:" + data); try { DataResultEntity dataResultEntity = new DataResultEntity(); dataResultEntity.setDeviceAddr(meterId);//通讯编号 dataResultEntity.setDeviceType("水表"); dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 Date date = new Date(); dataResultEntity.setCurDate(date); //当前日期 dataResultEntity.setBuildingId(buildingId); dataResultService.saveDataResult(dataResultEntity); log.info("水表数据保存数据库成功!楼栋名称:" + buildingName); } catch (Exception e) { e.printStackTrace(); log.error("水表数据保存数据库失败!楼栋名称:" + buildingName); } // }); } // 水表 public String analysisWtMeterOrder4852(final String dataStr, final String registerAddr, final String brand, String buildingId, String buildingName) { Date date = new Date(); String data = ""; String meterId = ""; if (dataStr.length() == 44 || dataStr.length() == 70) { String checkStr = dataStr.substring(0, dataStr.length() - 4);//减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { meterId = checkStr.substring(16, 18) + checkStr.substring(14, 16) + checkStr.substring(12, 14) + checkStr.substring(10, 12)// 表号 + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6); meterId = String.format("%014d", Long.parseLong(meterId)); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 4; i++) { String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); stringBuilder.append(data1); } data = stringBuilder.toString(); // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 data = String.format("%08d", Long.parseLong(data)); data = data.substring(0, 6) + "." + data.substring(6, 8); } else { log.info("水表报文检验失败: " + dataStr); } } else if (dataStr.length() == 18) { String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { meterId = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { data = String.valueOf(Integer.parseInt(ExchangeStringUtil.hexToDec(checkStr.substring(6, 14))) / 10); //读数 } } else { log.info("水表报文检验失败: " + dataStr); } } log.info("水表表号: " + meterId + ",水表读数:" + data); try { DataResultEntity dataResultEntity = new DataResultEntity(); dataResultEntity.setDeviceAddr(meterId);//通讯编号 dataResultEntity.setDeviceType("水表"); dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 dataResultEntity.setCurDate(date); //当前日期 dataResultEntity.setBuildingId(buildingId); dataResultService.saveDataResult(dataResultEntity); log.info("水表数据保存数据库成功!楼栋名称:" + buildingName); } catch (Exception e) { log.error("水表数据保存数据库失败!楼栋名称:" + buildingName, e); } if (!data.equals("")) { data = String.valueOf(Double.valueOf(data)); } return data; } // 热泵 public void analysisPumpOrder485(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { // if (!Constant.CONTROL_WEB_FLAG) { // threadPoolService.execute(() -> { String dateStr = DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"); String checkStr = receiveData.substring(0, receiveData.length() - 4);//检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 String sValue = null; String dataType = null; if (!checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("热泵报文检验失败: " + receiveData); return; } String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 String data = ""; if (brand == null || brand.equals("") || brand.equals("美的")) { if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读 if (registerAddr.equalsIgnoreCase("0641")) { //运行状态 dataType = "runState"; data = checkStr.substring(8, 10); log.info("------------美的热泵状态值-----------" + data); if (data.equalsIgnoreCase("08")) { sValue = "不运行"; //关机模式 } else if (data.equalsIgnoreCase("01")) { sValue = "运行"; //制冷模式 } else if (data.equalsIgnoreCase("02")) { sValue = "运行"; //制热模式 } else if (data.equalsIgnoreCase("04")) { sValue = "运行"; //水泵模式 } else if (data.equalsIgnoreCase("10")) { sValue = "运行"; //制热水模式 } //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); // String state=nowDataService.selectState(buildingId); //判断热泵状态,如果有一个以上热泵运行,楼栋公共信息补水运行 // NowPublicDataEntity publicData=new NowPublicDataEntity(); // publicData.setBuildingId(buildingId); // publicData.setUpWater(state); // nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) { //0642设定温度,0007水箱水温 if (registerAddr.equalsIgnoreCase("0642")) { dataType = "tempSet"; } else { dataType = "waterTemp"; } //读数 sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); if (dataType.equals("waterTemp")) { String avgTemp = nowDataService.selectAve(buildingId); NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(avgTemp); publicData.setBackWaterTemp(avgTemp); String pumpId = nowDataService.selectMinPumpId(buildingId); if (addr.equals(pumpId)) { //取ID最小的热泵为单箱温度 publicData.setSingleTemp(sValue); log.info("---------------单箱温度:" + sValue + "---------------"); } nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("楼栋名称:" + buildingName + ",热泵编号:" + addr); // nowDataService.proWaterTemp(dateStr,buildingId,addr); //保存楼栋时间点温度变化 // log.info("=========保存楼栋时间点温度变化值!==========="); } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("热泵ID:" + addr + ",数据:" + sValue + ",保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态 dataType = "isFault"; String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); sData = ExchangeStringUtil.addZeroForNum(sData, 8); if (sData.substring(7, 8).equalsIgnoreCase("0")) { sValue = "无故障"; deviceInstallService.updateDeviceFault("0", addr, "热泵"); } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName); } // else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") // || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 // sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); // } } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); } } else if (brand.equals("美的2")) { if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 if (registerAddr.equalsIgnoreCase("0BBD")) { //运行状态 dataType = "runState"; data = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); data = ExchangeStringUtil.addZeroForNum(data, 8);//二进制数,补够8位 data = data.substring(4, 8); //截取后四位 log.info("------------美的2热泵状态值-----------" + data); if (data.equalsIgnoreCase("0000")) { //0 sValue = "不运行"; //关机 } else if (data.equalsIgnoreCase("0001")) {//1 sValue = "运行"; //水泵 } else if (data.equalsIgnoreCase("0010")) {//2 sValue = "运行"; //制冷 } else if (data.equalsIgnoreCase("0011")) {//3 sValue = "运行"; //制热 } else if (data.equalsIgnoreCase("0100")) {//4 sValue = "运行"; //热水 } else if (data.equalsIgnoreCase("0101")) {//5 sValue = "运行"; //采暖 } else if (data.equalsIgnoreCase("0110")) {//6 sValue = "运行"; //电热模式 } //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); // String state=nowDataService.selectState(buildingId); //判断热泵状态,如果有一个以上热泵运行,楼栋公共信息补水运行 // NowPublicDataEntity publicData=new NowPublicDataEntity(); // publicData.setBuildingId(buildingId); // publicData.setUpWater(state); // nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) { //0003设定温度,0064水箱水温 if (registerAddr.equalsIgnoreCase("0003")) { dataType = "tempSet"; } else { dataType = "waterTemp"; } //读数 sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); if (dataType.equals("waterTemp")) { String avgTemp = nowDataService.selectAve(buildingId); NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(avgTemp); publicData.setBackWaterTemp(avgTemp); String pumpId = nowDataService.selectMinPumpId(buildingId); log.info("---------------addr:" + addr + ",pumpId:" + pumpId + " ---------------"); if (addr.equals(pumpId)) { //取ID最小的热泵为单箱温度 publicData.setSingleTemp(sValue); log.info("---------------单箱温度:" + sValue + "---------------"); } nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("楼栋名称:" + buildingName + ",热泵编号:" + addr); } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("热泵ID: " + addr + ",数据: " + sValue + ",保存数据库成功!楼栋编号:" + buildingId); } else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态 dataType = "isFault"; String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); sData = ExchangeStringUtil.addZeroForNum(sData, 8); if (sData.substring(7, 8).equalsIgnoreCase("0")) { sValue = "无故障"; } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } // else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") // || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 // sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); // } } else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); } } nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 log.info("----------------保存楼栋时间点温度变化值!----------------"); // }); // } } public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); String rtData = ""; //检验报文 String checkStr = receiveData.substring(0, receiveData.length() - 4); String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 String sValue = null; String dataType = null; if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("热泵报文检验成功: " + receiveData); String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); String data = ""; if (StringUtils.isBlank(brand) || brand.equals("美的")) { if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读 if (registerAddr.equalsIgnoreCase("0641")) { //运行状态 dataType = "runState"; data = checkStr.substring(8, 10); if (data.equalsIgnoreCase("08")) { sValue = "不运行"; //关机模式 } else if (data.equalsIgnoreCase("01")) { sValue = "运行"; //制冷模式 } else if (data.equalsIgnoreCase("02")) { sValue = "运行"; //制热模式 } else if (data.equalsIgnoreCase("04")) { sValue = "运行"; //水泵模式 } else if (data.equalsIgnoreCase("10")) { sValue = "运行"; //制热水模式 } //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) { //0642设定温度,0007水箱水温 if (registerAddr.equalsIgnoreCase("0642")) { dataType = "tempSet"; } else { dataType = "waterTemp"; } //读数 sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); if (dataType.equals("waterTemp")) { NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(sValue); publicData.setBackWaterTemp(sValue); nowPublicDataService.saveNowHistoryPublicData(publicData); nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态 dataType = "isFault"; String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); sData = ExchangeStringUtil.addZeroForNum(sData, 8); if (sData.substring(7, 8).equalsIgnoreCase("0")) { sValue = "无故障"; deviceInstallService.updateDeviceFault("0", addr, "热泵"); } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") || registerAddr.equalsIgnoreCase("065E")) { //读定时设置值 String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14); String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22); sValue = startTime + closetTime; } } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); } rtData = sValue; } else if (brand.equals("美的2")) { log.info("品牌:" + brand + "," + "寄存器地址:" + registerAddr); if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 if (registerAddr.equalsIgnoreCase("0BBD")) { //运行状态 dataType = "runState"; data = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); data = ExchangeStringUtil.addZeroForNum(data, 8);//二进制数,补够8位 data = data.substring(4, 8); //截取后四位 if (data.equalsIgnoreCase("0000")) { //0 sValue = "不运行"; //关机 } else if (data.equalsIgnoreCase("0001")) {//1 sValue = "运行"; //水泵 } else if (data.equalsIgnoreCase("0010")) {//2 sValue = "运行"; //制冷 } else if (data.equalsIgnoreCase("0011")) {//3 sValue = "运行"; //制热 } else if (data.equalsIgnoreCase("0100")) {//4 sValue = "运行"; //热水 } else if (data.equalsIgnoreCase("0101")) {//5 sValue = "运行"; //采暖 } else if (data.equalsIgnoreCase("0110")) {//6 sValue = "运行"; //电热模式 } //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) { //0003设定温度,0064水箱水温 if (registerAddr.equalsIgnoreCase("0003")) { dataType = "tempSet"; } else { dataType = "waterTemp"; } //读数 sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); if (dataType.equals("waterTemp")) { NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(sValue); publicData.setBackWaterTemp(sValue); nowPublicDataService.saveNowHistoryPublicData(publicData); nowDataService.proWaterTemp(dateStr, buildingId, addr);//保存楼栋温度变化 } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态 dataType = "isFault"; String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); sData = ExchangeStringUtil.addZeroForNum(sData, 8); if (sData.substring(7, 8).equalsIgnoreCase("0")) { sValue = "无故障"; } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14); String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22); sValue = startTime + closetTime; } rtData = sValue; } else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); } } else if (brand.equals("瑞星")) { if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读 if (registerAddr.equalsIgnoreCase("0001")) { //运行状态 dataType = "runState"; data = checkStr.substring(8, 10); if (data.equalsIgnoreCase("00")) { sValue = "不运行"; //关机模式 } else if (data.equalsIgnoreCase("01")) { sValue = "运行"; //制热模式 } //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) { //000A设定温度,0046水箱水温 if (registerAddr.equalsIgnoreCase("000A")) { dataType = "tempSet"; } else { dataType = "waterTemp"; } //读数 sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); if (dataType.equals("waterTemp")) { sValue = String.valueOf(Double.parseDouble(sValue)/10); NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(sValue); publicData.setBackWaterTemp(sValue); nowPublicDataService.saveNowHistoryPublicData(publicData); nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态 dataType = "isFault"; String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); sData = ExchangeStringUtil.addZeroForNum(sData, 8); if (sData.substring(7, 8).equalsIgnoreCase("0")) { sValue = "无故障"; deviceInstallService.updateDeviceFault("0", addr, "热泵"); } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0028") || registerAddr.equalsIgnoreCase("002C") || registerAddr.equalsIgnoreCase("0030")) { //读定时设置值 String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14); String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22); sValue = startTime + closetTime; } } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); } rtData = sValue; } } else { log.info("热泵报文检验失败: " + receiveData); } return rtData; } // 温度变送器,长度42,读功能03 public void analysisMulTempOrder485(final String receiveData, final String registerAddr, final String brand, final String buildingId, final String buildingName) { // threadPoolService.execute(() -> { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (!checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("温度变送器报文检验失败: " + receiveData); } //log.info("温度变送器报文检验成功: " + receiveData); String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 //log.info("温度变送器:" + addr); String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 Map map = new HashMap<>(); String L1 = checkStr.substring(6, 10); //1路 map.put("1", String.valueOf(ExchangeStringUtil.parseHex4(L1) / 10)); String L2 = checkStr.substring(10, 14); //2路 map.put("2", String.valueOf(ExchangeStringUtil.parseHex4(L2) / 10)); String L3 = checkStr.substring(14, 18); //3路 map.put("3", String.valueOf(ExchangeStringUtil.parseHex4(L3) / 10)); String L4 = checkStr.substring(18, 22); //4路 map.put("4", String.valueOf(ExchangeStringUtil.parseHex4(L4) / 10)); String L5 = checkStr.substring(22, 26); //5路 map.put("5", String.valueOf(ExchangeStringUtil.parseHex4(L5) / 10)); String L6 = checkStr.substring(26, 30); //6路 map.put("6", String.valueOf(ExchangeStringUtil.parseHex4(L6) / 10)); String L7 = checkStr.substring(30, 34); //7路 map.put("7", String.valueOf(ExchangeStringUtil.parseHex4(L7) / 10)); String L8 = checkStr.substring(34, 38); //8路 map.put("8", String.valueOf(ExchangeStringUtil.parseHex4(L8) / 10)); int count = buildingService.selectPumpCount(buildingId); //楼栋热泵数 if (count > 0) { String dateStr = DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"); for (Map.Entry entry : map.entrySet()) { addr = entry.getKey(); data = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 } } log.info("温度变送器:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); String avgTemp = nowDataService.selectAve(buildingId); NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(avgTemp); publicData.setBackWaterTemp(avgTemp); nowPublicDataService.saveNowHistoryPublicData(publicData); } } // }); } // 温度变送器,长度42,读功能03 public String analysisMulTempOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { String result = "fail"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { //log.info("温度变送器报文检验成功: " + receiveData); String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 Map map = new HashMap<>(); String L1 = checkStr.substring(6, 10); //1路 map.put("1", String.valueOf(ExchangeStringUtil.parseHex4(L1) / 10)); String L2 = checkStr.substring(10, 14); //2路 map.put("2", String.valueOf(ExchangeStringUtil.parseHex4(L2) / 10)); String L3 = checkStr.substring(14, 18); //3路 map.put("3", String.valueOf(ExchangeStringUtil.parseHex4(L3) / 10)); String L4 = checkStr.substring(18, 22); //4路 map.put("4", String.valueOf(ExchangeStringUtil.parseHex4(L4) / 10)); String L5 = checkStr.substring(22, 26); //5路 map.put("5", String.valueOf(ExchangeStringUtil.parseHex4(L5) / 10)); String L6 = checkStr.substring(26, 30); //6路 map.put("6", String.valueOf(ExchangeStringUtil.parseHex4(L6) / 10)); String L7 = checkStr.substring(30, 34); //7路 map.put("7", String.valueOf(ExchangeStringUtil.parseHex4(L7) / 10)); String L8 = checkStr.substring(34, 38); //8路 map.put("8", String.valueOf(ExchangeStringUtil.parseHex4(L8) / 10)); int count = buildingService.selectPumpCount(buildingId); //楼栋热泵数 if (count > 0) { for (Map.Entry entry : map.entrySet()) { addr = entry.getKey(); data = entry.getValue(); if (addr != null && Integer.valueOf(addr) <= count) { nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); nowDataService.proWaterTemp(dateStr, buildingId, addr);//保存时间点温度 } } log.info("温度变送器:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); String avgTemp = nowDataService.selectAve(buildingId); NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(avgTemp); publicData.setBackWaterTemp(avgTemp); publicData.setSingleTemp(map.get("1"));//编号最小的热泵温度作为单箱温度 nowPublicDataService.saveNowHistoryPublicData(publicData); result = JSON.toJSONString(map); //map转json字符串 } } } else { log.info("温度变送器报文检验失败: " + receiveData); } return result; } // 温控,长度18,读功能03,用于检测水箱水温 public void analysisTempOrder485(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { // 检验报文 String checkStr = receiveData.substring(0, receiveData.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (!checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("温控报文检验失败: " + receiveData); return; } String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 data = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); Double fdata = Double.parseDouble(data) / 10; if (fdata <= 25) { fdata = 25.0; } else if (fdata >= 65) { fdata = 65.0; } nowDataService.saveNowHistoryData2(addr, "温控", String.valueOf(fdata), "waterTemp", buildingId); String dateStr = DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"); nowDataService.proWaterTemp(dateStr, buildingId, "");//保存时间点温度 String avgTemp = nowDataService.selectAve(buildingId); NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); publicData.setUseWaterTemp(avgTemp); publicData.setBackWaterTemp(avgTemp); publicData.setSingleTemp(String.valueOf(fdata));//单箱温度 nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("温控号:" + addr + ",温度值:" + fdata + ",保存数据库成功!楼栋名称:" + buildingName); } // }); } // 压变,长度14,18读功能03 public void analysisPressureOrder485(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (!checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("压变报文检验失败: " + receiveData); return; } SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 Double wtHeight = 0.0; if (brand == null || brand.equals("")) { float fdata = ExchangeStringUtil.hexToSingle(checkStr.substring(6, 14));//十六进制转浮点型 wtHeight = fdata * 1.02; //通过压力求水高 } else if (brand.equals("澳升") || brand.equals("汝翊")) { data = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));//十六进制转整形 wtHeight = Double.parseDouble(data) / 100 * 0.102; //通过压力求水高 } Double tankHeight = buildingService.queryTankHeight(buildingId);//水箱高,从数据库获取 if (tankHeight == null) { tankHeight = 2.0; } Double wtLevel = wtHeight / tankHeight * 100; //水箱水位 log.info("------水箱水高:" + wtLevel + "------"); if (wtLevel <= 0) { wtLevel = 0.0; } else if (wtLevel >= 100) { wtLevel = 100.0; } DecimalFormat df = new DecimalFormat("0.0"); String strWtLevel = df.format(wtLevel); nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId); log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); nowDataService.proWaterLevel(dateStr, buildingId); //楼栋水位 log.info("------保存每栋楼小时水位情况" + dateStr + "------"); } // }); } // 压变,长度14,18读功能03 public String analysisPressureOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) { String result = "fail"; String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 Double wtHeight = 0.0; if (StringUtils.isBlank(brand)) { float fdata = ExchangeStringUtil.hexToSingle(checkStr.substring(6, 14));//十六进制转浮点型 wtHeight = fdata * 1.02; //通过压力求水高 } else if (brand.equals("澳升") || brand.equals("汝翊")) { data = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));//十六进制转整形 wtHeight = Double.parseDouble(data) / 100 * 0.102; //通过压力求水高 } Double tankHeight = buildingService.queryTankHeight(buildingId);//水箱高,从数据库获取 if (tankHeight == null) { tankHeight = 2.0; } Double wtLevel = wtHeight / tankHeight * 100; //水箱水位 log.info("------水箱水高:" + wtLevel + "------"); if (wtLevel <= 0) { wtLevel = 0.0; } else if (wtLevel >= 100) { wtLevel = 100.0; } DecimalFormat df = new DecimalFormat("0.0"); String strWtLevel = df.format(wtLevel); result = strWtLevel; nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId); log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); nowDataService.proWaterLevel(dateStr, buildingId); //楼栋水位 log.info("------保存每栋楼小时水位情况------" + dateStr); } } else { log.info("压变报文检验失败: " + receiveData); } return result; } // 水位开关,长度42,128 public void analysisRelayOrder485(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { String dateStr = DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"); String l1 = ""; String l2 = ""; String l3 = ""; String l4 = ""; String l5 = ""; String l6 = ""; String l7 = ""; String l8 = ""; String waterLevelSet = ""; String addr = ""; if (brand == null || brand.equals("") || brand.equals("中凯")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 l1 = checkStr.substring(4, 6); l2 = checkStr.substring(20, 22); l3 = checkStr.substring(36, 38); l4 = checkStr.substring(52, 54); l5 = checkStr.substring(68, 70); l6 = checkStr.substring(84, 86); l7 = checkStr.substring(100, 102); l8 = checkStr.substring(116, 118); } else if (registerAddr.equals("0012")) { log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! "); } } } else if (brand.equals("远向")) { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 if (checkStr.substring(2, 4).equals("03")) { if (registerAddr != null && !registerAddr.equals("")) { // if (registerAddr.equals("0018")){ l1 = checkStr.substring(6, 10); l2 = checkStr.substring(10, 14); l3 = checkStr.substring(14, 18); l4 = checkStr.substring(18, 22); l5 = checkStr.substring(22, 26); l6 = checkStr.substring(26, 30); l7 = checkStr.substring(30, 34); l8 = checkStr.substring(34, 38); // } } } else if (checkStr.substring(2, 4).equals("06") || checkStr.substring(2, 4).equals("04")) { log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! "); } } else { log.info("水位开关报文检验失败: " + receiveData); } } else if (brand.equals("顶威")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4, receiveData.length() - 2))) { //表号,12位 String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); meterId = String.format("%012d", Long.parseLong(meterId)); if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equals("0102")) { String data = receiveData.substring(26, 28); data = ExchangeStringUtil.cutThree(data); data = ExchangeStringUtil.addZeroForNum(data, 2); if (data.equalsIgnoreCase("00")) {//全闭 waterLevelSet = "100"; //100% } else if (data.equalsIgnoreCase("01")) { waterLevelSet = "90"; //90% } else if (data.equalsIgnoreCase("03")) { waterLevelSet = "85"; } else if (data.equalsIgnoreCase("07")) { waterLevelSet = "80"; } else if (data.equalsIgnoreCase("0F")) { waterLevelSet = "75"; } else if (data.equalsIgnoreCase("1F")) { waterLevelSet = "70"; } else if (data.equalsIgnoreCase("3F")) { waterLevelSet = "65"; } else if (data.equalsIgnoreCase("7F")) { waterLevelSet = "60"; } else if (data.equalsIgnoreCase("FF")) { //全开 waterLevelSet = "50"; } else if (data.equalsIgnoreCase("24")) { waterLevelSet = "自动"; } nowDataService.saveNowHistoryData2(meterId, "水位开关", waterLevelSet, "levelSet", buildingId); log.info("水位开关号:" + meterId + ",保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0407")) { log.info("时间: " + dateStr + ",继电器ID: " + meterId + ",操作成功! "); } } } else { log.info("水位开关报文检验失败: " + receiveData); } } if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equals("0017") || registerAddr.equals("0018")) { if (l1.equals("12") || l1.equals("0001")) { waterLevelSet = "90"; } else if (l2.equals("12") || l2.equals("0001")) { waterLevelSet = "80"; } else if (l3.equals("12") || l3.equals("0001")) { waterLevelSet = "70"; } else if (l4.equals("12") || l4.equals("0001")) { waterLevelSet = "60"; } else if (l5.equals("12") || l5.equals("0001")) { waterLevelSet = "50"; } else if (l6.equals("12") || l6.equals("0001")) { waterLevelSet = "40"; } //全开或者全关 if (l1.equals("12") && l2.equals("12") && l3.equals("12") && l4.equals("12") && l5.equals("12") && l6.equals("12")) { waterLevelSet = "40"; } else if (l1.equals("11") && l2.equals("11") && l3.equals("11") && l4.equals("11") && l5.equals("11") && l6.equals("11")) { waterLevelSet = "100"; } else if (l1.equals("0001") && l2.equals("0001") && l3.equals("0001") && l4.equals("0001") && l5.equals("0001") && l6.equals("0001")) { waterLevelSet = "40"; } else if (l1.equals("0000") && l2.equals("0000") && l3.equals("0000") && l4.equals("0000") && l5.equals("0000") && l6.equals("0000")) { waterLevelSet = "100"; } nowDataService.saveNowHistoryData2(addr, "水位开关", waterLevelSet, "levelSet", buildingId); log.info("水位开关保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equals("0010")) { NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setBuildingId(buildingId); if (l1.equals("0001")) { //l路,0000表示有输入,0001表示无输入 publicData.setUseWater("运行"); //供水 publicData.setBackWater("运行");//回水 } else { publicData.setUseWater("不运行"); publicData.setBackWater("不运行"); } log.info("-----------------供水/回水状态:" + l1 + "-----------------"); if (l2.equals("0001")) { //2路 //补水 publicData.setUpWater("运行"); } else { publicData.setUpWater("不运行"); } log.info("-----------------补水状态:" + l2 + "-----------------"); nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("-----------------状态保存数据库成功!楼栋名称:" + buildingName + "-----------------"); } } // }); } // 水位开关,长度42,128 public String analysisRelayOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); Date date = new Date(); String dateStr = sdf1.format(date); String l1 = ""; String l2 = ""; String l3 = ""; String l4 = ""; String l5 = ""; String l6 = ""; String l7 = ""; String l8 = ""; String waterLevelSet = ""; String addr = ""; if (brand == null || brand.equals("") || brand.equals("中凯")) { // 检验报文 String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); //地址 if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 l1 = checkStr.substring(4, 6); l2 = checkStr.substring(20, 22); l3 = checkStr.substring(36, 38); l4 = checkStr.substring(52, 54); l5 = checkStr.substring(68, 70); l6 = checkStr.substring(84, 86); l7 = checkStr.substring(100, 102); l8 = checkStr.substring(116, 118); } else if (registerAddr.equalsIgnoreCase("0012")) { log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! "); } } } else if (brand.equals("远向")) { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equalsIgnoreCase("0018")) { l1 = checkStr.substring(6, 10); l2 = checkStr.substring(10, 14); l3 = checkStr.substring(14, 18); l4 = checkStr.substring(18, 22); l5 = checkStr.substring(22, 26); l6 = checkStr.substring(26, 30); l7 = checkStr.substring(30, 34); l8 = checkStr.substring(34, 38); } } } else if (checkStr.substring(2, 4).equalsIgnoreCase("06") || checkStr.substring(2, 4).equalsIgnoreCase("04")) { log.info("时间:" + dateStr + ",水位开关ID:" + addr + ",操作成功! "); } } else { log.info("水位开关报文检验失败: " + receiveData); } } else if (brand.equals("顶威")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4, receiveData.length() - 2))) { //表号,12位 String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); meterId = String.format("%012d", Long.parseLong(meterId)); if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equalsIgnoreCase("0102")) { String data = receiveData.substring(24, 26); data = ExchangeStringUtil.cutThree(data); data = ExchangeStringUtil.addZeroForNum(data, 2); if (data.equalsIgnoreCase("00")) {//全闭 waterLevelSet = "100"; //100% } else if (data.equalsIgnoreCase("01")) { waterLevelSet = "90"; } else if (data.equalsIgnoreCase("03")) { waterLevelSet = "85"; } else if (data.equalsIgnoreCase("07")) { waterLevelSet = "80"; } else if (data.equalsIgnoreCase("0F")) { waterLevelSet = "75"; } else if (data.equalsIgnoreCase("1F")) { waterLevelSet = "70"; } else if (data.equalsIgnoreCase("3F")) { waterLevelSet = "65"; } else if (data.equalsIgnoreCase("7F")) { waterLevelSet = "60"; } else if (data.equalsIgnoreCase("FF")) { //全开 waterLevelSet = "50"; } else if (data.equalsIgnoreCase("24")) { waterLevelSet = "自动"; } nowDataService.saveNowHistoryData2(meterId, "水位开关", waterLevelSet, "levelSet", buildingId); log.info("水位开关" + meterId + ",保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0407")) { log.info("时间:" + dateStr + ",继电器ID:" + meterId + ",操作成功! "); } } } else { log.info("水位开关报文检验失败: " + receiveData); } } if (registerAddr != null && !registerAddr.equals("")) { if (registerAddr.equals("0017") || registerAddr.equals("0018")) { if (l1.equals("12") || l1.equals("0001")) { waterLevelSet = "90"; } else if (l2.equals("12") || l2.equals("0001")) { waterLevelSet = "80"; } else if (l3.equals("12") || l3.equals("0001")) { waterLevelSet = "70"; } else if (l4.equals("12") || l4.equals("0001")) { waterLevelSet = "60"; } else if (l5.equals("12") || l5.equals("0001")) { waterLevelSet = "50"; } else if (l6.equals("12") || l6.equals("0001")) { waterLevelSet = "40"; } //全开或者全关 if (l1.equals("12") && l2.equals("12") && l3.equals("12") && l4.equals("12") && l5.equals("12") && l6.equals("12")) { waterLevelSet = "40"; } else if (l1.equals("11") && l2.equals("11") && l3.equals("11") && l4.equals("11") && l5.equals("11") && l6.equals("11")) { waterLevelSet = "100"; } else if (l1.equals("0001") && l2.equals("0001") && l3.equals("0001") && l4.equals("0001") && l5.equals("0001") && l6.equals("0001")) { waterLevelSet = "40"; } else if (l1.equals("0000") && l2.equals("0000") && l3.equals("0000") && l4.equals("0000") && l5.equals("0000") && l6.equals("0000")) { waterLevelSet = "100"; } nowDataService.saveNowHistoryData2(addr, "水位开关", waterLevelSet, "levelSet", buildingId); log.info("水位开关保存数据库成功!楼栋名称:" + buildingName); } } log.info("--------------水位:" + registerAddr + "," + waterLevelSet); return waterLevelSet; } // 热泵状态处理(水位开关),长度42,128 public void analysisPumpStateOrder(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { String dateStr = DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"); String l1 = ""; String l2 = ""; String l3 = ""; String l4 = ""; String l5 = ""; String l6 = ""; String l7 = ""; String l8 = ""; String runState = ""; String addr = ""; Map map = new HashMap(); if (brand == null || brand.equals("") || brand.equals("顶威")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文减,去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4, receiveData.length() - 2))) { //表号,12位 addr = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); addr = addr.replaceAll("^0*", ""); String data = checkStr.substring(24, 26); //截取数值 data = ExchangeStringUtil.cutThree(data); String strStatus = ExchangeStringUtil.hexString2binaryString(data); strStatus = String.format("%08d", Long.parseLong(strStatus)); if (strStatus.substring(7, 8).equals("1")) { l1 = "1"; } else { l1 = "0"; } if (strStatus.substring(6, 7).equals("1")) { l2 = "1"; } else { l2 = "0"; } if (strStatus.substring(5, 6).equals("1")) { l3 = "1"; } else { l3 = "0"; } if (strStatus.substring(4, 5).equals("1")) { l4 = "1"; } else { l4 = "0"; } if (strStatus.substring(3, 4).equals("1")) { l5 = "1"; } else { l5 = "0"; } if (strStatus.substring(2, 3).equals("1")) { l6 = "1"; } else { l6 = "0"; } if (strStatus.substring(1, 2).equals("1")) { l7 = "1"; } else { l7 = "0"; } if (strStatus.substring(0, 1).equals("1")) { l8 = "1"; } else { l8 = "0"; } } } else if (brand.equals("中凯")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文,减去校验码 addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); //if (registerAddr!=null && !registerAddr.equals("")) { //if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 l1 = checkStr.substring(4, 6); l2 = checkStr.substring(20, 22); l3 = checkStr.substring(36, 38); l4 = checkStr.substring(52, 54); l5 = checkStr.substring(68, 70); l6 = checkStr.substring(84, 86); l7 = checkStr.substring(100, 102); l8 = checkStr.substring(116, 118); //} else if (registerAddr.equals("0012")) { //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! "); //} //} } else if (brand.equals("远向")) { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 //if (checkStr.substring(2, 4).equals("03")) { //if (registerAddr!=null && !registerAddr.equals("")){ l1 = checkStr.substring(6, 10); l2 = checkStr.substring(10, 14); l3 = checkStr.substring(14, 18); l4 = checkStr.substring(18, 22); l5 = checkStr.substring(22, 26); l6 = checkStr.substring(26, 30); l7 = checkStr.substring(30, 34); l8 = checkStr.substring(34, 38); //} //} else if (checkStr.substring(2, 4).equals("06") || checkStr.substring(2, 4).equals("04")) { //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! " ); //} } else { log.info("热泵状态报文检验失败: " + receiveData); } } //if (registerAddr!=null && !registerAddr.equals("")){ //if (registerAddr.equals("0017") || registerAddr.equals("0010")){ if (l1.equals("12") || l1.equals("0001")) { //正常是0001 // if (l1.equals("12") || l1.equals("0000") || l1.equals("1")){ map.put("1", "运行"); } else { map.put("1", "不运行"); } if (l2.equals("12") || l2.equals("0001")) { // if (l2.equals("12") || l2.equals("0000") || l2.equals("1")){ map.put("2", "运行"); } else { map.put("2", "不运行"); } if (l3.equals("12") || l3.equals("0001")) { // if (l3.equals("12") || l3.equals("0000") || l3.equals("1")) { map.put("3", "运行"); } else { map.put("3", "不运行"); } if (l4.equals("12") || l4.equals("0001")) { // if (l4.equals("12") || l4.equals("0000") || l4.equals("1")){ map.put("4", "运行"); } else { map.put("4", "不运行"); } if (l5.equals("12") || l5.equals("0001")) { // if (l5.equals("12") || l5.equals("0000") || l5.equals("1")){ map.put("5", "运行"); } else { map.put("5", "不运行"); } if (l6.equals("12") || l6.equals("0001")) { // if (l6.equals("12") || l6.equals("0000") || l6.equals("1")){ map.put("6", "运行"); } else { map.put("6", "不运行"); } if (l7.equals("12") || l7.equals("0001")) { // if (l7.equals("12") || l7.equals("0000") || l7.equals("1")){ map.put("7", "运行"); } else { map.put("7", "不运行"); } if (l8.equals("12") || l8.equals("0001")) { // if (l8.equals("12") || l8.equals("0000") || l8.equals("1")){ map.put("8", "运行"); } else { map.put("8", "不运行"); } int count = buildingService.selectPumpCount(buildingId); //楼栋热泵数 if (count > 0) { for (Map.Entry entry : map.entrySet()) { addr = entry.getKey(); //获取Key值作为热泵ID runState = entry.getValue(); if (addr != null && Integer.valueOf(addr) <= count) { nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); } } log.info("热泵状态号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); } //} //} // }); } // 热泵状态处理(水位开关),长度42,128 public String analysisPumpStateOrder2(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { String result = "fail"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); String l1 = ""; String l2 = ""; String l3 = ""; String l4 = ""; String l5 = ""; String l6 = ""; String l7 = ""; String l8 = ""; String runState = ""; String addr = ""; Map map = new HashMap(); if (brand == null || brand.equals("") || brand.equals("顶威")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文减,去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 if (checkNum.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4, receiveData.length() - 2))) { //表号,12位 addr = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); addr = addr.replaceAll("^0*", ""); String data = checkStr.substring(24, 26); //截取数值 data = ExchangeStringUtil.cutThree(data); String strStatus = ExchangeStringUtil.hexString2binaryString(data); strStatus = String.format("%08d", Long.parseLong(strStatus)); if (strStatus.substring(7, 8).equals("1")) { l1 = "1"; } else { l1 = "0"; } if (strStatus.substring(6, 7).equals("1")) { l2 = "1"; } else { l2 = "0"; } if (strStatus.substring(5, 6).equals("1")) { l3 = "1"; } else { l3 = "0"; } if (strStatus.substring(4, 5).equals("1")) { l4 = "1"; } else { l4 = "0"; } if (strStatus.substring(3, 4).equals("1")) { l5 = "1"; } else { l5 = "0"; } if (strStatus.substring(2, 3).equals("1")) { l6 = "1"; } else { l6 = "0"; } if (strStatus.substring(1, 2).equals("1")) { l7 = "1"; } else { l7 = "0"; } if (strStatus.substring(0, 1).equals("1")) { l8 = "1"; } else { l8 = "0"; } } } else if (brand.equals("中凯")) { String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文,减去校验码 addr = ExchangeStringUtil.hexToDec(checkStr.substring(2, 4)); //if (registerAddr!=null && !registerAddr.equals("")) { //if (registerAddr.equalsIgnoreCase("0017")) { //中凯拿功能码作为寄存器地址用 l1 = checkStr.substring(4, 6); l2 = checkStr.substring(20, 22); l3 = checkStr.substring(36, 38); l4 = checkStr.substring(52, 54); l5 = checkStr.substring(68, 70); l6 = checkStr.substring(84, 86); l7 = checkStr.substring(100, 102); l8 = checkStr.substring(116, 118); //} else if (registerAddr.equals("0012")) { //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! "); //} //} } else if (brand.equals("远向")) { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 //if (checkStr.substring(2, 4).equals("03")) { //if (registerAddr!=null && !registerAddr.equals("")){ l1 = checkStr.substring(6, 10); l2 = checkStr.substring(10, 14); l3 = checkStr.substring(14, 18); l4 = checkStr.substring(18, 22); l5 = checkStr.substring(22, 26); l6 = checkStr.substring(26, 30); l7 = checkStr.substring(30, 34); l8 = checkStr.substring(34, 38); //} //} else if (checkStr.substring(2, 4).equals("06") || checkStr.substring(2, 4).equals("04")) { //log.info("时间: " + dateStr + ",热泵状态号: " + addr + ",操作成功! " ); //} } else { log.info("热泵状态报文检验失败: " + receiveData); } } //if (registerAddr!=null && !registerAddr.equals("")){ //if (registerAddr.equals("0017") || registerAddr.equals("0010")){ if (l1.equals("12") || l1.equals("0001")) { //正常是0001 // if (l1.equals("12") || l1.equals("0000") || l1.equals("1")){ map.put("1", "运行"); } else { map.put("1", "不运行"); } if (l2.equals("12") || l2.equals("0001")) { // if (l2.equals("12") || l2.equals("0000") || l2.equals("1")){ map.put("2", "运行"); } else { map.put("2", "不运行"); } if (l3.equals("12") || l3.equals("0001")) { // if (l3.equals("12") || l3.equals("0000") || l3.equals("1")) { map.put("3", "运行"); } else { map.put("3", "不运行"); } if (l4.equals("12") || l4.equals("0001")) { // if (l4.equals("12") || l4.equals("0000") || l4.equals("1")){ map.put("4", "运行"); } else { map.put("4", "不运行"); } if (l5.equals("12") || l5.equals("0001")) { // if (l5.equals("12") || l5.equals("0000") || l5.equals("1")){ map.put("5", "运行"); } else { map.put("5", "不运行"); } if (l6.equals("12") || l6.equals("0001")) { // if (l6.equals("12") || l6.equals("0000") || l6.equals("1")){ map.put("6", "运行"); } else { map.put("6", "不运行"); } if (l7.equals("12") || l7.equals("0001")) { // if (l7.equals("12") || l7.equals("0000") || l7.equals("1")){ map.put("7", "运行"); } else { map.put("7", "不运行"); } if (l8.equals("12") || l8.equals("0001")) { // if (l8.equals("12") || l8.equals("0000") || l8.equals("1")){ map.put("8", "运行"); } else { map.put("8", "不运行"); } int count = buildingService.selectPumpCount(buildingId); //楼栋热泵数 if (count > 0) { for (Map.Entry entry : map.entrySet()) { addr = entry.getKey(); //获取Key值作为热泵ID runState = entry.getValue(); if (addr != null && Integer.valueOf(addr) <= count) { nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); } } log.info("热泵状态号" + addr + ",保存数据库成功!楼栋名称:" + buildingName); result = JSON.toJSONString(map); //map转json字符串 } //} //} return result; } //状态检测 public void analysisStateOrder485(final String dataStr, final String registerAddr, final String brand, String buildingId, String buildingName) { if (dataStr.length() == 30) { //检验报文 String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 //返回的校验码与重新生成的校验码进行校验 if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { //表号,12位 String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); meterId = meterId.replaceAll("^0*", ""); //数值 String data = checkStr.substring(24, 26); data = ExchangeStringUtil.cutThree(data); String strStatus = ExchangeStringUtil.hexString2binaryString(data); strStatus = String.format("%08d", Long.parseLong(strStatus)); String backWater; if (strStatus.substring(7, 8).equals("1")) {//回水 backWater = "运行"; } else { backWater = "不运行"; } String hotPump; if (strStatus.substring(6, 7).equals("1")) {//热泵 hotPump = "运行"; } else { hotPump = "不运行"; } String upWater; if (strStatus.substring(5, 6).equals("1")) {//上水或者补水 upWater = "运行"; } else { upWater = "不运行"; } String useWater; if (strStatus.substring(4, 5).equals("1")) {//用水或者供水 useWater = "运行"; } else { useWater = "不运行"; } NowPublicDataEntity publicData = new NowPublicDataEntity(); publicData.setUseWater(useWater); publicData.setUpWater(upWater); publicData.setBackWater(backWater); publicData.setBuildingId(buildingId); try { //通过状态检测保存热泵状态 nowDataService.saveNowHistoryData2(meterId, "状态检测", hotPump, "runState", buildingId); nowPublicDataService.saveNowHistoryPublicData(publicData); nowDataService.proPumpMinutes(buildingId, "1", hotPump); //如果只有一台热泵,pumpId为1 log.info("状态ID:" + meterId + ",回水:" + backWater + ",补水:" + upWater + ",供水:" + useWater + ",热泵:" + hotPump + ",保存数据成功!楼栋:" + buildingName); } catch (Exception e) { log.error("解析状态检测异常==>", e); } } else { log.info("状态检测报文检验失败: " + dataStr); } } } //时间控制器,长度26、22 public void analysisTimeSetOrder485(final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { // threadPoolService.execute(() -> { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); // 检验报文 String checkStr = receiveData.substring(0, receiveData.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); String sValue = null; if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("时控报文检验成功: " + receiveData); //地址 String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); log.info("时控号: " + addr); // System.out.println("时控号: " + addr); String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 int rec = receiveData.length(); if (rec == 26) { //读时间设置值 data = checkStr.substring(6, rec - 4); String curTimeBegin1 = data.substring(0, 2) + ":" + data.substring(2, 4); String curTimeEnd1 = data.substring(4, 6) + ":" + data.substring(6, 8); String curTimeBegin2 = data.substring(8, 10) + ":" + data.substring(10, 12); String curTimeEnd2 = data.substring(12, 14) + ":" + data.substring(14, 16); } else if (rec == 22) { //读校对时间 data = checkStr.substring(8, rec - 4); String strDate = "20" + data.substring(0, 2) + "-" + data.substring(2, 4) + "-" + data.substring(4, 6); //拼接日期 String strTime = data.substring(6, 8) + ":" + data.substring(8, 10); //拼接时间 } } else if (checkStr.substring(2, 4).equalsIgnoreCase("05") || checkStr.substring(2, 4).equalsIgnoreCase("10")) { log.info("时间: " + dateStr + ",时控ID: " + addr + ",操作成功! "); // System.out.println("时间: " + dateStr + ",时控ID: " + addr + ",操作成功! "); } } // }); } //时间控制器,长度26、22 public String analysisTimeSetOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) { String result = "fail"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); // 去掉空格 // String receiveData = receiveData1.replace(" ", ""); // 检验报文 String checkStr = receiveData.substring(0, receiveData.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); String sValue = null; if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { log.info("时控报文检验成功: " + receiveData); // System.out.println("时控报文检验成功: " + receiveData); //地址 String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); log.info("时控号:" + addr); // System.out.println("时控号: " + addr); String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 int rec = receiveData.length(); if (rec == 26) { //读时间设置值 data = checkStr.substring(6, rec - 4); String curTimeBegin1 = data.substring(0, 2) + ":" + data.substring(2, 4); String curTimeEnd1 = data.substring(4, 6) + ":" + data.substring(6, 8); String curTimeBegin2 = data.substring(8, 10) + ":" + data.substring(10, 12); String curTimeEnd2 = data.substring(12, 14) + ":" + data.substring(14, 16); } else if (rec == 22) { //读校对时间 data = checkStr.substring(8, rec - 4); String strDate = "20" + data.substring(0, 2) + "-" + data.substring(2, 4) + "-" + data.substring(4, 6); //拼接日期 String strTime = data.substring(6, 8) + ":" + data.substring(8, 10); //拼接时间 } result = data; } else if (checkStr.substring(2, 4).equalsIgnoreCase("05") || checkStr.substring(2, 4).equalsIgnoreCase("10")) { log.info("时间:" + dateStr + ",时控ID:" + addr + ",操作成功! "); // System.out.println("时间: " + dateStr + ",时控ID: " + addr + ",操作成功! "); result = "success"; } } return result; } public static int dValue(String lastDate) throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date lastTime = format.parse(lastDate); long min = lastTime.getTime(); Calendar calendar = Calendar.getInstance(); long min1 = calendar.getTimeInMillis(); long subtract = min1 - min; // System.out.println("相减值:" + subtract/(1000*60)); return (int) subtract / (1000 * 60); } // 判断是否存在寄存器地址 public Boolean queryRegisterAddr(List stringList, String registerAddr) { boolean flag = false; for (int i = 0; i < stringList.size(); i++) { if (stringList.get(i).equalsIgnoreCase(registerAddr)) { flag = true; break; } } return flag; } }