New file |
| | |
| | | package com.dy.rtuMw.server.forTcp; |
| | | |
| | | import com.dy.rtuMw.server.rtuData.RtuComResultCache; |
| | | import com.dy.rtuMw.server.rtuData.RtuComResultNode; |
| | | import com.dy.rtuMw.server.rtuData.RtuDataNode; |
| | | import com.dy.rtuMw.server.rtuData.RtuDataCache; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | import com.dy.common.mw.protocol.MidResult; |
| | | import com.dy.common.mw.protocol.MidResultAction; |
| | | import com.dy.common.mw.protocol.MidResultFromRtu; |
| | | import com.dy.common.mw.protocol.MidResultToRtu; |
| | | |
| | | public class MidResultActionFromRtu implements MidResultAction { |
| | | |
| | | private static Logger log = LogManager.getLogger(MidResultActionFromRtu.class) ; |
| | | |
| | | @Override |
| | | public void doAction(MidResult result) { |
| | | if(result != null && result instanceof MidResultFromRtu){ |
| | | //如果此处需要更多的逻辑处理,可以生成一个任务类(实现CoreTask)对象进行处理 |
| | | //当前,处理直接进行 |
| | | MidResultFromRtu resFromRtu = (MidResultFromRtu)result ; |
| | | if(!resFromRtu.reportOrResponse_trueOrFalse){ |
| | | //命令应答 |
| | | //此处实现,与以前不一样, |
| | | //以前实现:匹配命令是从后向前匹配, |
| | | //当前实现,匹配命令是从前向后匹配,原因:举例,当批量下发补召命令,如果从后匹配,则前面命令会下发多次,即一个上报次数据会补召多次 |
| | | MidResultToRtu resToRtu = TcpDownCommandCache.matchFromHead(resFromRtu) ; |
| | | if(resToRtu != null){ |
| | | //匹配到下发的命令 |
| | | resFromRtu.matchedCommand(resToRtu.commandId, resToRtu.rtuResultSendWebUrl) ; |
| | | this.nextDealRtuData(false, resFromRtu); |
| | | this.nextDealRtuComResult(resFromRtu); |
| | | }else{ |
| | | log.error("匹配命令失败,功能码是:" + ((MidResultFromRtu) result).upCode ); |
| | | this.nextDealRtuData(false, resFromRtu); |
| | | //未匹配到下发的命令,命令在缓存因超时被清除了 |
| | | RtuStatusDealer.commandFail2Success(resFromRtu.rtuAddr) ; |
| | | } |
| | | }else{ |
| | | //主动上报数据 |
| | | this.nextDealRtuData(true, resFromRtu); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 进入多线程环境中运行 |
| | | * @param reportOrResponse_trueOrFalse |
| | | * @param resFromRtu |
| | | */ |
| | | private void nextDealRtuData(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){ |
| | | try{ |
| | | RtuDataCache.cacheRtuUpData(reportOrResponse_trueOrFalse, new RtuDataNode(resFromRtu.data)); |
| | | }catch(Exception e){ |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 进入单线程环境中运行 |
| | | * @param resFromRtu |
| | | */ |
| | | private void nextDealRtuComResult(MidResultFromRtu resFromRtu){ |
| | | try{ |
| | | RtuComResultCache.cacheRtuComResult(new RtuComResultNode(resFromRtu.data)); |
| | | }catch(Exception e){ |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |