| package com.dy.common.mw.protocol.p206V202404; | 
|   | 
| import com.dy.common.mw.protocol.*; | 
| import com.dy.common.util.DateTime; | 
|   | 
| import java.net.URI; | 
| import java.net.URL; | 
|   | 
| @AnnotationDriver(name= ProtocolConstantV206V202404.protocolName) | 
| public class DriverV202404 extends Driver { | 
|      | 
|     private static String scanRootPackage = "com.dy.common.mw.protocol.p206V202404." ; | 
|      | 
|     //在Driver中是单例,随Driver的单例对象在单线程中运行 | 
|     private ParseParamsForUpV202404 upCpParams ; | 
|     private ParseParamsForDownV202404 downCpParams ; | 
|      | 
|     private Boolean reportOrResponse_trueOrFalse = null ; | 
|     private String rtuAddrInData = null ; | 
|   | 
|     public DriverV202404(){ | 
|         upCpParams = new ParseParamsForUpV202404() ; | 
|         downCpParams = new ParseParamsForDownV202404() ; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 扫描识别功能码注解类 | 
|      */ | 
|     @Override | 
|     public void scanAnnotationCode() throws Exception{ | 
|         if(!scanRootPackage.endsWith(".")){ | 
|             scanRootPackage += "." ; | 
|         } | 
|         URL url = this.getClass().getResource("/" + scanRootPackage.replace('.', '/')); | 
|         URI uri = new URI(url.toString());   | 
|         super.doScanAnnotationCode(this, ProtocolConstantV206V202404.protocolName, uri, 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) { | 
|         reportOrResponse_trueOrFalse = null ; | 
|         boolean isFail = false ; | 
|         String upCode = null ; | 
|         try{ | 
|             CommonV202404 cp = new CommonV202404() ; | 
|             cp.checkHead(upBuffer) ; | 
|             cp.checkTail(upBuffer) ; | 
|             String crcStr = cp.checkCrc_str(upBuffer) ; | 
|             if(crcStr != null){ | 
|                 return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,上行数据CRC检查失败," + crcStr, null))} ; | 
|             } | 
|             rtuAddr = cp.parseRtuAddr(upBuffer) ; | 
|             upCode = cp.parseCode(upBuffer) ; | 
|             if(upCode == null){ | 
|                 return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,未能从上行数据中解析出功能码!", null))} ; | 
|             } | 
|             //Integer dataLen = cp.parseFrameLen(upBuffer) ; | 
|             Data upData = new Data() ; | 
|             upData.setRtuAddr(rtuAddr) ; | 
|             upData.setProtocol(ProtocolConstantV206V202404.protocolName); | 
|             upData.setCode(upCode) ; | 
|             upData.setHex(upHex) ; | 
|              | 
|              | 
|             DataV202404 dV1_0_1 = new DataV202404() ; | 
|             //dV1_0_1.version = cp.parseVersion(upBuffer) ; | 
|             dV1_0_1.rtuAddr = rtuAddr ; | 
|             dV1_0_1.dt = DateTime.yyyy_MM_dd_HH_mm_ss() ; | 
|              | 
|             upData.setSubData(dV1_0_1) ; | 
|              | 
|             this.upCpParams.clear(); | 
|             this.upCpParams.setValue(ProtocolConstantV206V202404.protocolName,  | 
|                     rtuAddr,  | 
|                     upCode, | 
|                     upHex,  | 
|                     upBuffer,  | 
|                     upData); | 
|             CodeParse codeParse = this.getUpCodeParser(upCode) ; | 
|             if(codeParse == null){ | 
|                 return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,未能得到上行数据功能码" + upCode + "处理类!", null))} ; | 
|             }else{ | 
|                 return codeParse.parse(isLowPower, this.upCpParams, new CodeParseCallback(){ | 
|                     @Override | 
|                     public void callback(Boolean flag) { | 
|                         reportOrResponse_trueOrFalse = flag ; | 
|                         rtuAddrInData = dV1_0_1.getRtuAddr() ; | 
|                     } | 
|                 }); | 
|             } | 
|                  | 
|         } catch (Exception e) { | 
|             isFail = true ; | 
|             return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,分析Rtu数据出错!数据为:" + upHex + (e.getMessage() == null?"":(",出错信息:" + e.getMessage())), e))} ; | 
|         } finally{ | 
|             callback.callback(rtuAddr, upCode, upHex, reportOrResponse_trueOrFalse, isFail, rtuAddrInData); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 构造下行数据(命令) | 
|      * @param isLowPower 是否在低功耗环境下运行 | 
|      * @param command 命令 | 
|      * @return | 
|      */ | 
|     @Override | 
|     public MidResult[] createCommand(Boolean isLowPower, Command command, Object... params) { | 
|         String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ; | 
|         if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){ | 
|             return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ; | 
|         } | 
|         String rtuAddr = command.getRtuAddr() ; | 
|         if(rtuAddr == null || rtuAddr.trim().equals("")){ | 
|             return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ; | 
|         } | 
|         try { | 
|             String commandCode = command.getCode() ; | 
|              | 
|             this.downCpParams.clear(); | 
|             this.downCpParams.setValue( | 
|                     RtuResultSendWebUrl, | 
|                     ProtocolConstantV206V202404.protocolName,  | 
|                     rtuAddr,  | 
|                     command.getId(), | 
|                     commandCode,  | 
|                     command.getParam(),  | 
|                     command.getAttachment()); | 
|              | 
|             if(commandCode == null){ | 
|                 return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr,  "严重错误,命令中功能码为空,不能构建任何命令!", null))} ; | 
|             }else{ | 
|                 CodeParse codeParse = this.getDownCodeParser(commandCode) ; | 
|                 if(codeParse == null){ | 
|                     return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr,  "严重错误,未能得到下行数据功能码" + commandCode + "处理类!", null))} ; | 
|                 }else{ | 
|                     return codeParse.parse(isLowPower, this.downCpParams, null); | 
|                 } | 
|             } | 
|         } catch (Exception e) { | 
|             return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr,  "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ; | 
|         } | 
|     } | 
|   | 
|   | 
| } |