1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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{
                    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);
        }
    }
}