zhubaomin
2025-04-07 1a2b07f01ba4616fd9e894dddf474b56d020158c
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1/DriverV1.java
New file
@@ -0,0 +1,172 @@
package com.dy.common.mw.protocol.p206V1;
import com.dy.common.mw.protocol.*;
import com.dy.common.util.DateTime;
@AnnotationDriver(enable = true,
      name= ProtocolConstantV206V1.protocolName,
      version= ProtocolConstantV206V1.protocolVer)
public class DriverV1 extends Driver {
   private static String scanRootPackage = "com.dy.common.mw.protocol.p206V1" ;
   //在Driver中是单例,随Driver的单例对象在单线程中运行
   private ParseParamsForUpV1 upCpParams ;
   private ParseParamsForDownV1 downCpParams ;
   private Boolean reportOrResponse_trueOrFalse = null ;
   private String rtuAddrInData = null ;
   public DriverV1(){
      upCpParams = new ParseParamsForUpV1() ;
      downCpParams = new ParseParamsForDownV1() ;
   }
   /**
    * 清空自己
    */
   @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, ProtocolConstantV206V1.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 ;
      Object[] codeDataGrp = {null};
      try{
         CommonV1 cp = new CommonV1() ;
         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(ProtocolConstantV206V1.protocolName, rtuAddr, "严重错误,上行数据CRC检查失败," + crcStr, null))} ;
         }
         upCode = cp.parseCode(upBuffer, p206TrueUgFalse) ;
         if(upCode == null){
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr, "严重错误,未能从上行数据中解析出功能码!", null))} ;
         }
         Data upData = new Data() ;
         upData.setRtuAddr(rtuAddr) ;
         upData.setProtocol(ProtocolConstantV206V1.protocolName);
         upData.setProtocolVer(ProtocolConstantV206V1.protocolVer);
         upData.setCode(upCode) ;
         upData.setHex(upHex) ;
         DataV1 dV1 = new DataV1() ;
         //dV1.version = cp.parseVersion(upBuffer) ;
         dV1.rtuAddr = rtuAddr ;
         dV1.dt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
         upData.setSubData(dV1) ;
         this.upCpParams.setValue(ProtocolConstantV206V1.protocolName,
               ProtocolConstantV206V1.protocolVer,
               rtuAddr,
               upCode,
               upHex,
               upBuffer,
               upData);
         CodeParse codeParse = this.getUpCodeParser(upCode) ;
         if(codeParse == null){
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.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 = dV1.getRtuAddr() ;
                  codeDataGrp[0] = codeData ;
               }
               @Override
               public void notify(NotifyInfo ...infos) {
                  notify.notify(rtuAddr, ProtocolConstantV206V1.protocolName, ProtocolConstantV206V1.protocolVer, infos);
               }
            });
         }
      } catch (Exception e) {
         isFail = true ;
         return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr, "严重错误,分析Rtu数据出错!数据为:" + upHex + (e.getMessage() == null?"":(",出错信息:" + e.getMessage())), e))} ;
      } finally{
         if(upCode != null){
            //CRC验证失败时,upCode为null,此时不进行回调
            callback.callback(rtuAddr, upCode, CodeV1.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(ProtocolConstantV206V1.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ;
      }
      String rtuAddr = command.getRtuAddr() ;
      if(rtuAddr == null || rtuAddr.trim().equals("")){
         return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ;
      }
      try {
         String commandCode = command.getCode() ;
         this.downCpParams.setValue(
               RtuResultSendWebUrl,
               ProtocolConstantV206V1.protocolName,
               command.protocolVersion==null?ProtocolConstantV206V1.protocolVer:command.protocolVersion,
               rtuAddr,
               command.getId(),
               commandCode,
               command.getParam(),
               command.getAttachment());
         if(commandCode == null){
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr,  "严重错误,命令中功能码为空,不能构建任何命令!", null))} ;
         }else{
            CodeParse codeParse = this.getDownCodeParser(commandCode) ;
            if(codeParse == null){
               return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr,  "严重错误,未能得到下行数据功能码" + commandCode + "处理类!", null))} ;
            }else{
               return codeParse.parse(isLowPower, this.downCpParams, null);
            }
         }
      } catch (Exception e) {
         return new MidResult[]{(new MidResultError(ProtocolConstantV206V1.protocolName, rtuAddr,  "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ;
      }
   }
}