Browse Source

1、热泵增加粘包过滤

dev
3067418132@qq.com 1 week ago
parent
commit
caf7bff21d
  1. 24
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java

24
user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java

@ -228,12 +228,32 @@ public class HeatPumpStrategy implements DeviceStrategy {
@Override
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 sValue = null;
StringBuffer dataType = new StringBuffer();
String rtData = Constant.FAIL;
if (!checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) {
if (!checkWord.equalsIgnoreCase(processedDataStr.substring(processedDataStr.length() - 4))) {
log.info("热泵报文检验失败: " + dataStr);
return Constant.FAIL;
}

Loading…
Cancel
Save