package com.dy.common.mw.protocol.p206V202404;
|
|
import com.dy.common.mw.protocol.*;
|
import com.dy.common.mw.protocol.p206V1_0_0.ProtocolConstantV206V1_0_0;
|
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{
|
super.doScanAnnotationCode(this, ProtocolConstantV206V1_0_0.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) {
|
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, CodeV202404.getCodeName(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))} ;
|
}
|
}
|
|
|
}
|