package com.dy.common.mw.protocol.p206V2; 
 | 
  
 | 
import com.dy.common.mw.protocol.*; 
 | 
import com.dy.common.mw.protocol.p206V2.parse.TransparentDown; 
 | 
import com.dy.common.util.DateTime; 
 | 
  
 | 
@AnnotationDriver(enable = true, 
 | 
        name= ProtocolConstantV206V2.protocolName, 
 | 
        version= ProtocolConstantV206V2.protocolVer) 
 | 
public class DriverV2 extends Driver { 
 | 
     
 | 
    private static String scanRootPackage = "com.dy.common.mw.protocol.p206V2" ; 
 | 
     
 | 
    //在Driver中是单例,随Driver的单例对象在单线程中运行 
 | 
    private ParseParamsForUpV2 upCpParams ; 
 | 
    private ParseParamsForDownV2 downCpParams ; 
 | 
     
 | 
    private Boolean reportOrResponse_trueOrFalse = null ; 
 | 
    private String rtuAddrInData = null ; 
 | 
  
 | 
    public DriverV2(){ 
 | 
        upCpParams = new ParseParamsForUpV2() ; 
 | 
        downCpParams = new ParseParamsForDownV2() ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 清空自己 
 | 
     */ 
 | 
    @Override 
 | 
    public void clear() { 
 | 
        if(this.upCpParams != null){ 
 | 
            this.upCpParams.clear(); 
 | 
        } 
 | 
        if(this.downCpParams != null){ 
 | 
            this.downCpParams.clear(); 
 | 
        } 
 | 
        this.reportOrResponse_trueOrFalse = null ; 
 | 
        this.rtuAddrInData = null ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 扫描识别功能码注解类 
 | 
     */ 
 | 
    @Override 
 | 
    public void scanAnnotationCode() throws Exception{ 
 | 
        super.doScanAnnotationCode(this, ProtocolConstantV206V2.protocolName, scanRootPackage) ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解析上行数据 
 | 
     * @param isLowPower 是否在低功耗环境下运行 
 | 
     * @param rtuAddr 
 | 
     * @param upBuffer 
 | 
     * @param callback 
 | 
     * @param upHex 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public MidResult[] parseData(Boolean isLowPower, String rtuAddr, byte[] upBuffer, String upHex, DriverParserDataCallback callback, Object... params) { 
 | 
        this.clear(); 
 | 
        boolean isFail = false ; 
 | 
        String upCode = null ; 
 | 
        Short protocolVersion = null ; 
 | 
        Object[] codeDataGrp = {null}; 
 | 
        try{ 
 | 
            CommonV2 cp = new CommonV2() ; 
 | 
            Boolean p206TrueUgFalse = cp.protocolType_p206TrueUgFalse(upBuffer) ; 
 | 
            //到此处了,p206TrueUgFalse不可能为空了 
 | 
            cp.checkTail(upBuffer) ; 
 | 
            String crcStr = cp.checkCrc_str(upBuffer, p206TrueUgFalse) ; 
 | 
            if(crcStr != null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr, "严重错误,上行数据CRC检查失败," + crcStr, null))} ; 
 | 
            } 
 | 
            protocolVersion = cp.parseVersion(upBuffer) ; 
 | 
            upCode = cp.parseCode(upBuffer, p206TrueUgFalse) ; 
 | 
            if(upCode == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr, "严重错误,未能从上行数据中解析出功能码!", null))} ; 
 | 
            } 
 | 
            Data upData = new Data() ; 
 | 
            upData.setRtuAddr(rtuAddr) ; 
 | 
            upData.setProtocol(ProtocolConstantV206V2.protocolName); 
 | 
            upData.setProtocolVer(protocolVersion); 
 | 
            upData.setCode(upCode) ; 
 | 
            upData.setHex(upHex) ; 
 | 
             
 | 
             
 | 
            DataV2 dV2 = new DataV2() ; 
 | 
            dV2.rtuAddr = rtuAddr ; 
 | 
            dV2.dt = DateTime.yyyy_MM_dd_HH_mm_ss() ; 
 | 
  
 | 
            upData.setSubData(dV2) ; 
 | 
             
 | 
            this.upCpParams.setValue(ProtocolConstantV206V2.protocolName, 
 | 
                    protocolVersion, 
 | 
                    rtuAddr,  
 | 
                    upCode, 
 | 
                    upHex,  
 | 
                    upBuffer,  
 | 
                    upData); 
 | 
            CodeParse codeParse = this.getUpCodeParser(upCode) ; 
 | 
            if(codeParse == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr, "严重错误,未能得到上行数据功能码" + upCode + "处理类!", null))} ; 
 | 
            }else{ 
 | 
                return codeParse.parse(isLowPower, this.upCpParams, new CodeParseCallback(){ 
 | 
                    @Override 
 | 
                    public void callback(Boolean flag, Object codeData) { 
 | 
                        reportOrResponse_trueOrFalse = flag ; 
 | 
                        rtuAddrInData = dV2.getRtuAddr() ; 
 | 
                        codeDataGrp[0] = codeData ; 
 | 
                    } 
 | 
                    @Override 
 | 
                    public void notify(NotifyInfo ...infos) { 
 | 
                        notify.notify(rtuAddr, ProtocolConstantV206V2.protocolName, ProtocolConstantV206V2.protocolVer, infos); 
 | 
                    } 
 | 
                }); 
 | 
            } 
 | 
                 
 | 
        } catch (Exception e) { 
 | 
            isFail = true ; 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr, "严重错误,分析Rtu数据出错!数据为:" + upHex + (e.getMessage() == null?"":(",出错信息:" + e.getMessage())), e))} ; 
 | 
        } finally{ 
 | 
            callback.callback(rtuAddr, upCode, CodeV2.getCodeName(upCode), upHex, reportOrResponse_trueOrFalse, isFail, rtuAddr, codeDataGrp[0]); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 构造下行数据(命令) 
 | 
     * @param isLowPower 是否在低功耗环境下运行 
 | 
     * @param command 命令 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public MidResult[] createCommand(Boolean isLowPower, Command command, Object... params) { 
 | 
        this.clear(); 
 | 
        String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ; 
 | 
        if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){ 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ; 
 | 
        } 
 | 
        String rtuAddr = command.getRtuAddr() ; 
 | 
        if(rtuAddr == null || rtuAddr.trim().equals("")){ 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; 
 | 
        } 
 | 
        try { 
 | 
            String commandCode = command.getCode() ; 
 | 
             
 | 
            this.downCpParams.setValue( 
 | 
                    RtuResultSendWebUrl, 
 | 
                    ProtocolConstantV206V2.protocolName, 
 | 
                    command.protocolVersion==null?ProtocolConstantV206V2.protocolVer:command.protocolVersion , 
 | 
                    rtuAddr,  
 | 
                    command.getId(), 
 | 
                    commandCode,  
 | 
                    command.getParam(),  
 | 
                    command.getAttachment()); 
 | 
             
 | 
            if(commandCode == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr,  "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; 
 | 
            }else{ 
 | 
                CodeParse codeParse = this.getDownCodeParser(commandCode) ; 
 | 
                if(codeParse == null){ 
 | 
                    return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr,  "严重错误,未能得到下行数据功能码" + commandCode + "处理类!", null))} ; 
 | 
                }else{ 
 | 
                    return codeParse.parse(isLowPower, this.downCpParams, null); 
 | 
                } 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr,  "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 构造下行透传数据(命令) 
 | 
     * @param isLowPower 是否在低功耗环境下运行 
 | 
     * @param command 命令 
 | 
     * @return MidResult[] 
 | 
     */ 
 | 
    @Override 
 | 
    public MidResult[] transparentCommand(Boolean isLowPower, Command command, Object... params){ 
 | 
        this.clear(); 
 | 
        String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ; 
 | 
        if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){ 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ; 
 | 
        } 
 | 
        String rtuAddr = command.getRtuAddr() ; 
 | 
        if(rtuAddr == null || rtuAddr.trim().equals("")){ 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; 
 | 
        } 
 | 
        try { 
 | 
            String commandCode = command.getCode() ; 
 | 
  
 | 
            this.downCpParams.setValue( 
 | 
                    RtuResultSendWebUrl, 
 | 
                    ProtocolConstantV206V2.protocolName, 
 | 
                    command.protocolVersion==null?ProtocolConstantV206V2.protocolVer:command.protocolVersion, 
 | 
                    rtuAddr, 
 | 
                    command.getId(), 
 | 
                    commandCode, 
 | 
                    command.getParam(), 
 | 
                    command.getAttachment()); 
 | 
  
 | 
            if(commandCode == null){ 
 | 
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr,  "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; 
 | 
            }else{ 
 | 
                return new TransparentDown().parse(isLowPower, this.downCpParams, null); 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V2.protocolName, rtuAddr,  "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |