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);
|
}
|
}
|
}
|