package com.dy.rtuMw.server.forTcp;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import com.dy.common.queue.NodeObj;
|
import com.dy.common.mw.protocol.MidResultToRtu;
|
import com.dy.rtuMw.server.ServerProperties;
|
|
public class TcpDownCommandObj implements NodeObj{
|
|
private static Logger log = LogManager.getLogger(TcpDownCommandObj.class.getName());
|
|
public MidResultToRtu result ;//下行命令
|
public Long cachTime ;//缓存时刻
|
public Long lastSendStamp ;//上次发送时刻
|
public byte sendedTimes ;//已经发送次数
|
public boolean onceReceivedResult ;//已经收到命令应答
|
|
public TcpDownCommandObj(MidResultToRtu result){
|
this.result = result ;
|
this.cachTime = System.currentTimeMillis() ;
|
this.lastSendStamp = 0L ;
|
this.sendedTimes = 0 ;
|
this.onceReceivedResult = false ;
|
}
|
|
/**
|
* 自己处理自己
|
* @param now
|
* @return
|
*/
|
public boolean dealSelf(Long now){
|
boolean removeNodeFromCach = false ;
|
if(this.onceReceivedResult){
|
//已经收到命令结果
|
removeNodeFromCach = true ;
|
//记录状态
|
RtuStatusDealer.commandSuccess(this.result.rtuAddr);
|
return removeNodeFromCach ;
|
}
|
if(this.sendedTimes >= this.result.maxSendTimes){
|
//发送次数达到最大值
|
if(now - this.lastSendStamp >= ServerProperties.cachWaitResultTimeout){
|
//超时
|
removeNodeFromCach = true ;
|
//记录状态
|
RtuStatusDealer.commandFailure(this.result.rtuAddr);
|
}
|
return removeNodeFromCach ;
|
}
|
|
TcpSession tcpSe = TcpSessionCache.getTcpSession(this.result.rtuAddr) ;
|
Boolean flag = TcpSessionCache.isConnect(this.result.rtuAddr) ;
|
if(tcpSe == null || flag == null || !flag.booleanValue()){
|
//未曾上线或不在线
|
if(!this.result.isCachForOffLine){
|
//不在线命令不缓存
|
removeNodeFromCach = true ;
|
}else{
|
//不在线命令缓存
|
if(now - this.cachTime >= ServerProperties.offLineCachTimeout){
|
//缓存超时
|
removeNodeFromCach = true ;
|
}
|
}
|
return removeNodeFromCach ;
|
}
|
|
if(tcpSe.lastUpDataTime != null){
|
//说明上行数据时刻有效,即此时离上行数据时刻太近,还不能下行数据,延迟一下
|
return false ;
|
}
|
|
Long lastSendStamp = tcpSe.lastDownComTime ;
|
if(this.result.isQuickSend || lastSendStamp == null || (now - lastSendStamp >= ServerProperties.commandSendInterval)){
|
//未收到命令结果,未达到最大发送次数,RTU在线,速发命令或超过命令下发间隔,以上满足发送命令条件,执行发送命令
|
tcpSe.ioSession.write(this.result.downBuffer) ;
|
tcpSe.lastDownComTime = now ;
|
if(!this.result.hasResponse){
|
//无应答
|
removeNodeFromCach = true ;
|
}
|
|
this.sendedTimes++ ;
|
this.lastSendStamp = now ;
|
|
//记录日志
|
RtuLogDealer.log(this.result.rtuAddr, "下行数据 " + this.result.downCode + ":" + this.result.downBufHex);
|
//记录状态
|
RtuStatusDealer.downData(this.result.rtuAddr, this.result.downBuffer.length);
|
|
log.info("下行RTU(地址=" + this.result.rtuAddr + ")命令(功能码=" + this.result.downCode + ") " + this.result.downBufHex ) ;
|
}
|
|
return removeNodeFromCach ;
|
}
|
}
|