From 656aa4f953eb52502a6414965e46642c31b6e8ee Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期二, 29 四月 2025 15:33:09 +0800
Subject: [PATCH] 设备会在多种功能码上报数据中携带报警与状态数据,这样数据库保存设备报警与状态数据可能很多,为此修改逻辑,当前实现为一设备一个小时内只保存一条报警与状态数据。

---
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/RtuUpTask.java |  251 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 251 insertions(+), 0 deletions(-)

diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/RtuUpTask.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/RtuUpTask.java
new file mode 100644
index 0000000..06c34ed
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/RtuUpTask.java
@@ -0,0 +1,251 @@
+package com.dy.rtuMw.server.tasks;
+
+import java.net.InetSocketAddress;
+
+import com.dy.common.mw.protocol.*;
+import com.dy.common.springUtil.SpringContextUtil;
+import com.dy.common.util.Callback;
+import com.dy.rtuMw.server.upgrade.UpgradeUnit;
+import com.dy.rtuMw.web.com.CommandCtrl;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.mina.core.session.IoSession;
+
+import com.dy.common.mw.channel.tcp.TcpIoSessionAttrIdIsRtuAddr;
+import com.dy.common.mw.channel.tcp.TcpUnit;
+import com.dy.common.mw.core.CoreTask;
+import com.dy.rtuMw.server.ServerProperties;
+import com.dy.rtuMw.server.forTcp.RtuLogDealer;
+import com.dy.rtuMw.server.forTcp.RtuStatusDealer;
+import com.dy.rtuMw.server.forTcp.TcpSessionCache;
+import com.dy.common.util.ByteUtil;
+
+public class RtuUpTask extends CoreTask {
+	
+	private static final Logger log = LogManager.getLogger(RtuUpTask.class.getName());
+
+	@Override
+	public Integer execute() {
+		Object[] os = (Object[])this.data ;
+		IoSession session = (IoSession)os[0] ;
+		byte[] upBuf = (byte[])os[1] ;
+		try {
+			this.upData(session, upBuf);
+		} catch (Exception e) {
+			log.error("瑙f瀽涓婅鏁版嵁鍑洪敊" + (e.getMessage()==null?"!":("锛�" + e.getMessage())) ,e);
+		}
+		return null ;
+	}
+
+	/**
+	 * RTU涓婅鏁版嵁
+	 * @param session IO浼氳瘽
+	 * @param upBuf 涓婅鏁版嵁
+	 */
+	private void upData(IoSession session, byte[] upBuf) throws Exception{
+		if(upBuf == null){
+			log.error("鍑洪敊锛屾敹鍒癛TU鐨勬暟鎹负绌猴紒") ;
+			return ;
+		}
+		String upHex = null ;
+		try {
+			upHex = ByteUtil.bytes2Hex(upBuf , true) ;
+			log.info("鏀跺埌RTU鏁版嵁:" + upHex) ;
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("灏嗘暟鎹浆鎹负鍗佸叚杩涘埗鏃跺嚭閿欙紒" ) ;
+		}
+		String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrRtuAddr) ;
+		String protocolName = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName) ;
+		Short protocolVersion = (Short)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolVersion) ;
+		boolean isOnLine = false ;
+		if(rtuAddr == null){
+			//璇存槑鍒氬缓绔嬬綉缁滆繛鎺ワ紝姝ゆ暟鎹簲璇ユ槸涓婄嚎鏁版嵁
+			isOnLine = true ;
+			Object[] rtuAddrProtocolNameVersion = this.parseOnLine(session, upBuf) ;
+			if(rtuAddrProtocolNameVersion.length == 3){
+				//瑙f瀽涓婄嚎鏁版嵁鎴愬姛锛屽苟瑙f瀽鍑篟TU鍦板潃鍙婇�氫俊鍗忚鍚嶇О
+				rtuAddr = (String)rtuAddrProtocolNameVersion[0] ;
+				protocolName = (String)rtuAddrProtocolNameVersion[1] ;
+				protocolVersion = (Short)rtuAddrProtocolNameVersion[2] ;
+
+				if(rtuAddr != null && protocolName != null && protocolVersion != null){
+					//璁剧疆session鐨勫睘鎬D
+					TcpUnit.getInstance().setIoSessionArrs(session, rtuAddr, protocolName, protocolVersion) ;
+					//缂撳瓨session
+					TcpSessionCache.putNewTcpSession(rtuAddr, session);
+					
+					log.info("RTU(鍦板潃锛�" + rtuAddr + "锛屽崗璁細" + protocolName + "锛岀増鏈彿锛�" + protocolVersion + ")涓婄嚎浜嗐��") ;
+				}
+			}
+		}
+		if(rtuAddr != null){
+			boolean toDeal = true ;
+			if(ServerProperties.onlyDealRtusTest){
+				boolean find = false ;
+				for(String testRtu : ServerProperties.onlyDealRtus){
+					if(testRtu.equals(rtuAddr)){
+						find = true ;
+						break ;
+					}
+				}
+				if(!find){
+					//涓嶅湪澶勭悊鑼冨洿鍐�
+					toDeal = false ;
+				}
+			}
+			if(toDeal){
+				/*
+				if(protocolName == null){
+					Object[] objs = TcpSessionCache.getTcpProtocolNameVersion(rtuAddr) ;
+					protocolName = (String)objs[0] ;
+					protocolVersion = (Short)objs[1] ;
+				}
+				*/
+
+				//璁剧疆鏀跺埌鏁版嵁鏃跺埢
+				TcpSessionCache.whenUpData(rtuAddr);
+
+				if(protocolName != null){
+					//瀵逛笂琛屾暟鎹繘琛屽鐞�
+					this.dealUpData(session, rtuAddr, protocolName, protocolVersion, isOnLine, upBuf, upHex) ;
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 瑙f瀽涓婄嚎鏁版嵁
+	 * @param session IO浼氳瘽
+	 * @param upBuf 涓婅鏁版嵁
+	 */
+	private Object[] parseOnLine(IoSession session, byte[] upBuf){
+		String rtuAddr = null ;
+		String protocolName = null ;
+		Short protocolVersion = null ;
+		try {
+			OnLine.OnLineResult rs = new OnLineHandle().parse(upBuf) ;
+			if(rs == null 
+					|| rs.result == OnLine.OnLineAction_fail 
+					|| rs.result == OnLine.OnLineAction_success_noMe){
+				log.error("涓ラ噸閿欒锛岃В鏋愪笂绾挎暟鎹け璐� 锛�" ) ;
+			}else if(rs.result == OnLine.OnLineAction_success){
+				if(rs.rtuAddr == null){
+					log.error("涓ラ噸閿欒锛岃В鏋愪笂绾跨粨鏋滀腑RTU鍦板潃涓虹┖ 锛�" ) ;
+				}else{
+					rtuAddr = rs.rtuAddr ;
+				}
+				if(rs.protocolName == null){
+					log.error("涓ラ噸閿欒锛岃В鏋愪笂绾跨粨鏋滀腑鍗忚鍚嶇О涓虹┖ 锛�" ) ;
+				}else{
+					protocolName = rs.protocolName ;
+					protocolVersion = rs.protocolVersion ;
+				}
+			}else if(rs.result == OnLine.OnLineAction_success_response){
+				if(rs.remoteData != null && rs.remoteData.length > 0){
+					session.write(rs.remoteData) ;
+				}else{
+					log.error("涓ラ噸閿欒锛岃В鏋愪笂绾挎垚鍔燂紝骞堕渶瑕佸洖鍐欐暟鎹紝浣嗘暟鎹负绌� 锛�" ) ;
+				}
+			}
+		} catch (Exception e) {
+			log.error("涓ラ噸閿欒锛屽垎鏋愪笂绾挎暟鎹椂浜х敓寮傚父 锛乗n" + e.getMessage() , e) ;
+		}
+		return new Object[]{rtuAddr, protocolName, protocolVersion} ;
+	}
+	
+	
+	/**
+	 * 澶勭悊涓婅鏁版嵁
+	 * @param session IO浼氳瘽
+	 * @param rtuAddrAtHead 鎺у埗鍣ㄥ湴鍧�澶撮儴
+	 * @param protocolName 鍗忚鍚嶇О
+	 * @param protocolVersion 鍗忚鐗堟湰鍙�
+	 * @param isOnLine 鏄惁涓婄嚎鏁版嵁
+	 * @param upBuf 涓婅鏁版嵁
+	 * @param upHex 涓婅鏁版嵁
+	 * @throws Exception 寮傚父
+	 */
+	private void dealUpData(IoSession session,
+							String rtuAddrAtHead,
+							String protocolName,
+							Short protocolVersion,
+							boolean isOnLine,
+							byte[] upBuf,
+							String upHex) throws Exception{
+		Driver dri = ProtocolCache.getDriver(protocolName, protocolVersion) ;
+		if(dri == null){
+			log.error("涓ラ噸閿欒锛屾湭鑳藉緱鍒板崗璁�" + protocolName + "椹卞姩绫诲疄渚嬶紒");
+		}else{
+			MidResult[] midRs = dri.parseData(ServerProperties.isLowPower, rtuAddrAtHead, upBuf, upHex, new DriverParserDataCallback(){
+				@Override
+				public void callback(String rtuAddrAtHead,
+									 String code,
+									 String codeName,
+									 String upHex,
+									 Boolean reportOrResponse_trueOrFalse,
+									 boolean parseFail,
+									 String rtuAddrInData,
+									 Object ...objs) {
+					//鏇存柊缁堢鐘舵��
+					if(rtuAddrInData != null && !rtuAddrInData.equals(rtuAddrAtHead)){
+						//鏁版嵁澶翠腑鐨凴TU鍦板潃涓庢暟鎹腑鐨凴TU鍦板潃涓嶄竴鑷达紝鏇存崲鎴愭暟鎹腑鐨凴TU鍦板潃
+						TcpSessionCache.changeRtuAddr(rtuAddrAtHead, rtuAddrInData, session);
+						session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrRtuAddr, rtuAddrInData) ;
+					}
+
+					String rtuAddr ;
+					if(rtuAddrInData != null){
+						rtuAddr = rtuAddrInData  ;
+					}else{
+						rtuAddr = rtuAddrAtHead ;
+					}
+
+					InetSocketAddress sa = (InetSocketAddress)session.getRemoteAddress() ;
+					if(isOnLine){
+						//涓婄嚎浜�
+						RtuStatusDealer.onLine(rtuAddr, sa.getAddress().getHostAddress(), sa.getPort(), protocolName, protocolVersion);
+					}
+					if(reportOrResponse_trueOrFalse != null && reportOrResponse_trueOrFalse){
+						RtuStatusDealer.upAutoReport(rtuAddr, code, codeName, upBuf.length) ;
+					}else{
+						RtuStatusDealer.upData(rtuAddr, code, codeName, upBuf.length) ;
+					}
+
+					//璁板綍鏃ュ織
+					if(parseFail){
+						RtuLogDealer.log(rtuAddr, (isOnLine?"涓婄嚎鏁版嵁 ":"涓婅鏁版嵁 ") +  code + ("锛�" + codeName + "锛�") + "锛�" + upHex + "锛堣В鏋愬け璐ワ級");
+					}else{
+						RtuLogDealer.log(rtuAddr, (isOnLine?"涓婄嚎鏁版嵁 ":"涓婅鏁版嵁 ") +  code + ("锛�" + codeName + "锛�") + "锛�" + upHex);
+					}
+
+					//瑙﹀彂杩滅▼RTU杞欢鍗囩骇
+					UpgradeUnit.getInstance().trigger(rtuAddr, code, protocolName, protocolVersion, new Callback() {
+						@Override
+						public void call(Object obj) {
+							if(obj != null){
+								Command com = (Command)obj ;
+								CommandCtrl comCtrl = SpringContextUtil.getBean(CommandCtrl.class) ;
+								if(comCtrl != null){
+									comCtrl.sendOutComFromLocal(com) ;
+								}
+							}
+						}
+						@Override
+						public void call(Object... objs) {
+						}
+						@Override
+						public void exception(Exception e) {
+						}
+					}, objs);
+				}
+			}) ;
+			if(midRs != null){
+				for(MidResult rs : midRs){
+					rs.action();
+				}
+			}
+		}
+	}
+
+}

--
Gitblit v1.8.0