中央热水项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1741 lines
99 KiB

package com.mh.user.utils;
import com.alibaba.fastjson2.JSON;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant;
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 = "";
// 68 10 3987835C03000081B31CDA1C006502002C006502002C0000000000000000FF3416
if (dataStr.length() == 44 || dataStr.length() == 70 || dataStr.length() == 72) {
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);
return data;
}
} 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);
return data;
}
}
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 + ",操作成功! ");
return Constant.SUCCESS;
}
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 = ExchangeStringUtil.hexToDec(checkStr.substring(8, 10)) + ExchangeStringUtil.hexToDec(checkStr.substring(12, 14));
String closetTime = ExchangeStringUtil.hexToDec(checkStr.substring(16, 18)) + ExchangeStringUtil.hexToDec(checkStr.substring(20, 22));
sValue = startTime + closetTime;
}
rtData = sValue;
} else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
} 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")) { //读定时设置值
// 01 03 08 0003 0000 0016 0000 4713
String startTime = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(10, 14)), 2);
String closetTime = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(14, 18)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(18, 22)), 2);
sValue = startTime + closetTime;
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
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<String, String> 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<String, String> 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<String, String> 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<String, String> 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);
// 更新device_install数据
deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId);
nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId);
log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName);
nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位
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;
// 更新device_install数据
deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId);
nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId);
log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName);
nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位
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<String, String> map = new HashMap<String, String>();
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<String, String> 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<String, String> map = new HashMap<String, String>();
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<String, String> 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<String> 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;
}
}