|
|
|
@ -228,12 +228,32 @@ public class HeatPumpStrategy implements DeviceStrategy { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { |
|
|
|
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { |
|
|
|
String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文
|
|
|
|
// 发送:0304042100016112
|
|
|
|
|
|
|
|
// 返回:03040201BA40D3 03840CE2C5
|
|
|
|
|
|
|
|
// 处理占包情况,根据第一个报文的数据长度动态截取
|
|
|
|
|
|
|
|
String processedDataStr = dataStr; |
|
|
|
|
|
|
|
if (dataStr.length() > 12) { // 至少包含地址(2)+功能码(2)+字节数(2)+数据+校验(4)
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
// 获取数据字节数(第5-6位字符,即索引4-5)
|
|
|
|
|
|
|
|
String byteCountHex = dataStr.substring(4, 6); |
|
|
|
|
|
|
|
int byteCount = Integer.parseInt(byteCountHex, 16); |
|
|
|
|
|
|
|
// 计算完整报文长度:地址(2)+功能码(2)+字节数(2)+数据(byteCount*2)+校验(4)
|
|
|
|
|
|
|
|
int expectedLength = 2 + 2 + 2 + (byteCount * 2) + 4; |
|
|
|
|
|
|
|
if (dataStr.length() > expectedLength) { |
|
|
|
|
|
|
|
// 存在占包,只取第一个完整报文
|
|
|
|
|
|
|
|
processedDataStr = dataStr.substring(0, expectedLength); |
|
|
|
|
|
|
|
log.info("检测到占包情况,原始报文: " + dataStr + ", 预期长度: " + expectedLength + ", 截取后报文: " + processedDataStr); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
|
|
log.warn("解析报文长度失败,使用原始报文: " + dataStr, e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
String checkStr = processedDataStr.substring(0, processedDataStr.length() - 4);//检验报文
|
|
|
|
String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码
|
|
|
|
String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码
|
|
|
|
String sValue = null; |
|
|
|
String sValue = null; |
|
|
|
StringBuffer dataType = new StringBuffer(); |
|
|
|
StringBuffer dataType = new StringBuffer(); |
|
|
|
String rtData = Constant.FAIL; |
|
|
|
String rtData = Constant.FAIL; |
|
|
|
if (!checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { |
|
|
|
if (!checkWord.equalsIgnoreCase(processedDataStr.substring(processedDataStr.length() - 4))) { |
|
|
|
log.info("热泵报文检验失败: " + dataStr); |
|
|
|
log.info("热泵报文检验失败: " + dataStr); |
|
|
|
return Constant.FAIL; |
|
|
|
return Constant.FAIL; |
|
|
|
} |
|
|
|
} |
|
|
|
|