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