From caf7bff21d0d4392af218f51d98467e86bf843ed Mon Sep 17 00:00:00 2001 From: "3067418132@qq.com" Date: Mon, 11 May 2026 13:40:20 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=83=AD=E6=B3=B5=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=B2=98=E5=8C=85=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mh/user/strategy/HeatPumpStrategy.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java b/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java index a13f092..a4f61ac 100644 --- a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java +++ b/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; }