From d8eb22351c6d0bfe0c9f233edfd593538e6838c9 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期四, 24 四月 2025 13:58:49 +0800
Subject: [PATCH] 1、表阀一体机协议开阀类型变化; 2、表阀一体机协议开关阀报中增加水价数据;

---
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/PrefixedDataAvailableV2.java |  134 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 134 insertions(+), 0 deletions(-)

diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/PrefixedDataAvailableV2.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/PrefixedDataAvailableV2.java
new file mode 100644
index 0000000..74ba6f7
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/PrefixedDataAvailableV2.java
@@ -0,0 +1,134 @@
+package com.dy.common.mw.protocol.p206V2;
+
+import com.dy.common.mw.channel.tcp.PrefixedDataAvailableStatus;
+import com.dy.common.mw.protocol.AnnotationPrefixedDataAvailable;
+import com.dy.common.mw.protocol.PrefixedDataAvailable;
+import com.dy.common.util.ByteUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.mina.core.buffer.BufferDataException;
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.session.IoSession;
+
+
+@AnnotationPrefixedDataAvailable(
+		enable = true,
+		protocolName = ProtocolConstantV206V2.protocolName,
+		protocolVersion = ProtocolConstantV206V2.protocolVer,
+		priority = ProtocolConstantV206V2.priority,
+		onLineDataMinLength = ProtocolConstantV206V2.onLineDataMinLength,
+		headMinLength = ProtocolConstantV206V2.headMinLength)
+@SuppressWarnings("unused")
+public class PrefixedDataAvailableV2 implements PrefixedDataAvailable {
+
+	private static final Logger log = LogManager.getLogger(PrefixedDataAvailableV2.class) ;
+	
+	private static final String protocolName = ProtocolConstantV206V2.protocolName ;
+	private static final short protocolVersion = ProtocolConstantV206V2.protocolVer ;
+
+	/**
+	 * 鍒嗘瀽涓婄嚎鏁版嵁(缃戠粶杩炴帴鍚庣涓�鍖呮暟鎹�)鏄惁鍙幏寰�
+	 * @param in IoBuffer
+	 * @param remain 涓�瀹氭椂澶т簬0鐨勬暟鎹�
+	 * @param minDataLength 鏈�灏忔暟鎹暱搴�
+	 * @param maxDataLength 鏈�澶ф暟鎹暱搴︼紝杈惧埌鎴栬秴杩囨闀垮害锛岃涓烘槸鍨冨溇鏁版嵁銆備緥濡傦細鏁版嵁澶撮儴鏄纭殑锛屼絾鍚堟硶鏁版嵁缁撳熬鎬讳笉鍑虹幇锛岃涓烘鏁版嵁鍨冨溇鏁版嵁
+	 * @return 涓嶆槸鏈崗璁暟鎹椂杩斿洖绌�
+	 * @throws Exception 寮傚父
+	 */
+	public PrefixedDataAvailableStatus forOnLine(IoSession ioSession,
+												 IoBuffer in,
+												 int remain,
+												 int minDataLength, //瀵瑰簲ProtocolConstantV2_0.onLineDataMinLength
+												 int maxDataLength //瀵瑰簲ProtocolConstant.errorMaxLength
+												 ) throws Exception {
+		
+		int oldPosition = in.position() ;
+		byte[] preByte = new byte[remain];
+		in.get(preByte) ;
+		//in.position(0) ;//閿欒鐢ㄦ硶锛屽鏋滃彂鐢熺矘鍖呮暟鎹紝灏嗕細姝诲惊鐜�
+		in.position(oldPosition) ;
+
+		return this.doForData(ioSession, preByte, minDataLength, maxDataLength) ;
+	}
+
+	/**
+	 * 鍒嗘瀽涓婄嚎鍚�(缃戠粶杩炴帴鍚庨潪绗竴鍖呮暟鎹�)鏄惁鍙幏寰�
+	 * @param in IoBuffer
+	 * @param remain  鍓╀綑
+	 * @param minDataLength 鏈�灏忔暟鎹暱搴�
+	 * @param maxDataLength 鏈�澶ф暟鎹暱搴�
+	 * @return PrefixedDataAvailableStatus
+	 * @throws Exception 寮傚父
+	 */
+	@Override
+	public PrefixedDataAvailableStatus forUpData(IoSession ioSession,
+												 IoBuffer in,
+												 int remain,
+												 int minDataLength,
+												 int maxDataLength) throws Exception {
+		int oldPosition = in.position() ;
+		byte[] preByte = new byte[remain];
+		in.get(preByte) ;
+		//in.position(0) ;//閿欒鐢ㄦ硶锛屽鏋滃彂鐢熺矘鍖呮暟鎹紝灏嗕細姝诲惊鐜�
+		in.position(oldPosition) ;
+		
+		return this.doForData(ioSession, preByte, minDataLength, maxDataLength) ;
+
+    }
+	/**
+	 * 杩涜鍒ゆ柇
+	 * @param ioSession ioSession
+	 * @param preByte byte[]
+	 * @param minDataLength 鏈�灏忔暟鎹暱搴�
+	 * @param maxDataLength 鏈�澶ф暟鎹暱搴�
+	 * @return PrefixedDataAvailableStatus
+	 * @throws Exception 寮傚父
+	 */
+	private PrefixedDataAvailableStatus doForData(IoSession ioSession, byte[] preByte, int minDataLength, int maxDataLength) throws Exception{
+		int remain = preByte.length ;
+    	
+        if (remain < minDataLength) {
+        	log.warn("鍩轰簬鍗忚锛�" + (protocolName + protocolVersion) + "锛夊垽鏂暟鎹ご閮ㄥ彂鐢熸柇鍖呯幇璞°��") ;
+            return new PrefixedDataAvailableStatus().breaked() ;
+        }
+        
+        if(remain >= maxDataLength){
+			//瓒呭嚭浜嗘渶澶ч暱搴﹂檺鍒�,渚嬪锛氭暟鎹ご閮ㄦ槸姝g‘鐨勶紝浣嗗悎娉曟暟鎹粨灏炬�讳笉鍑虹幇锛岃涓烘鏁版嵁鍨冨溇鏁版嵁
+			return new PrefixedDataAvailableStatus().rubbish(remain) ;
+		}
+
+        CommonV2 parseCommon = new CommonV2();
+		Boolean[] isThisProtocolData = parseCommon.isThisProtocolHead(preByte) ;
+		if(isThisProtocolData == null || isThisProtocolData.length != 2 || !isThisProtocolData[0].booleanValue()){
+			//涓嶆槸鏈崗璁暟鎹�
+			return null ;
+		}
+
+		Integer dataLen = parseCommon.parseFrameLen(preByte, isThisProtocolData[1]) ;
+
+		if(dataLen == null){
+			String headHex = ByteUtil.bytes2Hex(preByte, true) ;
+			throw new BufferDataException("鏀跺埌鏁版嵁涔嬪抚鍓嶉儴锛�" + headHex + "锛屼絾涓ラ噸閿欒锛屽湪杩涜鏂寘涓庣矘鍖呮鏌ユ椂锛屾湭鑳藉緱鍒版暟鎹抚鐨勯暱搴︺��");
+		}
+		
+        if (dataLen <= 0 || dataLen > maxDataLength) {
+			String headHex = ByteUtil.bytes2Hex(preByte, true) ;
+            throw new BufferDataException("鏀跺埌鏁版嵁涔嬪抚鍓嶉儴锛�" + headHex + "锛屼絾涓ラ噸閿欒锛屽湪杩涜鏂寘涓庣矘鍖呮鏌ユ椂锛屾暟鎹抚鐨勯暱搴�(" + dataLen + ")瓒呭嚭鍚堟硶鑼冨洿銆�");
+        }
+        
+        if(remain == dataLen){
+        	//涓嶆柇涓嶇矘
+            return new PrefixedDataAvailableStatus().completed(dataLen, protocolName, protocolVersion) ;
+        }else if(remain > dataLen){
+			String headHex = ByteUtil.bytes2Hex(preByte, true) ;
+        	log.warn("鏀跺埌鏁版嵁涔嬪抚鍓嶉儴锛�" + headHex + "锛屼絾鍙戠敓绮樺寘鐜拌薄銆�") ;
+            return new PrefixedDataAvailableStatus().adjoined(dataLen, protocolName, protocolVersion) ;
+        }else{
+        	// remain < dataLen
+			String headHex = ByteUtil.bytes2Hex(preByte, true) ;
+        	log.warn("鏀跺埌鏁版嵁涔嬪抚鍓嶉儴锛�" + headHex + "锛屼絾鍙戠敓鏂寘鐜拌薄銆�") ;
+            return new PrefixedDataAvailableStatus().breaked() ;
+        }
+	}
+
+}

--
Gitblit v1.8.0